Hiltmon

On walkabout in life and technology

Using Twitter ADN and #xpost

I think I have finally figured out how I want to use App.Net and Twitter . Given my low follower counts on both, and the different follower groups I have on each, I should get away with it.

TL;DR: Follow me on both, no more cross-posting anything except blog post announcements, mute #xpost on one service to prevent duplicates. (Really? A TL;DR here! For an article this short? Where the “Too Long; Don’t Read” is about the same length as the post. Yes Really!)

I intend to use Twitter @hiltmon as I do now, for notifying people of posts on this site as well as for personal updates, Instagrams, jokes, scotch and any responses to messages. The persona on Twitter is this guy, me, with a tech blog, this. Twitter presents my intellectual brilliance in 140 characters, and more often than not, pie-in-face moments.

On App.Net, I intend to use ADN @hiltmon for more meaningful discussions, more in-depth technical talk, more hop-on posts (which may annoy others already in that discussion) and leave the personal stuff and silly jokes aside. The only cross-posts will be blog announcements, in the hope that they start these more meaningful discussions.

If you follow me on both (and you should), mute the #xpost hashtag on one of them, you’ll get all the messages, but only once. No duplicates.

Either way, I plan to remain me, polite, courteous, curious, stubborn, socially awkward in a crowd, with a splash of humor and irreverence on both. It is who I am, I cannot be otherwise.

Oh, and if you follow me on @NoverseLLC (my company Twitter account), switch to @hiltmon. I rarely post on it any more and am considering replacing the company web with a static site and merging the blogs (which means you may see a few more business-like posts here).

So announcing the biggest change in hiltmon.com since, well, the last blog post. The new follow message at the bottom (Delta: s/or/and/i + “Mute #xpost on one.”):

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Gist TextMate Bundle and Command Line

I was having a conversation on Twitter with Shawn Hansen (@geekles) this weekend and he mentioned that Sublime Text 2 has a great plugin for Github Gists, and TextMate 2 was missing this awesomeness.

Not anymore (the Oscars were on).

Announcing the first release of my TextMate 2 bundle and a separate command line tool for retrieving, creating and updating GitHub Gists.

The main difference between this and other implementations is that this one caches gist mappings (gist id to file names in ~/.gists) so you don’t have to remember them (and because TextMate 2 has no way to save user attributes on opened files). This implementation also leaves the gist URL on the clipboard for OS X users (which makes it quicker to blog with gists).

With these tools you can:

  • Download and edit any public gists from within TextMate 2 or the command line (and since they both use the same code-base, they can be interchanged).
  • List up to 100 (API limit) of your own gists and pick which to download and edit.
  • Update gists with a keystroke in TextMate or from the command line without knowing the file’s gist ID.
  • Easily create new public and private gists of files you have and paste their URLs where needed.
  • View the gist and its comments on the web

This first version of the tools does support downloading multi-file gists, but updates and creates apply only to single files at this stage.

Follow the instructions on each to install them, and don’t forget to set up the authentication as described in their README files before use.

Get the TextMate Gist.tmbundle on GitHub.

Get the Command line Gist on GitHub.

I would love to hear how you use these, what additional features you’d like to see in them, and feel free to fork and contribute to them as well.

This is at best beta level software and has been tested and run on one and only one machine (mine) with the current alpha version of TextMate 2! You takes your chances by installing and using it.

Enjoy.

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.

Multiple Themes in TextMate 2

One thing I like to do is to have different themes for different file types in my text editor. That way, at a glance, I can guess what kind of file a text-filled window contains, especially when zoomed out using Mission Control. I’ve been using Custom Language Preferences in BBEdit preferences to set up the color scheme for each file type there, and I have set up Multiple Themes in Sublime Text 2 previously.

But how to do this in TextMate 2?

Turns out, not so easy yet. But I have it working now:

Since TextMate 2 does not yet support multiple themes by file type, you can still create a single theme that has multiple presentations using TextMate 2’s brilliant scope selectors. In my case, I use a variant of Ryan Bates' lovely RailsCasts theme for coding and a modified light theme for Markdown and text files.

You can download my CombinedCasts.tmTheme here. Double-click to install.

But creating a theme for TextMate 2 (or Sublime Text 2) is hard. You see, the theme file is actually a .plist file which is a large and complex XML file. I don’t know about you, but I find them hard to navigate and edit.

So I got my geek on today and created https://github.com/hiltmon/textmate-theme-csv, a TextMate 2 bundle and some scripts to enable me to use a simple CSV file format to create and iterate on a theme from within TextMate 2. With the included ThemeCSV bundle installed in your version of TextMate 2, you can easily create and iterate over theme design. Then again, I suspect I’m the only one who will ever use this.

After installing the bundle, get started by creating a .tmcsv file in TextMate (or start with the provided BlankTheme.tmcsv), and start editing. A tmcsv file looks something like this:

1
2
3
4
5
6
7
8
9
10
11
12
// Type, author, name, semanticClass, uuid
Header, Hilton Lipschitz, CombinedCasts, theme.combinedcasts, 570BB45C-486D-44A6-8683-CFE4F63CE651
// Type, background, foreground, caret, selection, invisibles, lineHighlight
Main, #232323, #E6E1DC, #888888, #5A647EE0, #404040, #333435
// Type, name, background, foreground, fontStyle (bold, italic, underline), scopes (comma separated)
Scope, Comment, nil, #BC9458, italic, comment
Scope, String, nil, #9AB253, nil, string
Scope, Number, nil, #9AB253, nil, constant.numeric
Scope, Built-in constant, nil, #6E9CBE, nil, constant.language
Scope, User-defined constant, nil, #6E9CBE, nil, constant.character, constant.other
Scope, Variable, nil, #D0D0FF, nil, variable.language, variable.other
...

It is a simple, fixed format CSV-like file that has only three line types, a Header line that establishes the bundle, a Main line that sets the default colors and Scope lines where you can change the color based on TextMate 2’s comprehensive scoping rules (see Scope Selectors in the TextMate manual). Oh, and you can comment out lines too.

Hit ⌘R to generate the TextMate theme. The first time it runs, the bundle creates a new bundle for the theme and generates the theme file. You need to then select your new theme from the View / Themes menu. After that, make changes to the tmcsv file, hit ⌘R to generate, and flip tabs to see the new theme in action as it evolves.

I have also included scripts to generate stand-alone tmTheme files from tmcsv files as well as a script to parse existing themes into this simple format to help you get ideas for scopes to use. See the README file at https://github.com/hiltmon/textmate-theme-csv for more details on installation and usage.

Note: This approach is a workaround. Allan Odgaard has confirmed that they are going to refactor TextMate 2 to enable people to set different themes in .tm_properties files for different file types. Until then, the multi-scope hack still works.

This is at best beta level software and has been tested and run on one and only one machine (mine) with the current alpha version of TextMate 2! You takes your chances by installing and using it.

Enjoy.

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.

Glui - a Better Skitch

Ever since Evernote purchased and then ruined Skitch (See my Bye bye Skitch, Hello LittleSnapper post), I’ve been looking for a replacement product. A lightweight snap, annotate and save to PNG or share the image app. And I think Glui may be it.

I just wanted an app that just does the following like the original Skitch betas:

  • Snap
  • Quick Annotate
  • Save as image, or
  • Share the image
  • Go away

Glui, by Sebastian Razola (@razola), does exactly that. It sits in the menu bar, offers keyboard shortcuts for crosshair, window or fullscreen snaps, offers an arrow, box and text annotation in one color (red), with drag to desktop or share on Dropbox. Lovely!

In comparison, I’ve tried, and still use:

  • LittleSnapper (now Ember), but it is better as an image archive and search tool. And it takes two steps to drag an image out for use in the blog.
  • Napkin, which creates amazing callouts and I use that for heavy duty annotations. But it hangs around wanting to save its document.
  • Clarify, but that is better for multi-image, document preparation. Way too heavy duty.

But for quick image capture, annotate and share, I’ll be using Glui.

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.

CriticMarkup Bundle for TextMate 2

Update: Christian Tietze (@DivineDominion) has created a bundle that’s included in the official toolkit, so I contributed my bundle’s commands to that, and will be using and contributing to that one from now on. Get the full toolkit at CriticMarkup-toolkit or just the TextMate bundle at criticmarkup.tmbundle. I’ve already taken my repo down to prevent confusion.

Recently, @macdrifter and @themindfulbit announced CriticMarkup, a way for authors and editors to track changes to documents in plain text. I created a TextMate 2 bundle to add this markup to my favorite text editor for Markdown files.

Currently, the bundle implements the usual Markdown functionality, plus the five CriticMarkup tags:

  • Addition {++ ++} (⇧⌘A)
  • Deletion {-- --} (⇧⌘D)
  • Substitution {~~ ~> ~~}(⇧⌘S)
  • Comment {>> <<} (⇧⌘/)
  • Highlight {== ==}{>> <<} (⇧⌘H) (Bundle updated 2013-02-15, did not update the video)

It also contains the Critic theme used in the demo.

You can download and install the bundle from https://github.com/hiltmon/Critic-Markup.tmbundle. Let me know what you think via GitHub or Twitter.

This is at best beta-level software (my first public bundle) and has been tested and run on one and only one machine, mine with one version of TextMate, TM2! You takes your chances by installing it.

Enjoy.

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.

Common Misconceptions About the App Store

Over the past few days, new and old friends have been popping up to mention they purchased TimeToCall and were surprised that I did not know that they had done so.

It turns out that this is but one of several misconceptions about the Apple App Store. So let me clarify some for you:

TL;DR

  • No access to buyer’s information
  • No access to reviews
  • No Trials and Upgrades

We do not get buyers information from the Apple

When you purchase an app from the App Store, Apple handles all the licensing, payment and download for us. All we get to know from Apple is that

  • a unit was sold
  • on what date
  • from which store, and
  • what our share will be when Apple finally pays us

Nothing else. No data on who purchased, or for what device, or how it was paid for, nothing else.

This does not mean that apps themselves cannot collect data from users, many do. Just that Apple does not give us this data. For your information, Section 17 of the Apple App Store rules are quite strict on user data collection:

17. Privacy
17.1 Apps cannot transmit data about a user without obtaining the user's prior permission and providing the user with access to information about how and where the data will be used
17.2 Apps that require users to share personal information, such as email address and date of birth, in order to function will be rejected
17.3 Apps that target minors for data collection will be rejected

So, you, the user, can feel secure that unless the app asks for it, the developer gets no information about you.

From what I can tell, Google does give out this information from its store (see Massive Google Play Privacy Issue). I don’t know about Amazon or others.

We cannot change or respond to reviews

App store developers get to see the same reviews you do, as and when you get to see them. Products like AppViz 2 allow us to download and read them from all stores. But that’s it. Read Only. We cannot moderate, block, edit or do anything about reviews at all.

We cannot even respond to reviews with our own reviews.

So the only way for us to make bad reviews go away is … there is no way to make bad reviews go away. We can hide them by releasing a new version and hope app store browsers do not click on the All Versions button.

Or really, we can fix the issues and make better software. And then get better reviews that appear ahead of the old, bad ones.

Which also means that reviews that point out bugs, or contain feature requests are useless to us developers. First, we work off our support lines, and since these bugs and requests do not get posted to us, we don’t see them. Secondly, we have no way to get in touch with the reviewer to provide them with the wonderful support we offer because the Apple App Store does not give us information on our reviewers either. And thirdly, we don’t monitor reviews because it’s hard to do so, and sometimes soul-wrenching to see bad reviews that we can do nothing about.

We cannot do trials or upgrade pricing

The Apple App Store does not have features to enable trial versions of apps, or cheaper upgrade versions for apps. Since those features aren’t there, we cannot offer them.

Of course, we want them.

For trial versions, the best we can do is offer a limited version of the app and In-App purchases to unlock the rest. But that really does not work for 99c apps (although some developers do actually do this). I could theoretically sell TimeToCall for free but only allow one Time to Call unless you unlock it for 99c, but since most of my users only need one Time to Call, and there is no time-out, that is bad business.

For upgrades, nothing. The bigger, more established developers with large user bases tend to offer their upgraded products as new products, so they can earn some upgrade dollars, and offer these at reduced prices for a few weeks after launch. Which means that all customers actually get the cheaper upgrade price instead of paying the full price. Some developers just forego upgrade revenue, and release their major updates free.

Economically speaking, developers really need upgrade pricing as the initial sale price barely covers the cost of creating and supporting version 1 and they need more income to make version 2 viable.

Current State

So, unless Apple changes the store, we have no buyer information, no access to reviews, no trials, and no upgrades. If you buy TimeToCall, I’ll never know it was you (but feel free to tweet me when you do).

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.

TimeToCall - After One Week

TimeToCall is a simple, universal iOS application I developed to help people choose the best time to call when calling internationally. This is a follow-on to a 10 part (and growing) series I wrote about the thinking and work done. My goal is to share just how much effort it really does take to craft an iPhone app and ship it. I hope this series helps you to understand why it costs so much and takes so long to create beautiful software. Start at part 1 first.

Unlike other products and other developers, I intend to report the sales numbers, some reviews and support data for TimeToCall. It is, after all, a hobby project to write about, even though this is the kind of thing I do for a living.

Sales & Revenue

| Day 1 | Day 2 | Day 3 | Day 4 | Day 5 | Day 6 | Day 7 | Total :—— | :—: | :—: | :—-: | :—-: | :—: | :—: | :—: | —–: Sales | 6 | 5 | 59 | 55 | 13 | 4 | 3 | 145 Revenue | $4.17 | $3.49 | $41.71 | $39.06 | $9.28 | $2.86 | $2.16 | $102.74

Day 1 and 2 sales were family and friends, mostly via my Facebook Page (you know you want to ‘like’ it) and Twitter. Not surprising as no-one else knew about it then.

On Day 3, I sent out a six fumbling emails to some of my favorite tech bloggers to see if any of them would try the product out and read the series I wrote (and hoping they would write about it). Two responded via email. Honestly, I did not expect any responses, these folks get bombarded with emails from people saying “Try my Product” and “Here is a Promo” and “Could You…” type messages. They have better things to do than to respond to all of these messages. And I sure am not famous.

And then Brett Terpstra, one of the six, published the wonderful An iOS development saga: TimeToCall. Within minutes, traffic on my site started to rise and 20 of the sales on Day 3 can be attributed to his article. Thank you Brett.

Later on Day 3, Gonny van der Zwaag (@gonny) published TimeToCall: hoe een iPhone tijdzone-app tot stand kwam in iPhoneclub.nl I do not know how Gonny found out about the product, but we had a lovely Twitter conversation later. As a result of this post, 24 sales in the Benelux region. Thank you Gonny.

On Day 4, traffic continued to come in from Brett and Gonny’s posts, leading to 30 sales in the Benelux area and 7 in the US.

Day’s 5, 6 and 7 sales tapered off as no new news and reporting came out.

I’m very satisfied with the first week’s sales, considering the only marketing so far is this site’s readers and the two wonderful posts by two wonderful people.

App Store Reviews

You can all take a look at the reviews on the App Store, there have been five so far. Full disclosure, the two five star reviews are friends and family. And the remainder seem to be some kind of support requests. I’ll write about this later, but we developers cannot respond to reviews on the App Store.

What impressed me was that one reviewer wrote two large reviews, a lot of words. What would be amazing is to engage this person in conversation, they have some ideas I like for the product, and I’d like to understand them better. But the anonymity of the App Store also means I have no idea who this person is or how to engage with them.

If you have feature ideas, don’t be afraid to email our support addresses, we indies love the contact (The support inbox is actually our inbox redirected to FogBugz or Lighthouse, not some support department; we just created the address because it makes us look professional and helps us track messages, but I digress).

Support Emails

On the support line, I have received a couple of emails with some feedback and feature requests. I responded to each (one should always respond to support emails) and will most likely implement at least one of them in the next release of TimeToCall.

And two bugs.

Ouch.

But thanks for finding them folks. Even the simplest of apps is not perfect. For the record, the bugs are that the green plus next to ‘Tap to Add a new Place’ actually does not respond to a tap, oops. And if you reset the home location on the initially created Time to Call before the GPS has kicked in, it sets the time as per New York, not local.

I also received a reasonable number of emails from folks offering to promote my product and increase its ranking. I did not respond to any of them (oops, there goes the respond to support emails rule). Maybe one day I’ll hit one up as an experiment to see if it works, but right now, paying for rankings or pushing their links on my site does not cut it. I’d rather my writing, limited network and own marketing took care of sales.

After One Week

So, after one week on the App Store, TimeToCall has sold 145 units for a pre-tax revenue of $102.74 (I’m using to AppViz 2). That is a lot more sales than I expected given the lack of promotion (except for this site) and it’s mostly due to the Brett and Gonny’s writing.

Thank You. Guess what I did with the profits.

For those of you wonderfully anal readers who added up the numbers in the data table above and came out 1 penny short, remember, not all sales are in US dollars, so there is some rounding going on.

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.

Make iTerm 2 More Mac-like

I just switched from using Apple’s built-in Terminal.app to the free iTerm 2 on a recommendation from Brett Terpstra. I’m already loving the hot-key profiles to launch uniquely colored remote sessions, the split panes, and the brilliant hotkey window (useful to run a single command and get rid of it).

But there are a few things that needed some work. Some of the usual Mac editing keys did not work, I got rid of a few annoyances and added a few lovely preferences, and I needed the ability to create a new terminal window on the current space as part of my being productive with virtual desktops flow (Just like Browser Windows on All Desktops).

Mac-like keys

Since I’m not a vi or emacs pianist, I prefer standard Apple Cocoa Text bindings when editing the command line, so I set them up in iTerm 2’s Global Shortcut Keys in Preferences / Keys.

The changes and settings are:

  • ⌥←: Go left one word (Send Escape Sequence | b)
  • ⌥→: Go right one word (Send Escape Sequence | f)
  • ⌘←: Go to start of line (Send Hex Code | 0x01)
  • ⌘→: Go to end of line (Send Hex Code | 0x05)
  • ⇧⌘↑: Up one page
  • ⇧⌘↓: Down one page
  • ⌃⌘↓: Down to bottom (not standard Cocoa, but I find it very useful when perusing real time rails logs)

Thanks to Brett Terpstra for sharing some of these in his Option-arrow navigation in iTerm2 and Twitter. Note: I do not set the Left Option and Right Option keys in profiles to +ESC, I leave them as Normal (as per Scott Lee’s response in the comments).

Annoyances and Preferences

I don’t need to confirm quitting (Preferences / General):

I love copy on select, it’s one less keystroke and I usually select with the mouse (Preferences / General):

The red tabs were annoying, gone (Preferences / Appearance):

Added the border around frames, I like this because my terminal background and screen backgrounds are both dark (Preferences / Appearance):

And got rid of the bell icon and Growl notifications in all profiles (Preferences / Profiles / ** / Terminal):

And lowered the line spacing to match Apple’s (Preferences / Profiles / ** / Text / Change Font) - just move the vertical back 1 notch:

New iTerm 2 in Current Space

While it’s nice to have the hotkey window, I often find myself working on Desktop 1 (Work) and need to jump to Desktop 2 (Alternate) to do some other stuff and leave a terminal running there. Like now, for example, I have a database migration running on Desktop 1 for Kifu and am blogging on Desktop 2, both of which require running iTerm 2 windows.

If you hit ‘⌘N’ on iTerm 2 (or any other OS X app), OS X switches you to the app’s desktop, then creates a new window over there, not what I want. If you right-click on the dock and request a new window, it creates it on the current desktop. But I leave my dock hidden.

I used to have ⌃⌘T mapped to do this for Terminal.app, so I created a Keyboard Maestro macro to do this for iTerm 2 instead:

The first step, the AppleScript code, launches a new “Default” terminal, and it does so on the current space:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tell application "System Events"
    set mycount to count (every process whose name is "iTerm")
end tell

tell application "iTerm"
    -- Nuke the default new terminal on first launch
    -- And ignore other terminals otherwise
    if mycount = 0 then
        activate
        terminate the first session of the first terminal
    end if

    tell (make new terminal)
        launch session "Default"
    end tell
    activate
end tell

The second step resizes the window so that it is 100 x 42 lines, my personally preferred terminal window size.

So far, I am really enjoying the small touches that make iTerm 2 that much better than Terminal.app.

Related Reading: Fast SSH Windows With iTerm 2

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.

Download Dreamhost Server Logs

This site is hosted on Dreamhost, and I could not be happier with them. But some time ago, the engineers there decided to disable FTP access to the server logs. No reason given.

If you have a Dreamhost shared account, try it. ftp into your server using your favorite FTP client, click the logs folder, then your site folder, then http and you’ll get an error. This is because the http folder is actually a symlink to a private, readonly folder on the server that is inaccessible to FTP. If you ssh in, you can cd to this folder and see the logs because the shell can traverse this symlink.

To download your logs, just use the scp command locally in your terminal as follows:

1
scp <user>@<domain>:/home/<user>/logs/<domain>/http/* <local-path>

Where

  • <user> is your Dreamhost shell user name
  • <domain> is your hosting domain name, and
  • <local-path> is where you want to dump the files

Note that I have no password in the command as I have set up ssh keys.

I use:

1
scp hiltmon@hiltmon.com:/home/hiltmon/logs/hiltmon.com/http/* ~/Projects/HiltmonDotCom/data/logs/

This command downloads all my logs into the correct place in my standard project folders. Note that Dreamhost only keeps about five (5) days of logs, so do this every few days to get it all.

Lovely!

Geek Aside: I rarely use this, I get all my stats from Google Analytics, but do occasionally check the errors.log file which is how I found that I was missing the web clip icons.

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.

Add Web Clip Icons to Octopress

The default Octopress setup includes a favicon.png which enables you to place your own tiny icon to the left of the URL in most browsers. You should see a small blue cog there now.

Both Apple and Android phones also support saving a link to a site (called a web clip) on your phone as an icon. Over the past few days, it seems quite a few viewers of this site have added it as a web clip, but I had not provided good iconage.

Here’s how to add a web clip on the iPhone:

In order to customize this experience, you need to provide up to four image files for download and to add some code to the head in your site.

Create a set of .png files containing the icon in the following sizes (you can use any file names, these are common):

  • 57x57 for iPhones (apple-touch-icon.png)
  • 114x114 for retina iPhones (apple-touch-icon-114x114.png)
  • 72x72 for iPads (apple-touch-icon-72x72.png)
  • 144x144 for retina iPads (apple-touch-icon-144x144.png)

There is no need to round the corners or add the shine, the phone will do this for you.

Then add this code to the head.html file in source/_includes/custom/head.html. If you’re not using Octopress, just place this code within your <head></head> tags.

1
2
3
4
<link rel="apple-touch-icon" href="apple-touch-icon.png" />
<link rel="apple-touch-icon" sizes="72x72" href="apple-touch-icon-72x72.png" />
<link rel="apple-touch-icon" sizes="114x114" href="apple-touch-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="144x144" href="apple-touch-icon-144x144.png" />

Make sure the image files are in the root of your site (same place as the favicon) then generate and deploy the site.

The next time a user adds your site as a web clip, the phone will download the appropriate image file, add the shine, round the corners and make that the custom icon.

Follow the author as @hiltmon on Twitter or @hiltmon on App.Net.