← Home Subscribe Replies Archive Reading Also on Micro.blog
  • Set up a little writing nook at the new house. Pretty pleased with it.

    → 10:01 PM, Nov 21
  • Favorite Apps and Tools (May 2021)

    I haven’t done it in a long time, but every so often it’s fun to look at the apps and tools I’ve been using and share that. A lot of these haven’t changed over the years, a couple are new, but most have stayed updated. Let me know if you discover anything you didn’t know about.

    Development

    Xcode

    What I do 90% of my work in.

    Dash

    A documentation browser that is better than Xcode’s in every way. You can also download docsets for lots of other languages and frameworks, which is about 100x better than searching the web every time you need something.

    BBEdit

    My goto for anything to do with regular expressions and big text files. I also use it for proper programming and writing in Markdown sometimes if other apps are giving me trouble or not acting how I want.

    Tower

    A Git client that you’d be silly not to use. It does nearly everything you need faster than the command line.

    Nova / Visual Studio Code

    I put these two together, because I jump between them a lot. Visual Studio Code is probably the best Electron app I’ve used. It launches fast, the plugin ecosystem is amazing and for most things the code completion is untouchable.

    Nova has the potential to do most of the same things, and some of them even better (setting up tasks is so much nicer), but with a much nicer and more Mac like interface. When Nova will do what I want, that’s usually what I go for, but it just doesn’t have the functionality yet and the plugins that exist are almost uniformly not as good. It’s also missing debugger support, which Visual Studio Code has. I’m looking forward to do the way when I can use Nova exclusively.

    Proxyman

    If you need to see what’s network calls are being made from your computer and what they’re returning, this is the best app for it. You can also write scripts that do things with the responses and replace URLs to return something else instead, which I used recently for testing image caching.

    Paw

    Paw is a great app that I don’t use as much as I should. What Paw is great for is creating a document representing all the calls that can be made to an API so you can test against it outside of your code.

    Patterns

    Still the best regular expressions app, but it hasn’t been updated in years. It’s only a matter of time before it stops working and I’ll have to write my own thing.

    Audio

    Logic Pro X

    My favorite audio editor/workstation — and I’ve used a bunch. If you’re using GarageBand, just switch. It’s such an easy transition and you can do so much more.

    Audio Hijack Pro

    This is what I use for capturing both guest and my own audio for podcast recording.

    Descript

    It’s an Electron app, and it kind of sucks as an audio editor, but it has one killer feature: you can edit audio like text. It makes editing a long podcast recording so much easier than it would be. If this was a native app that had worked a little more like a regular DAW when you needed it too, it would be the coolest thing in the world.

    Writing

    iA Writer

    I was using Ulysses for a while, but the fact that it hides Markdown links behind UI, and doesn’t exactly support regular Markdown got me off of it. iA Writer is a great app for writing things like blog posts when I don’t need to do a bunch of search and replace and other editing.

    Marked

    I use this for previewing things I write in Markdown. It’s inexpensive and way better than any of the build in previews in any text editor I’ve seen.

    MarsEdit

    Sometimes I write things directly into MarsEdit, but usually I write in iA Writer or BBEdit, and then paste into it. It gives a nicer UI for sending things up to my blog with the proper categories, etc, than the web interface.

    General

    1Password

    This is where all my passwords and two factor auth codes go. It’s great.

    Soulver

    Soulver lets me write any math I need to do out as (nearly) English. Sometimes I use a regular calculator, but most of the time Soulver is easier and more powerful.

    NetNewsWire

    The best RSS reading app.

    Acorn

    My image editor of choice. Mostly I do simple things, and it’s always been the best for that. If I needed to do more complex operations, it seems totally capable.

    Not Apps

    Ruby

    Since learning Ruby I can’t think of any reason I’d write a shell script. I used to use things like AWK all Shell all the time, and there’s no reason to for most things when Ruby exists and I know it. It’s the closest thing to “Objective-C without the C,” probably including Smalltalk.

    Regular Expressions

    You don’t need to be that good at regular expressions for them to change how you work with text on a computer. I might write a tutorial on them at some point.

    → 8:56 PM, May 10
  • Reset macOS Dock to Default

    I’m a man with a lot of hobbies. The stupidest one, by far, is hitting reset on my iOS home screen layout once or twice a year and reorganizing everything.

    Today I found out you can do the same with your dock on macOS.

    defaults delete com.apple.dock; killall Dock

    Reorganizing the dock is a lot less time consuming than redoing your iOS home screen. Sometimes it’s nice to have a fresh start.


    Subscribe to RSS feed

    → 10:00 AM, May 7
  • No More Activity Rings

    The time that I was the most fit was when I lived in Portland the first time from 2009 to 2014. The Apple Watch didn’t exist, and the most advanced tracking I ever had was a basic Fitbit pedometer. Since then, I’ve tracked a lot about my fitness. I have heart rate data going back years now. I can tell you my Vo2 max, which isn’t even a thing I knew existed before a few months ago.

    Am I in better shape though? Would I be in worse shape if I didn’t have all of this data? I don’t know.

    Beyond basic step tracking, I’m not entirely convinced collecting any these data has had any practical use for me or have made me any healthier. The reason I was more fit before was that I was riding my bike and walking everywhere. I didn’t need to track it to know, I know it because of how I felt at the time.

    If you’re a hardcore athlete, tracking these things probably has some use. What if you’re just someone who wants to live a healthy lifestyle and feel good? Do I even have the expertise to turn these numbers into anything truly actionable?

    Anyone who has tracked their activity before knows the feeling of leaving home for a walk or bike ride and forgetting their activity tracker. If you don’t track it, does it even count? But that’s ridiculous — tracking your bike ride isn’t what makes it healthy, it’s doing the thing. Wearing an Apple Watch that tells you that you closed all your rings today doesn’t change anything. In fact, I think it could be counter-productive.

    Here’s why: once your watch tells me that I’ve closed those rings, I tend to feel done. I did the activity and hit the arbitrary goal, and now I don’t need to think about fitness anymore. If I don’t have that, the only metric I can use is how I feel. If you learn to listen to your body, I think it will tell you when you’ve had enough.

    So, that’s what I’m going to do. I’m not going to worry about closing rings. I’m going to wear whatever watch I feel like, I’m going to walk or bike whenever it’s an option to get where I’m going, and I’m going to let the numbers take care of themselves.

    I’ll let you know how it goes.

    → 10:53 PM, May 6
  • Can't Quit BBEdit

    BBEdit — it doesn’t suck, but it sure isn’t leading in features. I’ve spent a bunch of time with different editors, even reading a book on VIM once. I wrote about my experimentation with different editors recently, and most of what I said stands, except for that my experience with Nova is significantly better since moving from Python to Ruby for scripting[1].

    I’ve experimented with Visual Studio Code, which despite my reservations about Electron apps, is obviously the frontrunner for editors with lots of features that are reasonably easy to use and configure[2].

    I also spent time with TextMate 2. I know people who still swear by it, but while it’s still being developed, it doesn’t feel like something I want to invest in starting to use now. Maybe if I were already an expert, I’d ignore the UI bugs that don’t get fixed or the fact that most of the bundles are a decade old, but I’m not, so I don’t think I will (unless I change my mind).

    So, here I am, typing in BBEdit. There’s other options. Why has app form the nineties that mostly still looks like an app from the nineties stuck with me?

    What’s Good?

    It never crashes

    Being in the middle of writing code, hitting go, and having the app you’re using freeze up and crash really sucks. I can’t remember BBEdit ever crashing on me.

    It’s fast

    BBEdit loads fast so I can get to putting text into a window quickly. A lot of times I’m just pasting something to a temporary location, and I don’t think there’s a better option than BBEdit for that.

    Regular expression support

    All the serious editors have regex support. For some reason, BBEdit’s just feels the easiest to me. Pattern Playgrounds are pretty functional. The interface for saving a library of regex sucks, but that’s not such a big deal for my use.

    Per language settings

    I really enjoy being able to have a per-language color schemes and indentation levels. BBEdit does this better than anything I know.

    What’s Missing?

    Intelligent completion

    Ctags are supported and work okay, but they aren’t context aware. I do really like that BBEdit’s completion will let me tab between placeholders. Xcode does this, but most of the other editors seem to stop at putting the name of what you’re doing in and stopping there.

    Syntax awareness

    Here’s a couple of examples that drive me nuts in BBEdit: If I’m writing a list in Markdown, and type an asterisk *, write something, and hit enter, BBEdit does nothing. It should insert another asterisk so I can continue the list, but, it doesn’t. Other editors have had this forever now.

    If I write something like def my_method in Ruby and then hit return, BBEdit should be smart enough to know that the next line should be indented by two spaces. It’s not just a Ruby thing, I tried this with C and Python as well and BBEdit just doesn’t have this feature.

    Extensions/packages/bundles

    Whatever you call these, I want a way to easily add a new list of completions, or a theme, or language support to BBEdit without downloading a file I found somewhere and moving it to a subdirectory of BBEdit’s Application Support folder.

    Multi-cursor support

    All the other GUI apps have this now — even TextMate — and you know what? I like it. Column selection when you hold down option is not the same thing and the prefix/postfix lines window is a crutch at best.

    A nod to visual appeal

    Just a little one, please. Can we get an icon update for Big Sur while we’re at it? I don’t ask for much.

    Still Using BBEdit

    So here I am: using BBEdit. I keep trying other things, and I keep coming back. At this point I’m probably going to stop worrying about what editor I’m using so much and get back to work[3].


    Subscribe to RSS feed


    1. So much relies on the quality of the extensions you’re using in Nova. I stand by that they need more first-party language server extensions.  ↩

    2. The promise of Nova to me is Visual Studio Code with a Mac UI. It comes really close. Configuring build tasks in Nova is way easier and better.  ↩

    3. That’s a lie. I will definitely continue worrying about what editor I’m using.  ↩

    → 12:29 PM, May 6
  • The Fast Decline of HEY World

    Before deciding to come back to primarily posting on my own blog only, I’d been enjoying using HEY World. Something I was interested in seeing was what the usage of that looked like over time. Since I’ve been learning Ruby, this seemed like a great thing to write a script for and find out.

    The first thing I needed, however, was a list of blogs. To do that I created a for hey.world.com links on Twitter, used Proxyman to get the responses.

    I did a bunch of scrolling back in time to when HEY World first came out, copied the responses, and then wrote a script to grab all of the usernames of the blogs that were being linked to. I ended up with a list of about 523 unique blogs that had posted a link to Twitter at least once. Seemed like a pretty good sample to me. I was actually a little surprised there were that many to begin with.

    I then wrote my other Ruby script to pull the feed of every HEY World blog I had, add up the global posts per day, and save them to a hash. Once that was done, I outputted it as CSV so I could see it in Numbers.

    Screen Shot 2021 05 04 at 12 50 14 PM

    HEY World became publicly available on March 4th, 2021. On that day there were 212 posts, the next it was 194. Lots of them are just people trying it out to see what it is and then never posting again. There’s a lot of blogs that have 1-2 posts, which seems expected. After the first couple of days it trails off pretty quickly and within ten days or so it’s in the 20-30 posts a day range.

    Of course the reason this is interested is due to the controversy surrounding Basecamp, and what’s happened since then.

    On April 27, 2021, the Verge posted their article Breaking Camp about what had gone down at the company. For a couple of days, the numbers stayed around the low to mid twenties, which seem about average.

    The last four days, however, they’ve dipped into the 12-14 new posts a day range. It could be normal, since there’s other slow days, but my feeling is that the people who’d remained using it (like me) pretty much stopped as more and worse information has come out about what was going on at Basecamp.

    → 3:20 PM, May 4
  • Preparing for the Summer

    I’m usually not great at planning ahead. One reason I love Disney Land, but don’t have a big desire to go to Disney World, is it seems like you have to know that you want to ride Slinky Dog Dash at 11am on Wednesday three months in advance.

    This time, however, I’m breaking my usual pattern. After being stuck in a house for a year, now that everyone is getting vaccinated, I want to get outdoors and do outdoors things this summer as much as I possibly can. The problem is, everyone else wants to do the same thing, and if I’m not careful, all of the places I want to go and things I want to see will be booked up. Here’s what I’m doing.

    Prioritizing top places

    Made a list of the top places I want to go and coming up with a plan to get there by the end of summer. These include Crater Lake, the Oregon Coast, and Silver Falls.

    Researching alternatives

    I’m lucky that in the Pacific Northwest there’s so many beautiful places you can go that aren’t one of those three to five most popular. I’m trying to find places which might be available on shorter notice, since placed like Crater Lake are likely to be booked out all summer.

    Buying supplies when I see them

    I have a list of supplies that either didn’t make it from California, or that I need to refresh. If I’m in REI, or wherever, and I see the thing I need, I’m buying it right away.

    I knew I needed a new cooler, and wanted a nice one this time, so I made a point to find a Yeti I liked of the right size, and bought it. With the pandemic supplies are likely to be constrained for all sorts of things, and with lots of first time campers getting out there this year, things could run out.

    → 10:59 AM, May 4
  • Owning My Soapbox

    After what’s been going on with HEY, I’ve realized if I care about the words I write, I need to be my writing from my own domain with my own RSS feed that I can take with me to a different blog-thing if I want to. I’m not making changes because of what I think of Basecamp’s actions, but because I don’t want the URL of my blog to suggest anything about me to my readers.

    For now, the thing I’m choosing to use is Micro.blog. I’d been resistant to using it as the main thing I blog from for two reasons:

    1. I didn’t know how to point the RSS feed people are served to Feedpress.
    2. I didn’t know how to filter out my Micro posts from the RSS feed.

    The first one is solved by a custom theme. It took me maybe five minutes to customize the Micro.blog theme I’d been using to serve my feed correctly. It even works if you put my URL directly into an RSS reader like NetNewsWire.

    The second was solved by Micro.blog having a feature to get custom category feeds. It will even automatically filter posts to that feed that are longer and have a title, so I don’t have to remember to do anything special. All I did was point Feedpress to that feed, and I’m off.

    Sorry if there are any repeat posts in the RSS feed. That shouldn’t happen again.

    → 2:41 PM, Apr 28
  • My COVID Vaccine Experience

    Yesterday around 2:20 p.m. I drove myself to the Oregon Convention Center, stood in line for about ten minutes, and was freely provided with the Pfizer COVID-19 vaccine.

    I expected that I would be standing in line for some time and that the whole thing would be extremely disruptive to whatever I had planned for the day.

    Instead, the line was quick and efficient, and afterwards I was able to make a follow-up appointment scheduled exactly 21 days after my first. My arm didn’t even really get sore.

    If the vaccine is available to you, do it. If your state is anything like mine, it’s quick, easy, and most important, puts you five weeks from having your life back.

    → 1:10 PM, Apr 28
  • The Run Loop With Special Guest Gus Mueller

    The Run Loop returns with special guest Gus Mueller to talk about Acorn 7, Real Basic, unit testing, and a lot more. It’s a good one!

    Show page • Overcast link

    → 12:36 PM, Apr 5
  • Useful Shell Aliases

    Like any good computer person, I maintain a collection of dotfiles. Mine is pretty basic. I don’t use any crazy zsh package manager framework thing or external dependencies. I do have a bunch of aliases, however, that I think are pretty helpful. I’m sharing them here. I hope some of these are useful to other people.

    LS Aliases

    These three are pretty straightforward. You probably already have one or more of these if you’ve customized your shell at all.

    alias ls='ls -G'

    Always show colors for ls.

    alias l='ls -lG'

    Show directory contents in list mode.

    alias ll='ls -aGl

    Directory contents in list mode with color.

    Package Manager Stuff

    alias brewup='brew update && brew upgrade'

    Update and then upgrade Homebrew if that was successful.

    alias gemup='gem update --system && gem update'

    Update all Ruby gems.

    alias allup='brewup && gemup && mas upgrade'

    Upgrade Homebrew, Ruby gems, and the Mac App Store together. If any fail, stop so I can fix it.

    alias ibrew=’arch -x86_64 /usr/local/Homebrew/bin/brew’

    For the time being, there’s enough x86 only Homebrew packages that I’m running both the x86 and ARM versions in parallel. Maybe I should just run the x86 version for everything? For the time being, at least, I have this alias to run the x86 version.

    Grab Bag

    alias zshconf='bbedit -w $HOME/.zshrc && source $HOME/.zshrc'

    Open zshrc in BBEdit and then source it after it’s done being edited.

    alias in="arch -x86_64"

    Run any command in x86 mode.

    alias ded='rm -rf ~/Library/Developer/Xcode/DerivedData'

    Delete Xcode derived data. Make sure you close Xcode before running or it will complain. Thanks Brent!

    alias domains_grep="defaults domains | sed 's/,/\n/g' | grep -i"

    Grep to find the user defaults domain of something.

    take() { 
        mkdir $1 && cd $1 
    }
    

    Create a directory and change to to it.

    → 1:23 PM, Apr 3
  • The state of Mac code editors

    I like to think of myself as a typist who doesn’t ask for much. The last thing I ever wanted to be was another programmer, dissatisfied with the state of text editors for macOS in 2021, writing yet another article comparing code editors. Regardless of my best intentions, however, here we are.

    My short answer is this: it’s pretty bleak out there. Whatever age we’re in right now in terms of text editors with modern features for the Mac, it is emphatically not golden.

    Here’s what I want from an editor:

    • Hit ⌘R to run a script.
    • Reasonable autocomplete.
    • Auto-indenting as I type.
    • Be a Mac-assed Mac app, or at least not an Electron app.
    • Supports projects and individual files equally well.

    Based on my requirements, I can rule out a few of the possibilities right away:

    • Electron apps: Visual Studio Code, Atom, et al.
    • Non-Mac-like native apps: Sublime Text, CodeKit, a bunch of others, I’m sure.
    • Java apps: So, anything by Jetbrains. They’re all big heavy IDEs written in Java that they look and feel like it.

    So what contenders remain?
    • Nova, the new code editor by Panic.
    • CotEditor, a free, open-source text editor for macOS.
    • BBEdit, the venerable text editor from Bare Bones Software.
    • TextMate 2, the once mythical creature, come to life.
    • CodeRunner, a paid code editor that’s been around a few years.

    Nova
    Nova is a recently released editor by Panic. On its face, it’s very exciting. Nova is responsive, looks good, and has support for lots of languages. My main issues are that it’s too project-focused, and there’s no “run in Nova.” 

    If you’re in a project, you can set up tasks, which are fine, but that doesn’t work at all for individual scripts, 

    Nova does have autocomplete, but it relies heavily on third-party extensions for basic language support. That was a bold choice for a brand new editor that’s starting from zero. For obscure languages, that choice makes sense to me. Good autocomplete for languages like Python and Ruby, however, should be built-in. At the least, there should be first-party from Panic users can expect to get regular maintenance.

    Panic is the follow-up to Coda, an editor that focused on the web and making static websites. Although Nova is called a code editor, it still feels like the only thing that is a first-class citizen is making websites by hand with HTML, CSS, and JavaScript. It has no concept of things like virtual environments in Python, which effectively makes it unusable for serious development. My feeling is the people at Panic just don’t use those kinds of languages a lot in their work, making it hard for them to know what’s needed. 

    I wanted to love this app, and I’m sure I’ll keep trying to use it, but it’s just not there yet. Nova is still really young, though, and I don’t see any reason it can’t add the things I wish it had in the future.

    CotEditor
    CotEditor is arguably the best looking of the bunch if what you want is an app that uses native Mac controls. It’s the only editor on my list whose UI updated for Big Sur. It is Mac-assed to its core — it even supports versions (remember that?). It’s an outstanding text editor. 

    The problem what CotEditor is that it’s missing almost all of the features you’d want for development. You can’t run scripts, and there is zero-autocomplete and no automatic indentation. It has no features beyond syntax highlighting for coding. One thing I’ve only seen in CotEditor is a “give execute permissions” checkbox in the save dialog, which I now think all of these apps should have.

    Once again, if they could add some or all of these features, CotEditor would be a killer app.

    BBEdit
    BBEdit is what I use to do regex on a big file or just type something up quickly. It launches fast, even with huge files, and so it’s great for that. The UI is really behind the times though, autocomplete is only through Ctags —which I can’t be bothered with — and there’s no auto-indenting. I don’t think I’ll ever stop using BBEdit but I also don’t see myself using it for scripting.

    TextMate 2
    TextMate 2 feels mostly maintained. It gets updated every so often, but the UI is pretty creaky, and it has weird UI bugs that never get fixed, hence the mostly. Its features were probably great for 2006, but pretty behind the times today. It can run things with ⌘R, but there’s no autocomplete. It does have great auto-indenting, however, so that’s a huge win.

    CodeRunner
    CodeRunner seems like a sleeper to me. It has a ton of features (a debugger!). Autocomplete is of varying quality for different languages but doesn’t require installing anything. Python support is outstanding. You can have custom launch scripts, so it could work for projects as well as individual scripts, but that’s not what it’s made for. If what you want to do is write individual Python or Shell scripts, this is the one to use. I’d keep it around just for that, even if I didn’t use it for anything else.

    And...?
    I’m about as confused as I was when I started writing this. There just aren’t any great options. I’ll probably keep trying to use Nova for anything project-based and hope they update it to be better for things that aren’t static websites. CodeRunner is hard to beat for one-off scripts, so I’ll use it for that. BBEdit is sticking around for regex on big files. I’ll possibly TextMate 2 if the others all suck at auto indenting the language I’m using too much.

    At the end of this, I wanted to say that I had a single text editor that would mostly do what I want, but here we are, probably using four different ones for different tasks. Fantastic.
    → 1:27 PM, Mar 29
  • Update and Source Shell Files Alias

    After doing the bbedit ~/.zshrc followed by source ~/.zshrc a few times, I realized I could write this alias to speed things up a bit:

    alias zshconf='bbedit -w ~/.zshrc && source ~/.zshrc'

    What this does is opens my zshrc in BBEdit, waits for me to edit the file, and then sources it once I’m done. The -w is the wait flag for the BBEdit command line tool, but most other editors I’ve used have something similar you could use.

    → 3:13 PM, Mar 16
  • Syncing Scratch Projects and Preferences Between Macs

    Last week, I moved from the one computer lifestyle to having two different Macs — an M1 Mac Mini and MacBook Air. Using both is creating two points of friction I’d really like a better solution for.

    The first is that I have a lot of little test coding projects that I start that I might want to use both computers, but which I’m not ready to create a new repo on GitHub for. What do I do? I can either:

    • Keep them in iCloud Drive folder until I’m ready to move them over to GitHub? It seems like that would be okay as long as they’re not also git repos, since I’m told having repos in iCloud Drive is problematic, although I’m not entirely sure it is in practice, rather than theoretically.
    • Have a git private git repo — “Scratch” — that I put all of my temp projects in to sync them across machines. If something graduates to its own repo, I’ll move the files out of scratch and set that up. A scratch repo is less ideal — because it means I still have to remember to commit — but it sort of solves the problem.

    The second issue is syncing app preferences. The only app I know that does this without intervention is BBEdit, because of course, it does, but I’d also like my Xcode keyboard shortcuts, Terminal themes, and everything else to work this way. The best solution would be for this to be a feature of iCloud, obviously, but it isn’t.

    One solution is I could add each thing individually to my dotfiles repo and use a script to set up symlinks. I do this for my actual dotfiles, and it works fine for those, but there are not that many of them — doing it for every app I want to sync sounds tedious. I also don’t like that I have to remember to commit and pull to keep things in sync.

    I could also use this Mackup thing, which is a project on GitHub that claims to do what I want automatically, but which I find a bit terrifying to unleash on my machines?

    If anyone has a better solution for either of these, please reach out. My goal is to pick up either of these functionally identical computers and use them without worrying about how they’re set up or where things are.

    → 1:50 PM, Mar 6
  • A far lonelier death

    One of my best friend’s dads just died of COVID after battling it for several weeks until he was eventually in a coma. They were forced to remove the feeding tube when there was nothing else that could be done. She is heartbroken. Quoting her, “A COVID death is not like other deaths. It is far, far lonelier. And it leaves very lonely people behind.”

    Her dad did the right things and still was infected with this horrible disease, probably from someone who didn’t even know they had it.

    Wear your mask and get your parents vaccinated. If you can’t get them vaccinated yet, do what you can to get them to stay home and not take unnecessary risks. I’ve struggled to get my own parents to take this as seriously as they should. Don’t let anyone you love die hooked up to machines alone in a hospital.

    → 4:03 PM, Jan 15
  • Daily Planners for 2021

    The last few years I’ve enjoyed keeping a paper journal of some kind for both personal and work related things. The separation is good so that private work stuff can stay at work, and also so that I’m not looking at work when I should be relaxing or doing other things.

    For 2021, I’ve landed on using a Hobonichi Techo (A6) for my personal planner, and a Hobonichi Cousin (A5) for work. The larger size is helpful for work because it gives me room to take notes and sketch out ideas, where for home, I think the smaller size will be nice since I can more easily take it with me.

    Another benefit of the Cousin is the integrated weeks pages — the smaller planner has weeks as an add-on book — which I hope will be good for planning out my work tasks. A week at a time is feels like about the right resolution for me to be thinking about work, so I’m hoping it’ll work out well.

    → 10:32 PM, Nov 28
  • It’s Morning in America Again

    Congratulations to everyone on electing Joe Biden President of the United States. No one knows what happens next, but a lot of people worked incredibly hard for this, and all of us have suffered in one way or another under the evil and malice of the last four years.

    We all deserve to celebrate today, and then it’s time to win those Senate seats in Georgia.

    → 1:05 PM, Nov 7
  • The “Butt in Chair“ Writing Process

    I’ve been reading all of John Scalzi’s Old Man’s War series of books — of which there are six — and was interested to read this article on his writing process.

    I’ve been writing books now for 20 years and my experience really is that it’s not complicated, it’s just mostly sitting down and doing it, one day after another. Inspiration for me happens because I’m writing, not the other way around. In talking with other long-time writers, I’ve learned that’s how it works for most of us.

    This reminds me a lot of when I read Stephen King’s autobiography or Anne Lamont’s Bird by Bird. I guess the “sit down each morning and write for a set amount of time“ method is a pretty common one among successful writers.

    → 4:14 PM, Oct 19
  • Hyrule Warriors: Age of Calamity

    Just watched the trailer for Hyrule Warriors: Age of Calamity, and I’ll definitely be playing this. I enjoyed the first game, but it felt disconnected from the world of Zelda. It’s exciting that the third-party developer that makes Warriors games are working closer with Nintendo this time to make something that ties into Breath of the Wild.

    → 1:00 PM, Sep 8
  • September

    I feel like I just looked up and realized it was already September? I haven’t even blogged sine May. I could have sworn it was more recent than that. This whole year has been a blur.

    What a time to be alive.

    → 3:21 PM, Sep 7
  • Things I’m Doing Since the Lockdown

    Next week will be my third working from home, and there’s no clear date when it will end. I’m still not used to it, but I’m trying to do what I can to stay healthy while we’re all stuck at home. My time has consisted of at least a few of these each day.

    1. Going on at least one thirty minute walk a day.
    2. Trying to get my father to stay home.
    3. Playing guitar.
    4. Reading old books about old computers.
    5. Blogging and tweeting more.
    6. Trying to reassure people who are more worried than I am (and I’m pretty worried).
    7. Buying books from my favorite bookstore online so that hopefully they don’t go away forever.
    8. Realizing I have to keep in touch with friends better.

    This is pretty rough. I have a lot thoughts, and a lot of feelings. It’s hard not to feel anxious all the time, and I can feel things like sleep quality decline.

    I know that I’m incredibly lucky to have the kind of job I do and to be in the position I am in. I can’t stop thinking about all the people who aren’t so lucky though. It hurts to think about so many people suffering as much as I’m afraid they might.

    → 12:27 AM, Mar 21
  • BitBar: Easy Custom Menu Bar Apps

    BitBar is a free app for macOS which — essentially — lets you create custom menu bar apps from shell scripts or other command line tools. If you can write a program or script (in Shell, Python, C, Swift) and print, you can put something in the menu bar. BitBar also lets you define how often it should automatically refresh each specific script.

    My favorite thing I’ve made uses the speedtest-cli tool to refresh what my current download and upload speeds are and show colorized output based on the results.

    2020 20 03 bitbar speedtest

    The script might look strange if you’re not used to awk, but the main thing to know is that $2 (the second space separated for the line) represents the result number and $0 represents the whole line. So I’m grabbing the number and then printing the whole line with a color based on the value. Also, awk is cool and you should learn it.

    #!/usr/bin/env zsh
    
    echo "⏱"
    echo "---"
    
    /opt/local/bin/speedtest-cli |
    awk '/Download/ {
            if ($2 < 25) {
                print $0, "|", "color=red"
            } else if ($2 < 90) {
                print $0, "|", "color=orange"
            } else {
                print $0, "|", "color=green"
            }
        }
        /Upload/ {
            if ($2 < 4) {
                print $0, "|", "color=red"
            } else if ($2 < 9) {
                print $0, "|", "color=orange"
            } else {
                print $0, "|", "color=green"
            }
        }'
    
    → 1:43 PM, Mar 20
  • More Parseable Output, Please.

    Since reading Unix: A History and a Memoir by Brian Kerninghan (of K&R), I’ve been a little enamored with the idea of writing small command line tools. This article titled Hints for Writing Unix Tools hits on a bunch of things, and is worth reading, but one that really jumped out at me was this:

    Output should be simple to parse and compose. This usually means representing each record as a single, plain-text formatted line of output whose columns are separated by whitespace. (No JSON, please.) Most venerable Unix tools—grep, sort, and sed among them—assume this.

    Trying to parse the output of something like this on the command line is incredibly frustrating:

    {
        myThing = "Blah"
        percent = 0.5
        ...
    }
    

    However, if the output is tab delimited:

    myThing     blah
    percent     0.5
    

    Parsing it with Awk, sed, or other Unix filter tool can usually be done as easily as awk '/myThing/ { print $2 }'. I wish more tools paid attention to this. Maybe if you were writing Unix from scratch today, you’d have processes communicate using structured data (I think this is what PowerShell does?), but you have to work with the system you have.

    Everyone knows that regular expressions are terrible, but what my theory presupposes, is that a large percentage of the “how can I parse …” questions on places like Stack Overflow that are solved by a crazy regex wouldn’t exist if more tools had sane output.

    → 12:31 PM, Mar 19
  • The Growth of Command Line Options, 1979-Present

    This post shows the growth of arguments for a bunch of the most common Unix commands over time. The author demonstrates how we went from 99 in 1979 (Version 7 Unix), to 393 in 1996 (Slackware), to 700+ today (Ubuntu). After that, they make the argument that maybe that isn’t inherently a bad thing? Super thought provoking if you think about design or use a shell all day.

    → 2:06 PM, Mar 18
  • Script for Better Man Page Viewing

    If you’re on macOS, you can open man pages in a separate, nicely formatted, window by using the x-man-page URL scheme.

    Example Man Page

    Typing x-man-page://ls, however, isn’t super convenient. This script lets you type xman command_one two... and open each page in a separate window. If it can’t find the command you asked for, it prints a message to stderr. Enjoy!

    #!/usr/bin/env zsh
    
    function xman() {
        for i in "$@"; do
            if [ $(command -v $i) ]; then
                open x-man-page://$i
            elif; then
                printf "Can't find command: %s\n" "$i" >&2
            fi
        done
    }
    
    → 1:23 PM, Mar 3
  • Filter Through Command in BBEdit

    I’ve used BBEdit for a long time, but only recently started digging into the scripting side of it. If you’re willing to write your script against it’s scripting dictionary in AppleScript or JavaScript, you can do a lot, including attaching a script to every menu command in the app. You do however have to write a script and put it in the right place before you can use it. Sometimes I’d rather pipe my text through grep 'foo' | sort -u like you can on the command line, and have it format my text for me.

    TextMate has exactly this command, so emulating that seemed like a good place to start:

    FilterThroughCommand_TM.png

    I figured out that I could build most of what TextMate has as a BBEdit Text Filter:

    FilterThroughCommand_BB.png

    Dr Drang had already done pretty much exactly the same thing, but I wanted my script to remember at least the last command I ran, which won’t work with his approach. To get that, I needed to make a proper AppleScript so that I could take advantage of persistent properties (which is a super useful thing AppleScript can do if they’re saved as an scpt file).

    You can copy the script below into Script Editor and save it in script format to BBEdit’s Text Filters folder:

    property default_command : "sort"
    
    on RunFromBBEdit(_range)
    	set shell_command to the text returned of (display dialog "Enter a shell command:" with title "Filter Through Command" default answer default_command)
    	
    	if shell_command is "" then
    		quit
    	end if
    	
    	set default_command to shell_command
    	
    	if _range as text = "" then
    		set text_content to text of front document
    		set results to executeCommand(shell_command, text_content)
    		set text of front document to results
    		return ""
    	else
    		set text_content to _range as text
    		set results to executeCommand(shell_command, text_content)
    		return results
    	end if
    	
    end RunFromBBEdit
    
    on executeCommand(shell_command, text_content)
    	set AppleScript's text item delimiters to {ASCII character 13}
    	set results_text to text items of (do shell script "echo " & quoted form of text_content & " | " & shell_command)
    	set AppleScript's text item delimiters to {ASCII character 10}
    	set return_text to text items of results_text as text
    	set AppleScript's text item delimiters to {""}
    	return return_text
    end executeCommand
    
    → 3:38 PM, Feb 23
  • Pilot Vanishing Point 2019 Limited Edition

    I love the Pilot Vanishing Point. Depending on which day you asked, I’d more often than not say it’s my favorite pen[1]. It’s a (relatively) affordable fountain pen with an incredibly smooth 18k gold nib, and a novel retraction mechanism — an unusual feature in fountain pens. In a slightly uncharacteristic move for me, when I saw the 2019 Limited Edition, I ordered it immediately.

    The finish is called “Tropical Turquoise.” I like turquoise and thought the blue with black swirl finish looked good in photos. In person, however, it’s much nicer. The finish sparkles in a way that didn’t come across in the pictures. Pilot has made 2019 of these pens, of which mine is #949. And while it’s not technically an anniversary edition[2], this year marks Pilot’s one-hundredth anniversary, which made it feel a little more special.

    The only nib size available with this edition is medium, which can be a bit of a mixed bag depending on which paper you use it with. On high-quality paper like Rhodia or Midori, it’s excellent, and I appreciate the smoothness of the broader nib. On Leuchtturm, it’s acceptable, but your lines will come across a bit thick, and on something like a Baron Fig, it tends to bleed a bit depending on the ink. Since I keep a fine nib in my other Vanishing Point, this was preferable for me, but it’s something to keep in mind. I really wish Pilot made a Medium/Fine nib because the jump is so significant between the two sizes.

    If the medium is too thick for you, however, a great feature of the Vanishing Point is that Pilot makes extra nib units available at reasonable prices. And once you have multiple, they can be swapped in around four seconds. Effectively, it lets you own a variety of gold nib pens in different sizes at a discounted price.

    I tested using the included cartridge of turquoise ink, and the writing experience was (expectedly) very smooth. If you’ve used steel nib pens and are looking for your first gold nib pen, one of the regular Vanishing Points is hard to beat on value.

    Overall, I’m entirely happy with my purchase. It’s just what I expected, was not outrageously priced for a limited edition, and looks even better in person. If you’re on the fence and can find one available, go for it.


    1. Other days, I might say it was the LAMY 2000.  ↩

    2. $4800 is a bit out of my price range.  ↩

    → 2:20 PM, Nov 14
  • Pico: A New Android Client for Micro.blog

    I don’t use Android, but Pico by Belle B. Cooper’s new app Pico looks like a great choice if you do and want to use Micro.blog. It’s also [open source]. Neat.

    I also enjoyed this part of her introduction post:

    More recently I tried out Mastodon. Mastodon feels a lot like Twitter to me in terms of the tone and the content you'll see there. For those who like the idea of Twitter but find it an uncomfortable place to hang out, this is great. Personally, I don't like Twitter at all anymore. I don't like memes, or internet culture, or silly jokes, or random thoughts from random people. That's the stuff that Twitter—and now Mastodon—is great at, but it's not what I want.

    From my limited experience with Mastodon it seems like it wants to be the same kind of thing as Twitter, but less centralized so that if you don’t want to play in the same sandbox with white supremacists (or whatever), you can just not be a part of that instance, stay on instances which disallow them, and it won’t exist for you.

    Micro.blog on the other hand is just a social networking layer built on top of RSS and other web standards. Manton will also let you pay him $5 to host a blog on his server, but you can just hook up your RSS from your own blog for free and get the benefit of a social network. The way I look at it, they’re both more an less ambitious than one and other in different ways, but I really like Micro.blog’s approach, because it will still have value even if it doesn’t get all that big. Also, podcasting with it is awesome, easy, and one of the most affordable ways.

    Belle is also ½ of the fabulous Exist.io, which is a service you try if your doing any kind of health tracking and wanted to actually make sense of it.

    → 2:07 PM, Aug 30
  • Reading With a Pencil

    This makes me feel as though I should be reading more books on paper, or at least have a notebook next to me when I read.

    Reading With a Pencil:

    I believe that the first step towards becoming a writer is becoming a reader, but the next step is becoming a reader with a pencil. When you underline and circle and jot down your questions and argue in the margins, you’re existing in this interesting middle ground between reader and writer.

    (Via @Cheri on Micro.blog)

    → 11:39 AM, Aug 30
  • Morning Awakening Podcast

    I’ve just posted the first episode of a new short-form podcast about mindfulness and meditation called Morning Awakening. It’s me talking about my practice, related topics I’m thinking about, and responding to audience feedback. I’d like to make it something I do on most days, but some of that will depend on how much response I get, so if you have any thoughts or feedback on a related topic, please send it via the contact form or on Micro.blog.

    You can subscribe to the show by entering the URL http://feedpress.me/awaken into your podcast player, or searching in the coming days once it shows up in all the podcast directories.

    → 12:10 PM, Aug 22
  • Reversing a Swift String in Place

    One of the interview questions at my old job we’d ask sometimes was to reverse a string in place; usually using C or Java. After conducting an interview one time, I decided to rewrite it in Swift. Here’s what I came up with:

    func reverse(string: inout String) {
        var i = string.startIndex
        var j = string.index(before: string.endIndex)
    
        while i < j {
            let first = string[i]
            let second = string[j]
    
            string.remove(at: i)
            string.insert(second, at: i)
            string.remove(at: j)
            string.insert(first, at: j)
    
            i = string.index(after: i)
            j = string.index(before: j)
        }
    }
    
    var str = "12345"
    reverse(string: &str)
    
    → 1:32 PM, Aug 20
  • Mastodon and Micro.blog

    Having used Mastodon and Micro.blog now, my feeling is that there’s room for both because they’re trying to do different things. Mastodon wants to be a better, distributed, and more thoughtful version of Twitter. Micro.blog is just blogging with a social layer laid on top of it. It supports using a Micro.blog hosted site as your regular blog, like Wordpress or any other system, and not engaging with the social layer at all. Or, you can put your blog wherever you like, connect it to Micro.blog, and just use it for the social layer. They both want to be more and less ambitious than one and other in entirely different ways. Mastodon wants to be bigger, where Micro.blog could stay relatively small and still be successful as long as people are using it to blog and interact.

    → 1:06 PM, Aug 20
  • Sticking With Tile After Trying Trackr

    I’ve used Tile trackers since they first came out on my keys, wallet, backpack – anything I didn’t want to lose. They’ve always worked well enough, but they were a little big, and I didn’t love that the batteries weren’t replaceable. For those reasons, I decided to give Trackr a shot. It’s way smaller and runs on a watch battery. Those are the good parts. The bad part is, it didn’t work.

    Yesterday I spent 15 minutes tearing apart my house looking for my keys because I could see in iOS settings the Trackr device was connected to bluetooth, it took that long to recognize it in the app. And this isn’t the first time something like this has happened. If the app can’t reliably detect when the device is connected – an issue I’ve never had with Tile – and trigger it to ring, it’s functionally useless to me.

    I ordered a Tile Sport for my keys and will deal with the larger size and non-replaceable battery.

    → 1:46 PM, Aug 16
  • The Guest House

    This poem by Rumi was sent to me by one of my meditation teachers, and I liked it so much I wanted to share it.

    This being human is a guest house. Every morning is a new arrival. A joy, a depression, a meanness, some momentary awareness comes as an unexpected visitor. Welcome and entertain them all. Even if they’re a crowd of sorrows, who violently sweep your house empty of its furniture, still, treat each guest honorably. He may be clearing you out for some new delight. The dark thought, the shame, the malice meet them at the door laughing, and invite them in. Be grateful for whoever comes, because each has been sent as a guide from beyond.

    What I take from this is that you shouldn’t judge our feelings or label them good or bad, but instead try to live with, experience, and understand them. If you remain gentle with yourself and really internalize that you are not your feelings, you stop getting swept up and inhabiting whatever emotional weather is passing you by.

    → 12:32 PM, Jul 13
  • Be Focused: Pomodoro Timing App

    I don’t know about other people, but for me, if I want to be the most productive, it’s essential to have systems in place to help stay focused and remind me what I should be doing. Lately, I’ve been using an app called Be Focused for that. It’s a fairly basic app for doing Pomodoro style time tracking – although, if the idea of a “system” scares you, the app never calls it Pomodoro. I’ve tried a few of these in the past, and this is probably the best one (and the most maintained).

    You tell if how long you want your interval and break periods to be, and it does what you’d expect by timing and transitioning between those periods. The one more advanced feature is that if you pay for the pro version (or get it on SetApp), there’s an integrated to-do list, which is nice if you want to reminders of what you were actively working on.

    I’ve mostly used the Mac version because that’s where my work happens, but it’s also on iOS, and they do sync. Be Focused is available on the App Store and in SetApp. If you find yourself needing something like this, it’s a good option.

    → 12:58 PM, Jul 11
  • An Automatic Watch for Under $100

    When I mentioned the other day that I was interested in getting a non-smart watch which wouldn’t be so expensive I’d feel bad for not wearing it every day, I ruled out the idea of an automatic watch of any kind. It turns out I was wrong. There’s a bunch of options under $200. The ones which appealed to me the most were the Seiko brand watches.

    The one I ended up getting was a Seiko 5 Automatic, which you can buy for between $60 and $70, is a real automatic (no batteries!), and looks pretty cool too. For a little more you can upgrade to something like the Seiko SKX007, which is a bit chunkier (being a diver’s watch) and also quite attractive.

    → 3:52 PM, Jul 9
  • The Purpose of Meditation

    Something I keep hearing from friends when they find out I meditate is that it’s not for them because they “can’t clear their mind.” The thing is, that’s not really what you’re trying to do. Our brains are machines designed to generate thoughts, there’s no use trying to stop it. The purpose of meditation isn’t to stop thinking; it’s to change the relationship you have with your thoughts and feelings.

    The way you get there is by regularly practicing being present with those thoughts and feelings so that you can learn to let them go when they arise. Most of the time when we encounter feelings we don’t like we want to get away from it as quickly as possible. Someone who is practicing mindfulness might try to stay with that feeling, understand what it is, and then gently let it go. When we haven’t been practicing mindfulness, it appears that emotions are something happening to us that we can’t control. We tend to embody the thing that we’re feeling right now instead of recognizing it for what it is or ever examining it.

    Learning to relate to ourselves in this way isn’t easy, and it isn’t particularly fast either. It does, however, have the chance to make a lasting and positive impact on our personalities and lives. If there are two things I’ve discovered so far that help the most, it’s first to be always gentle with yourself, and second to be consistent in your practice.

    Learning to be gentle with other people is important too, but you have to start with yourself. That means no negative self-talk, and not getting upset with yourself if meditation was hard today or you let yourself get caught up in emotion. The only way to do meditation wrong is not to do it. Any day that you sit is a good day, and if you missed a day, that’s okay too. Start fresh tomorrow. Being hard on yourself is never going to fix what’s already happened, and it’s not going to encourage you to continue either, so don’t do it. Instead, use it as a chance to do better the next time by understanding what happened.

    Remember: this is supposed to be hard. If developing mindfulness were natural, you wouldn’t need to sit, because you’d already have it. Weirdly, you do already have everything you need to be mindful, but getting in touch with that in a different story.

    Being consistent is also incredibly valuable. As best you can, try to sit every day. Meditation has made the most significant impact on me when I’m the most consistent. There are days I’m able to sit for forty minutes, and there are days that I only get ten, but I do make sure that it happens every day. Some days my mind goes crazy, and sometimes I sort of lose awareness and drift off, but I do sit, and over time I’m making progress. That’s all that matters. It’s a lifelong process. What happens one day or the next isn’t what matters. What matters is coming back it over and over again for weeks, months, years, and decades.

    If you want to start meditating, and you’re not sure how, I can tell you what’s been working for me, but please remember I am not an expert by any means. I do have some recommendations:

    Meditation Apps

    You don’t need to pay for a guided meditation app. If you want an app for timing that syncs with Apple Health and tracks your progress, get Insight Timer. It’s free, there are some community features I like, and it works well.

    Reading

    Read some books. Learning about the philosophy behind this stuff helps deepen your practice and keeps you motivated. If you’re looking for a short one to start, try Sit Like a Buddha by Lodro Rinzler. It’s specifically about getting started establishing a meditation practice. I also like Alan Watts quite a bit and think The Wisdom of Insecurity is a great place to start. Zen Mind, Beginners Mind is one that I read a couple of years ago, probably didn’t understand that well, and need to read again.

    Basic Meditation Instructions

    While keeping in mind that you should get your information from someone who’s qualified to teach, here’s the straightforward meditation practice that I do (the same one you’ll learn in Sit Like a Buddha):

    1. Sit crossed legged on the floor using a cushion to elevate your pelvis slightly above your hips. If that's not comfortable, use a chair.
    2. Sit up with your back straight, and tilt your head forward slightly. If it helps, imagine a chain pulling you up from the crown of your head and then releasing you your spine stacks up. If you're in a chair, try not to rest against the back if it.
    3. Gaze a few feet in front of you with your eyes open. The term people use here for your gaze is “soft focus.” You don't want to go cross-eyed, but you're also not boring a hole in the floor. Just be relaxed.
    4. Place the tip of your tongue against your front teeth, and relax your jaw, so your mouth is slightly open.
    5. Rest your hands comfortably on your legs.
    6. Start your timer. Begin by focusing on your breath wherever you feel it -- nostrils, the expansion of your stomach or chest, etc. You want to get into the physical sensation of breathing.
    7. Continue to breathe naturally. Try to stay with that. If you catch yourself following a thought, recognize it, say the word “thinking” to yourself in your head, and gently let it go. If it keeps happening, that's okay, don't be hard on yourself. If it helps you, try counting with every out breath up to seven, and then start over.
    8. Continue until the time is up.

    That’s all. It doesn’t need to be complicated; you just have to do it every day. Try to get up to twenty minutes, but if ten is more comfortable to start, do that. If ten is too hard, try five and work your way up. It will get easier.

    → 2:22 PM, Jul 5
  • Discovery Park Hike

    [gallery ids=“2049,2050,2051,2052,2054,2053,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,” type=“rectangular”]

    Link and I went on a walk with his wiener dog friend Ramen through Discovery Park in Seattle. It’s a really pretty spot right next to the water that’s worth checking out.

    → 3:15 PM, Jul 2
  • Opinel N°8 Knife

    I’m not a “knife guy,” but I wanted something to carry around that would be reliable for camping and general cutting things, so I picked up an Opinel N°8 at REI the other day. Works well, classy looking, and only about $15. The one I got is stainless still, but if they’d had it I would have gone with the carbon steel version.

    → 11:30 AM, Jul 2
  • View Public Interface for Swift Files in Xcode

    If you miss header files in Swift you can switch between the implementation and public interface for a file in Xcode by typing Command-Control-Up Arrow (⌃⌘↑).

    → 2:52 PM, Jun 29
  • Thoughts on Apple Rebuilding Maps

    Eddie Cue gave an interview to Matthew Panzarino on TechCrunch where he detailed Apple’s project to rebuild Apple Maps using their data, instead of relying on partners, as they’ve done. Also, it’s launching with the next beta of iOS 12, so that was surprising.

    Since I just started driving a new car with CarPlay, I’ve been using Apple Maps for driving directions almost daily. And it’s been fine. In fact, in the places I’ve lived (Portland, San Francisco, Seattle), it’s pretty much always been fine. For other people who don’t live in major cities on the West Coast, it seems like it’s been less fine, but has improved a lot for everyone since it launched in 20121.

    The thing I don’t think it’s ever been and doesn’t have any indication of becoming with the previous strategy was remotely competitive with the quality of Google Maps.

    When the decision was made to move away from Google, and create their service, my feeling is that it was on a less-than-ideal timeline and they needed to come up with a solution that would get it out the door. Partnering with a bunch of companies to launch who have all the data you need makes a lot of sense when you have no experience or infrastructure to do this, and it’s beginning to look a little embarrassing that the iPhone can’t do turn by turn directions.

    That strategy was the only way Maps could’ve happened in 2012, and after a rough launch, they’ve managed to incrementally get up to the level of “good enough” over the last six years. For it to be great though the incremental improvements and relying on third parties weren’t going to get them where they wanted to be. I don’t know if the new way will fix all of Maps problems at once, but something had to change, and this seems like the way it had to go.


    1. If they've been working on this project since 2014 like the article says, that means Apple Maps has been in the process of being rebuilt for two-thirds​ of the time it's existed. ↩
    → 2:00 PM, Jun 29
  • My New 2018 Subaru Outback

    In 2014 I bought a 1988 Dolphin RV, which I barely used for two main reasons:

    1. It felt more like a death trap to drive it than I thought it would.
    2. I moved from my house in Portland (which had a driveway) to an apartment in San Francisco (which had none).

    Because of that, I sold it at the beginning of 2018. Other than that I haven’t had a vehicle of my own since 2009. Because the cities I lived in that time were Portland (where it’s not needed), and San Francisco (where it would actively be a burden), owning a car never really seemed worth the cost.

    At the same time, not having the ability to get out of the city I lived in easily, go camping, or get across town without spending an hour or more on public transit or spending $30 on ridesharing to do normal things that adults do was a bummer.

    So mainly my thoughts a few weeks ago landed on: I’m thirty-three, I’ve have made decent money for a decade, and I’d like to know what it’s like to have a car that isn’t wholly terrible. So, I started thinking of what I’d want in a vehicle and what the most sensible way to make that happen was.

    What I Was Looking For

    Thinking about what I wanted to get out of a car, I came up with a few criteria that were important to me:

    Modern Safety Features

    Besides being safe if you got into an accident, my preference was to have features which might help avoid once in the first place. Realistically, I’m an average driver, because most people are average, and would benefit from a little help. So if possible, things like a backup camera, adaptive cruise control, blindspot detection, and automatic emergency braking would be nice to have. That RV felt dangerous every time I drove it on the freeway, and that was not something I wanted to relive.

    CarPlay

    I’m a nerd, and if I was going to get a car in 2018, I wanted it to have CarPlay built in, or at least be able to add in a third-party receiver easily which had it. It turns out there are lots of options for this, so if I bought used adding it in after wouldn’t be such a big deal. Still, I assumed that built-in is best.

    Ability to Go Camping

    Hopefully, this pans out the way I want it to, and I go a lot (I already bought all the gear), but my idea was that I’d like to be able to take whatever I get camping. Car camping, it turns out, requires a surprising amount of stuff. I didn’t want something huge, but big enough to carry the number of things you’d need to for a few days time was important. Also, if I decide to go somewhere more adventurous that involves driving down a long dirt road or up a mountain in the future, it should be able to handle that.

    Buy Used or Lease?

    I am not a fan of owing money, and I’d like to have the lowest number of large recurring payments I can. Because of this, my first thought was to buy a decent used car in the five to eight thousand dollar range outright. If I kept it for a couple of years and sold it, I could put in about the same amount of money again and upgrade. It probably wouldn’t have all the features I wanted, but maybe it could be close enough. When I started looking, however, this plan had problems.

    The first was that what I could get in that price range was somewhat limited. Also, buying a used car from a private seller sucks. I didn’t want to end up with something that was going to be a maintenance nightmare, and the decent looking vehicles get sold fast. Lastly, I’d pretty much be giving up on getting any modern safety features beyond maybe-not-dying if I got in an actual accident, and those were pretty important to me.

    I also ruled out buying something new. I feel like the technology of cars is moving fast enough right now, that I didn’t want to be stuck paying it off for five years, only to have to sell it at some point. It was also pretty cost prohibitive.

    Although I was initially hesitant to lease, the benefits ended up making sense. I could get something on a lease special which was brand new with all the features I wanted for a lower price, and in three years turn it in and not have to deal with it. Of course, any money I put into it is just, gone, but the way new cars lose value, I wasn’t sure that would end up being much different anyway.

    The Car

    With all of that in mind, I started looking at what had the features I wanted, and what lease specials were available. What I landed on was a 2018 Subaru Outback. I might’ve gone with one of their other models, but the Outback had been updated recently and had the best specials going.

    IMG 1132

    Subaru EyeSight

    For safety features, it’s pretty incredible. It includes the Subaru EyeSight system, which uses cameras and radar to do every safety thing I could imagine. The adaptive cruise control is especially great. It will accelerate up to stay behind the car ahead up to the max speed you set, and take you down to a complete stop if it needs to, does both at least as smoothly as I could, and never gets distracted.

    Lane keep assist is another standout feature for me. If you begin to drift slightly in your lane, it gently nudges you back towards the center. It’s not so much you couldn’t override it you needed to, but it’s a little bit of help.

    The car is in no way driving for you, so you never get to stop steering, but the level of assistance it gives is probably ideal for where the technology is. Versus something like Tesla Autopilot (which I haven’t tried), I’m concerned with a system that presents as self-driving so that you could stop paying attention for long periods of time, but where you need to be ready to take control at any moment.

    Part of me wonders if the technology between what Tesla and Subaru are using is that much different or if Subaru is just a lot more conservative when it comes to letting the car take over.

    The only complaint I would have with EyeSight is that I feel like this car maybe beeps at you slightly more than is helpful. It’s not incredibly annoying, but sometimes I feel like it’s beeping at me just to let me know everything is still okay. The beeping isn’t terrible, but I think it’s right on the line of keeping you alert versus beeping so much you stop paying attention to it. I’ll have to have it longer to know how I feel.

    CarPlay

    I love CarPlay. Being able to talk to Siri to look up directions while driving, play podcasts or Apple music, and respond to text messages without looking at the screen is a huge safety and functionality win. Once or twice the car has failed to detect my iPhone or lagged, but generally, it’s rock solid. The only flaw I’ve seen multiple times is that occasionally the GPS will place me off the road I’m on and get confused. Siri itself has been (surprisingly) great.

    Camping

    Since I live in an apartment, I’m not getting one anytime soon, but I can now see why people have those cargo container things on their roofs. It takes so much stuff to go camping. Thankfully, there was plenty of room. It makes me happy I didn’t go with something a lot smaller though, because it might’ve not worked out so well.

    If I could figure out a better way to organize the stuff I want to take though and I could probably do it without taking down the backseat.

    As far as driving up a mountain road in inclement conditions, I assume the all-wheel drive will be essential, but since I haven’t done it yet, I really can’t say.

    Feelings So Far

    The only other car I’ve ever had from the decade I owned it was an early 2000s Ford Focus with a salvage title that completely broke down within seven or eight months – so I may not be the most qualified to comment on how nice a car is. Still, it feels nice. I wouldn’t mind if it were slightly smaller, but if I had a driveway or garage instead of maneuvering the garage under my apartment building, I don’t think I would care.

    Having a car for sure isn’t the cheapest thing in the world. Spending a lot less on ridesharing does offset it a bit though. Also, it does feel pretty amazing to be able to be able to go somewhere thirty minutes like it’s no big deal.

    → 3:13 PM, Jun 27
  • Resource for Learning Drafts

    After I mentioned that I wasn’t sure how to get started with Drafts, Eli on Micro.blog pointed me to this great MacStories article on Drafts 5 by Tim Nahumck. It’s presented a review, but the article walks you through how to use almost every feature of the app, including advanced stuff like scripting.

    I think that the way I’m going to approach Drafts right now is that if all I ever use it for is a place to start writing before I know if I want something to end up in Ulysses, the Micro.blog app, or Day One, that’s useful. As I get more into it, I think opportunities to use things like custom keyboard shortcuts, workspaces, and tagging will become apparent.

    The trick to getting into something that has so much potential depth has to be starting off using it in the simplest way possible and expanding from there. Otherwise, it’s just too overwhelming.

    → 12:23 PM, Jun 27
  • Justice Anthony Kennedy Retiring

    US Supreme Court Anthony Kennedy judge to retire - BBC News:

    The conservative has been a swing vote on many decisions including the 5-4 rulings that decided same-sex marriage and upheld abortion rights.

    I’d like to think that I’m not one to panic, but this seems really bad. Anyone that gets put on the Supreme Court is someone we’re going to be stuck with for decades. The idea that a sad jackass like Donald Trump would get to decide 22% of the people on the Supreme Court for the next few decades is deeply upsetting to me.

    → 11:47 AM, Jun 27
  • 2018 Reading Challenge Update

    In a previous post I set a goal for myself to finish fifty books in 2018 – very slightly less than one a week. Since I’m not one of those insanely fast readers, and I’d like actually to remember some of what I read, I realized setting a goal I probably wouldn’t be able to hit wasn’t the best idea. Because of that, I decided to revise that to twenty-four, or, one every two weeks. Twenty-four feels super achievable – I’m already at fifteen – but also just enough that I need to be consistently reading something.

    I am also a big enough person to admit that I counted A Day in the Life of Marlon Bundo (which took maybe fifteen minutes) as one of the books I read.

    → 2:29 PM, Jun 26
  • Six Figure Salary is “Low Income” in San Francisco

    SFGate:

    The high cost of living likely accounts for what some perceive to be a "Bay Area exodus." It's hard to quantify such a trend with limited census data, but multiple reports imply Bay Area residents are at least thinking about leaving.

    For a family of four, $117,400 a year in San Francisco County is considered low income, and I totally believe that. The thing about living in the Bay Area is that it really feels like you just can’t get ahead there. It’s dirty, dangerous, and everyday going downtown you will be witness to the horrific situation the cities most vulnerable (homeless) are in.

    I wouldn’t be surprised at all to hear people are leaving because who wants to live in a place like that.

    → 10:19 PM, Jun 25
  • Showing Up Is the Hardest Part

    It’s a total cliché, but the hardest part of anything really is showing up and starting. Whether it’s the gym, meditation cushion, or a class, once I’m there, I might as well have done it already. I’ve been thinking of this since it came up in the meditation class I’ve been taking the last few weeks at my local Shambhala Center, in regard to establishing a daily meditation practice. One of the responses that came out of that was that you just have to do it. You’re supposed to be challenging yourself, so of course, you’ll want to avoid it sometimes.

    There’s a lot of fear and anxiety for people around getting to know your mind and dealing with emotions that come up, but once you’ve made it to the cushion, you’ve already succeeded. I’ve put off meditating lots of times in the past, but I’ve never gone running from the cushion once I’ve started.

    It’s the same with working out or starting a challenging project at work. Once I start, all I have to do is not stop. I’ve heard that as humans we’re so programmed against discomfort that our bodies react with a fear response, like a super low-level version of getting chased by a tiger. Making your body do things it doesn’t want to, or intentionally facing your inner demons definitely quality as “uncomfortable.” The problem for me – as with many things – is that I’m yet to internalize this fully. I know it intellectually, but I still manage to put off working out for a week here and there, even though I always am happy I did it once it’s over.

    The only thing I’ve found that seems to help is to keep going and try to establish what I want to do as a habit. Meditation has started to become that for me. I used to go for a few days, stop and start over, but once I got over the initial few weeks of doing it every day, it became a lot easier. Right now I’m coming up on fifty days straight. Not exactly enlightened yet, but making progress. I need to figure out how to apply this lesson to other parts of my life.

    → 3:37 PM, Jun 25
  • Preview of Sunlit 2.2

    Manton just posted a preview of the next version of Sunlit on his blog, and it looks fantastic. I’ve been off of Instagram for a little while, so the new timeline view looks perfect for me.

    I’m still figuring out how to use the app, but I created my Camano Island post with Sunlit, and it worked really well.

    → 11:36 AM, Jun 25
  • Camping on Camano Island

    First Night

    [gallery ids=“1941,1944,1945,1947,1950,1951,” type=“rectangular”]

    Managed to get the tent up, build a fire, and roast some (vegan) hot dogs.

    Day Two

    [gallery ids=“1943,1942,1946,1948,1949,1952,1953,1954,1956,1955,” type=“rectangular”]

    So beautiful here. Did some hiking down to the beach, built a fire somewhat more successfully, and ate red beans and rice.

    → 9:06 PM, Jun 24
  • Living the Stereo HomePod Lifestyle

    $600-750 (I got one refurbished) for two speakers is a pretty big ask, but my initial feeling is that stereo HomePods sound more than twice as good as one.

    Stereo HomePods

    → 12:07 PM, Jun 22
  • RetroBatch Batch from Flying Meat

    My friend Gus Mueller recently released a new app I heard about from him a couple of weeks ago called RetroBatch for batch image processing. I’ve done this kind of thing before with a shell script or Automator, but this looks way more powerful. If you’re familiar with Audio Hijack, it has a similar interface for setting up chains of processing steps, which seems perfect.

    → 11:29 AM, Jun 22
  • Trying Something Different

    Thinking that instead of posting to Twitter/Micro.blog, etc., I will try writing everything on my blog and then use Micro.blog to send it about intelligently. Also, I think I finally get Micro.blog.

    → 1:08 PM, Jun 21
  • Equatable Swift (NS)Objects

    How to implement equality with different kinds of Swift objects was pretty obvious once I read the documentation, but the errors I got at first were not entirely clear. If you want to show equality between two objects in Swift, you have to do something different depending on if they subclass NSObject or not.

    In the case of an NSObject subclass, you would override -isEqual::

    override func isEqual(to object: Any?) -> Bool {
        guard let myObject = object as? MyClass else {
            return false
        }
        return uniqueID == myObject.uniqueID 
    }
    

    If it’s a pure Swift object, however, you would implement the Equatable protocol and override ==:

    extension MyClass: Equatable {
        static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
            return lhs.uniqueID == rhs.uniqueID
        }
    }
    

    If you try to implement Equatable on an NSObject subclass, you will either get compiler errors about redundant conformance, or your implementation of == will never be called and you will be confused.

    → 7:42 PM, Jun 20
  • Sea-Tac Airport Today

    Don’t know what’s up today, but this definitely the worst line I’ve ever seen at an airport.

    → 4:47 PM, Jun 19
  • Summer in Seattle

    Cal Anderson Park

    → 2:01 PM, Jun 19
  • Moving to Managed Wordpress

    Until now I’ve been hosting my blog myself using WebFaction, and it’s worked great. That was until a couple of months ago when I received a notification from my host that they’d detected malware in my Wordpress install and my site would remain deactivated until I fixed it. As far as I could tell I was running the latest version of Wordpress with a secure password. I have no idea what happened, although I’m reasonably sure it was my fault somehow. I decided to look for another host.

    The things that I wanted were to be able to keep using MarsEdit, to have it be secure, not to have to worry if I got a lot of traffic all of a sudden, and for migration (in, and out) to be painless. The obvious choice was to export my blog to Wordpress.com and pay for one of their premium plans.

    If I decide to move back to self-hosting in the future, it won’t be any harder than it was before, and I shouldn’t have to worry about security or any of that going forward. I will try to post in the future about how it’s working out and what the tradeoffs have been.

    → 1:33 PM, Jun 19
  • Installing Fonts Using Homebrew

    I had no idea you could do this, but now that I do, but it turns out you can install fonts from the command line using Homebrew. That means I could write a shell script to install automatically most or all of the fonts I use on new Macs.

    I could even have the script in Dropbox and have it run periodically in the background using a launchd service to keep everything in sync. That is useful.

    All you need to do is this:

    brew tap caskroom/fonts
    brew cask install font-<name-of-font>
    

    It looks like it has all of the major free programming fonts and a bunch of others too. Neat.

    → 3:51 PM, Apr 20
  • Opt Out of Junk Mail

    For no reason today I thought to Google “opt out of junk mail”, which lead me to an FTC page which describes how you can do just that. It takes about ninety seconds.

    1. Go to www.optoutprescreen.com to opt out of all credit card offers for five years.
    2. Pay $2 at www.DMAchoice.org and you can opt out of seemingly all other junk mail for ten years.

    We’ll see how it works, but I assume if it’s linked to from the FTC website it’s pretty legit.

    → 4:07 PM, Jan 23
  • American Democracy Is Doomed

    American democracy is doomed - Vox:

    To understand the looming crisis in American politics, it's useful to think about Germany, Japan, Italy, and Austria. These are countries that were defeated by American military forces during the Second World War and given constitutions written by local leaders operating in close collaboration with occupation authorities. It's striking that even though the US Constitution is treated as a sacred text in America's political culture, we did not push any of these countries to adopt our basic framework of government. This wasn't an oversight.

    I recommend reading this entire article. It was written pre-Trump, and it’s hard to look at now and think that anything in the last two years hasn’t made this seem more right than when it was published.

    → 12:45 PM, Dec 28
  • 2018 Reading Challenge

    This year I read a bit less than the year before, at only about twenty books or so. For 2018 I’d like to get on a more consistent reading schedule, and so I’m aiming for fifty. That’s a little less than one a week. I’d also like to work more fiction in and not just read about politics, buddhism, and computers. Don’t know if I’ll do it, but that’s my goal.

    → 1:54 PM, Dec 27
  • Micro.blog Now Available for Everyone

    As of today, anyone can sign up for Manton Reece’s fabulous Micro.blog with a code or having been a Kickstarter backer. I’ve been using the service for the last several months, and it’s become a great community. I love how it’s able to pull in content from different sources via RSS and present it all in one timeline. If you want to follow me there, I’m @collin.

    → 3:49 PM, Dec 19
  • A Great Qi Charging Stand for $20

    I’ve been using this charging stand1 with my iPhone X for about three weeks, and I couldn’t recommend it more highly. It actually looks nice. One of the things I didn’t like about the other options was they tended to have a lot of ugly branding on them. It’s also exactly the right angle for Face ID, and isn’t picky about how you place your phone on it. Oh, and it’s only $20.

    Great present to yourself or someone else.

    61J1NucLnIL SL1100 jpg


    1. The actual product name is: Fast Wireless Charger, Yolike 2 Coils Wireless Charger Wood Grain A8 for iPhone 8/8 Plus, iPhone X, Fast Wireless Charging for Samsung Note8 S8 S8+ S7 S7 Edge S6 Edge+ Note5. So catchy. ↩
    → 6:26 PM, Dec 18
  • Investing in Skills

    I’m pretty comfortable on the command line. I can move about, issue commands, edit my profile, pipe things around, all that. However – and I’m probably supposed to admit this with a little shame – I’ve never really learned how to write shell scripts. Usually I’d write a Python script, a small command line app, or hack something together with Automator. It did the same job, but not being able to write a bash script from scratch felt like kind of a blind spot.

    I decided to work on that.

    In order to get from the can-competently-get-by level to the can-do-magic level I started reading a book on the topic, and set aside a few others I want to follow it up with. It’s been kind of a blast so far. I already knew how to program, and I can use command line tools well, so this has sort of been like taking two things I already knew and putting them together. made things a lot easier than if I were starting from zero. Even after just a couple days, I was able to put together little scripts to do useful things. It’s neat.

    Recently I read the book So Good They Cant Ignore You by Cal Newport. If you haven’t read it: you should. It’s fantastic. The big idea is that “follow your passion” is actually terrible career advice. Most people don’t know what they’re passionate about before they start, and only find that passion later once they’ve developed skills in an area. According to the book, the better advice is to focus on doing the best work you can in a field with potential for growth, and the passion will come later.

    Another thing he mentions in the book is how most people get good enough at whatever they’re doing, and then kind of stop learning. What that means though, is that if you you actually take even a little time to purposefully practice and improve your skills, you’ll blow past most people who don’t bother. Filling in some of the blanks in my developer skill set feels like a good investment.

    → 4:58 PM, Dec 18
  • Use SF Mono Outside of Terminal and Xcode

    I really like the SF Mono font Apple includes in Sierra and High Sierra (even more than Menlo), but for some reason it’s only available inside of Terminal and Xcode. So I’m out of luck when I’m writing in MarsEdit, BBEdit, or any other third party app. Fortunately, you can just copy the font from Terminal’s app bundle and install it so it’s available everywhere.

    Run this command from the Terminal and you’re all set:

    cp -R /Applications/Utilities/Terminal.app/Contents/Resources/Fonts/. /Library/Fonts/

    You could also ⌘-G in Finder and copy the files over that way if you prefer.

    → 4:59 PM, Dec 13
  • RevenueCat Makes iOS Subscriptions Easy

    My friend Jacob Eiting just released a new service to make adding subscription payments into iOS apps super easy. I checked out the API and it looks great.

    RevenueCat is the best way to implement subscriptions in your mobile app. We handle all the complicated parts so you can get back to building.

    You can check out RevenueCat here.

    → 3:56 PM, Dec 8
  • I Bought a $60 Smart Water Bottle and It’s Sort of Cool

    As of yesterday I believe I have hit peak millennial. It happened when I received my Hidrate Spark 2.0 smart water bottle in the mail. I wanted to start drinking more water, so I’d been using an app to track how much I drink for a few days. The app was fine, but it was easy to forget to do it every time I drank something and kind of a pain. The bottle tracks everything I put in it, syncs over bluetooth, and then saves it using HealthKit. So far it seems to work pretty well.

    If you have an extra $60 and want to drink more water, it’s not the worst thing you could do.

    → 1:18 PM, Oct 27
  • Life Update

    Astute readers/listeners/friends may have noticed that I haven’t published a new blog post or put up a podcast episode in the last couple months. And, there are reasons for that. I’ve been meaning to get everything going again, but life has managed to get in the way, so I thought I’d post a quick update.

    First off, I am no longer living in San Francisco. I moved from San Francisco to Seattle in September to work for Sonos. It’s been a great fit. I love the people I’m working with, the products we make are super cool, and I’m really excited for the future for the future of the company. I’ve always been a big audio nerd, and have loved speakers, microphones and all of that. There aren’t a ton of opportunities as an iOS developer to work at a company that bridges both of those things, so this has felt like a great fit.

    As for my podcast, I recorded an episode right before I left which I need to edit and put up. I’ll be booking more guests going forward and will try to get back on a regular weekly schedule. It’s a lot of work to manage, but I love doing it. I let life get in the way more than I should have, but I’m going to try to fix that.

    Anyway, that’s me.

    → 2:37 PM, Oct 24
  • Podcasting Gear (July 2017)

    I’ve switched about my gear quite a bit since I started podcasting, and I think things sound pretty good. I thought I would go ahead and share what I’m using, what I like about my current setup, and what I might change in the future.

    Microphone: Heil PR-40

    The mic that I’m currently using, and that I’ve used on most episodes of The Run Loop is a Heil PR-40. I like the sound of it pretty well, although sometimes think it might be a little too hyped sounding. The thing I really like about it how much rejection it has for anything that’s not in front of it. Considering I’m recording in a small downstairs apartment with loud upstairs neighbors, that’s pretty essential.

    I was using a Shure SM7b for a couple episodes but didn’t like it so much because it picked up a lot of room sound and the very low output made it a bit challenging to deal with, even with nice preamps.

    On the episode with Bob, I used an Electro-Voice N/D767a for his voice, and on the latest episode with Michele Titolo I used a Shure SM58. They both seemed about as good but I’d probably give the edge to the Shure.

    Headphones: Sony MDR7506

    Although the hyped high end makes these a little weird to use if you were going to try to mix on them, I love the Sony MDR7506 for tracking. I have less trouble with bleed getting into the mic than I did with the Sennheiser HD 380 PRO, and they don’t need anything special to drive them. That’s pretty much what I’m looking for in tracking headphones. As a bonus they also look extremely cool.

    Audio Interface: Focusrite Clarett 4Pre

    I traded my Apogee Duet 2 for this, and for the most part it’s a great upgrade. Comparable sound, 4x as many inputs, and way better software. Plus it actually has knobs. The Duet had one knob that you needed to click to change what it did.

    The only thing I don’t like about the Clarett as much is that the built in preamps have less gain available at 57dB vs the Duet’s 75dB. It’s totally sufficient for most things though; the Duet just had more headroom.

    I would absolutely recommend the Clarett to anyone looking for an interface in this general price range. The value it gives for the cost is just nuts. Really pleased with it.

    Preamp: API 512c

    At $900 a channel, plus requiring a $650 box to put it in, I can’t really recommend this unless you have a lot of money and want something truly professional, or plan on recording music as well. For podcasting, the built in preamps in a decent interface are going to be great, but I already had this, so why not use it?

    Software (DAW): Logic Pro X

    I used Pro Tools way back in the past, but I’ve been on Logic for many years now. I have custom presets saved for most things and muscle memory for the key commands. I really like this app and I’m pretty good with it.

    Other Gear

    • Tivoli Audio Model One for mixing and listening back. I'd like to get some real studio monitors hooked up but space is very limited.
    • Auphonic Leveler Batch Processor. I use the desktop version of Auphonic for loudness normalization. I don't mess with the other features too much.
    • Zoom H6 handy recorder for mobile recording.
    • Electro-Voice RE-50b microphone. Also for mobile recording.
    • Cloud Microphones CL-1 Cloudlifter for using low gain microphones with the Clarett preamps.

    Wrapping Up

    If I make any significant changes I’ll try to post what they are and why I switched. Right now I think my gear is pretty sufficient though and I’m going to try to focus on just making great episodes with what I’ve got for a while.

    → 5:07 PM, Jul 23
  • Counting Bits in an Integer

    During a tech screen I was given the task of writing a function to count the number of bits in an integer given. I thought I’d share what I came up with.

    #include <stdio.h>
    
    int count_bits(int i) {
        int bit_count = 0;
        int comparator = 0x1;
    
        for (int x = 0; x < sizeof(int) * 8; x++) {
            if (comparator & i) {
                bit_count++;
            }
    
            comparitor <<= 1;
        }
    
        return bit_count;
    }
    
    int main(int argc, char *argv[]) {
        // 1
        printf("%dn", count_bits(1));
        // 2
        printf("%dn", count_bits(3));
        // 4
        printf("%dn", count_bits(0x00011101));
        return 0;
    }
    

    I don’t know if there’s a better way to do this, but what I did create a comparator with 1 bit (0x1), loop through the number of bits in an int (sizeof(int)*8), do a bitwise AND to see if that bit is flipped in the int I’m counting against, and then shift left one and do it again.

    → 2:16 PM, Jul 23
  • Putting Code on Dropbox

    On the latest episode of Under the Radar, David mentioned that he stores all of his code in Dropbox, rather than pushing and pulling to a Git repo to sync between his machines. Of course, he’s not an animal, so he also uses Git, just not for syncing between his personal machines.

    I’ve never done this but once he said it, I was pretty much convinced and moved all of my code to a folder on Dropbox. Why wouldn’t I want the current state of my work, including what branches I was working on locally that I haven’t necessarily pushed to GitHub to be kept in sync so everything I need to work is automatically wherever I am?

    In fact, if I’m just working by myself on a project by myself, I don’t even need to push it to GitHub at all until I want to share it with someone else in order to get the benefits of having my code backed up externally and kept in sync across my machines?

    Am I crazy, missing something, or was everyone else already doing this?

    → 2:12 PM, Jul 22
  • If Object-Oriented Programming Were Announced Today

    Graham Lee has a post titled If Object-Oriented Programming were announced today:

    Here’s an idea: the current backlash against OOP is actually because people aren’t doing OOP, they’re doing whatever they were doing before OOP. But they’re calling it OOP, because the people who were promoting OOP wanted them to believe that they were already doing OOP.

    Basically, Graham argues that a lot of the “newer” paradigms are just OOP by a different name, and that none of us were really doing pure OOP to begin with. You should also check out his talk at UlKonf 2015 – Object Oriented Programming in Objective-C – where he talks about a lot of the same things in greater detail.

    → 1:36 PM, Jul 22
  • Up First by NPR

    The Up First podcast from NPR is a morning briefing show that’s about ten minutes long; meant to catch you up on the most important news of the previous day. I’ve just started listening to it after having it recommended to me, and think it’s great. The episodes are the perfect length to listen to in the shower and pretty information dense.

    → 2:27 PM, Jul 16
  • Hire Me

    If you’re looking to hire an iOS developer with over nine years of professional experience for contracting or full time employment, I am now available for either of those things with immediate effect.

    Email me at my full name at gmail dot com if you’re interested.

    → 7:24 PM, Jul 11
  • How to Sound Good on a Podcast

    If you read this blog, you know that I do a weekly interview podcast called The Run Loop. The show (generally) has remote guests with different audio setups and level of comfort in front of a microphone, so I wanted to write a short tutorial I could send to future guests to prepare them to be on the show and get the best audio quality. I then realized it made a lot more sense to make that a blog post so that other people could use it as a resource as well. So, here it is. Following this should help anyone sound good on a podcast regardless of previous experience.

    Getting a Microphone

    If you already have a microphone you can use for recording, great! A lot of people have a Blue Yeti, which can give you pretty good sound quality if you’ve got a good environment, or a Rode Podcaster which is really easy to set up for beginners to get a good enough sound. If you already have one of those two, great. I’m going to tell you how to get the best audio quality out of them. Otherwise, I’m going to tell you what to buy and how to use it. If you don’t, and you are preparing to be on a podcast, the one I’m going to recommend is the Audio Technica ATR2100 . You’ll also want to get one of these windscreens for it to block out plosives (p sounds) and a stand for it. This stand attaches to your desk. All together you’re looking at about $85.

    Why do I recommend the ATR2100? A few reasons. First, it’s a dynamic cardioid microphone. Dynamic means it’s going to be more forgiving to an untreated room than what’s called a condenser microphone. It’s not important the differences between the two types of microphone, but generally speaking, a condenser is going to pick up a lot more (mouth sounds, cars outside, room echo, etc). That’s great if you’re recording an acoustic guitar or in a professional recording setting, but not so much for a beginning podcaster. The Yeti is a condenser. The ATR2100 is a dynamic. Cardioid means it’s going to pick up mostly what’s in front of it and not other directions.

    Secondly, it’s a USB mic, but it also has an XLR plug. XLR is what “professional” audio interfaces and microphones use. So if you decide you want to graduate to a standalone audio interface or you need a mic that can plug into a mixer or whatever, you have room to grow.

    The last reason is that it sounds really good for a $70 mic. If you want to hear an example of this, listen to this episode of The Run Loop with Laura Savino. She used the ATR2100 and required very little editing or tweaking to make sound good.

    Headphones

    You’re also going to want a set of headphones. In a pinch, anything will do, but ideally, you want some big over the ear headphones that block out external sound. If you already have something that fits that description you should be okay, but if you want to get some recording specific headphones, these Sony ones are great for about $100. I haven’t used these $40 Sennheiser ones, but they look like they would be good and I’ve seen them recommended elsewhere.

    You’ll want to plug them directly into your microphone/interface for low-latency monitoring of your own voice. It’s important to hear yourself so that you don’t drift away from the microphone without realizing it. When you’re recording, keep it at a comfortable, but not too loud volume, or even with closed headphones you’ll get some bleed from the people you’re talking with.

    Setting Levels

    If your microphone/interface doesn’t have a knob for setting levels, you’re set. The Rode Podcaster is like this. If it does, you need to turn up the level on your microphone to get a good signal. Load up GarageBand, create a new audio track, and select your microphone as the input. Now talk into it at a normal speaking volume and adjust the gain knob on your microphone. If you look at the track volume indicator, you want it to be averaging in about the 40-50% range on that slider (-15 to -12 dBFS if you’re using a different app that shows you the numbers). The reason you want it to be in this range is to give yourself what’s called headroom. If you go above 0 dB, you’re going to clip and distort the recording.

    If you’ve been around audio at all, you might have heard that you want to peak around 0 dB. The reason for that is that on analog gear, it wouldn’t actually distort until something like +18 dB, so at 0 dB you still had a bunch of headroom. On digital gear you will distort at 0, so recording at around -12 to -15 is the same as recording at 0 on analog gear.

    Preparing Your Environment

    Before you go on the podcast, you should record some tests with your mic in the room you’ll be recording in. Put on your headphones, turn up the volume, and listen to your room through your mic. Everything you hear is going to come through on the recording. Turn off fans, air conditioning, anything like that which is getting picked up. I turn off my refrigerator when I record.

    Now, get close to your microphone (2-4”), hit record, and speak into it. What does it sound like? If you’re getting echo, try hanging a blanket behind the mic to catch some of those reflections.

    If you hear electronic interference, you’re going to need to get rid of that. Often, it’s some kind of grounding or power issue. Try changing what your computer is plugged into. If you’re on a laptop and using the two prong adapter, try the three prong one, or vice versa. If you’re plugged in, try recording on battery and see if it goes away. If all else fails, do a Google search.

    Mic Technique

    If you’re looking for a video on what good mic technique looks like, this video by Dan Benjamin will show you.

    If you’re wondering how far you should be away from your microphone and what looks like, my tip is this: put your four fingers together minus your thumb like a karate chop. Put your pinky on the microphone, and place your lips on your index finger. Now stay exactly there. If you move left, right, forward, or backwards, the sound is going to suffer.

    The other important thing to remember is that anything that happens in front of the mic is going to get picked up. If you scratch your face while talking, that’s going to show up on the recording, and there’s no way to remove it later. Same for bumping your desk, fiddling with your AirPods case, etc.

    Wrap Up

    This probably all sounds like a lot to adsorb, and it is, but if you can follow it, you’re going to sound way better than most people who go on a podcast. The main points to keep in mind are:

    • Get a microphone that’s forgiving and sounds good. I recommend this one.
    • Set your levels properly.
    • Get rid of as much room noise as you can.
    • Talk directly into the mic.
    • Don’t make any noise you don’t want to be recorded.

    I hope this all helps, and if you have any other questions, please get in touch via Twitter.

    → 3:59 PM, Jun 28
  • Going to PodCon

    I’m going to be attending PodCon in Seattle December 9-10, 2017:

    We even love podcasts we’ve never heard because we kinda like the entire idea of podcasts. Which is why we want to create an event that celebrates this medium/art form/whatever it is. We’re bringing together a diverse group of podcast pros in Seattle, Washington for two days of live podcasts, performances, discussions, workshops, and weirdness.

    It’s going to have awesome people like Roman Mars, Dylan Marron of Welcome to Night Vale, the McElroy brothers, and a bunch of other podcasters who I haven’t listened to but will definitely look up before I go. Tickets are cheap (~$100). If you can make it, you should come and let me know you are.

    → 1:38 PM, Jun 27
  • Laura Savino on The Run Loop

    On the latest episode of The Run Loop, Laura Savino comes on the show to talk about natural vs computer languages, decipherable and readable code, and a lot more. Go check it out.

    For the audio nerds out there, Laura was using an Audio Technica ATR2100 dynamic USB microphone, and I can’t believe how good this mic sounds for $70. If you’re getting started in podcasting and don’t want to spend a ton of money, I’d recommend this one super highly.

    → 11:14 AM, Jun 27
  • Greg Pierce of Agile Tortoise on The Run Loop

    Greg Pierce – of Drafts and x-callback-url fame – was kind of enough to come on The Run Loop and talk to me about his history, automation on iOS, and the past and future of The App Store. Go check it out here.

    → 5:23 PM, Jun 18
  • Marco Arment and Gus Mueller on The Run Loop

    Marco Arment and Gus Mueller come on the show this week to discuss the past, present, and future of WWDC, the move to San Jose, and a lot more. Give it a listen and please remember to subscribe, recommend, rate, review, and all of that.

    → 12:30 PM, Jun 9
  • Jean MacDonald On The Run Loop

    This week on America’s favorite iOS development podcast listened to in forty out of fifty states, I was joined by Jean MacDonald of App Camp for Girls, Micro.blog, and more. We also talked about driving for Lyft and “crossing the geek divide.”

    Go find it here and don’t forget to subscribe in your favorite pod-catcher.

    → 2:21 PM, Jun 2
  • Chris Parrish On The Run Loop

    Snappy dresser and all around charming individual Chris Parrish joined me on The Run Loop to talk about Seattle in the 90s, winning an ADA, healthcare, and the future of programming.

    → 3:48 PM, May 25
  • Brent Simmons On The Run Loop

    Brent Simmons stars on the latest episode of the critically acclaimed series The Run Loop. We talk about JSON Feed, past projects, and other things. Go check it out and subscribe in your favorite podcast app.

    → 4:48 PM, May 17
  • The Run Loop With Bob Cantoni

    Bob Cantoni came on the show this week to talk moving from indie to working for a compoany, political activism, moving into product from engineering, and more. You can find it here. Subscribe, recommend, etc. Thanks!

    → 4:22 PM, May 11
  • The Run Loop Episode 2 with Manton Reece

    This week on The Run Loop I was lucky enough to be joined by Manton Reece, creator of Micro.blog and long time Mac and iOS developer. We talk about working on independent projects, building communities, creating a social network that’s resistant to harassment, tabs vs spaces, and more! Please check out the show on it’s website and if you haven’t subscribed in your podcast player of choice, please do.

    Also, if you’re enjoying The Run Loop, please tell a friend, review the show on iTunes, and recommend it in Overcast.

    → 5:00 AM, May 4
  • My New Podcast: The Run Loop

    The first episode of my new podcast, The Run Loop, is now available in iTunes, Overcast, and wherever else great podcasts are found. You can also listen and subscribe on the shows website. The Run Loop will be a weekly discussion about making iOS and Mac apps with great designers and developers. In this episode I talk to my friend Samuel Goodwin about how he got started, peer mentorship, our trip to Japan, and more.

    If you like what you hear, please subscribe, rate, and recommend the show.

    You can also help support the show through Patreon. If you donate $1 or more a month, you will receive my sincere gratitude and help me make more and better content, but up to five people can also donate $50 a month and receive an hour a month of my time for a design or code review.

    I also want to thank to Joe Cieplinski for creating great artwork for the show. I hope you enjoy this first episode, and I’m looking forward to making many more.

    → 1:07 PM, Apr 27
  • Help Manton Hit His Indie Microblogging Stretch Goal

    Manton Reece has four days to go on his “Indie Microblogging” Kickstarter, and he still needs our help. He’s trying to create an ad-free open platform for microblogging where people own their own data and can take it where they please. Right now he’s at $68,620 of his original $10,000 goal – which is fantastic. Manton has built safety into the platform with a feature he calls “Safe Replies” to fight abuse, but if he reaches his stretch goal of $80,000 he can hire community manager to make the service even better:

    If the Kickstarter reaches $80,000, I will use some of the money to make my very first part-time hire for Micro.blog: a community manager. The community manager will help set the tone for the service, work on documentation and best practices, and be responsible for curation when Safe Replies fails to automatically catch emerging problems.

    I’m going to up the amount that I’m in for. If you haven’t already pledged to help – and you can – you should.

    → 12:54 PM, Jan 27
  • Very Short Squatty Potty Review

    I do not want to go into detail other than to say: it does what they say it will, and it’s totally worth $25. You can buy them on Amazon or the Squatty Potty website.

    If you’ve never heard of a Squatty Potty, go watch this video.

    → 3:20 PM, Jan 26
  • The "Unsubscribe" Mailbox for Apple Mail

    I don’t know how I’ve ended up on so many mailing lists for products I don’t care about, but I am. I created this “Smart Mailbox” for finding any emails I’m receiving that can be unsubscribed to that aren’t archived. It works pretty well.

    • Contains messages that match all of the following:
      • Entire Message -- Contains -- "Unsubscribe"
      • Message is not in Mailbox -- "Archive"
    → 12:52 PM, Jan 25
  • The CocoaPods App

    Managing third party code on iOS has always been a pain. In the past 9 years or so I’ve done everything from dragging source directly into projects, to Git submodules, to CocoaPods, to Carthage, to Git submodules again. Right now I’m using CocoaPods.

    I’ve had three problems with CocoaPods from the beginning:

    1. It messes with my Xcode project files.
    2. It stops working for me all the time.
    3. I don't want to mess around with Ruby gems.

    While the first issue seems pretty much intractable, the CocoaPods app seems to (potentially) fix the second two by bundling its own Ruby environment in the app. Because it’s from the people who make CocoaPods, I assume it’ll keep updated to match the command line tool.

    The app itself is pretty barebones. I’d love to see a future version let me see what updates are available for my pods from within the app and abstract away me having to edit the podfile by hand. Either way, I’m going to give it a shot. You can check it out on the CocoaPods website.

    → 12:09 PM, Jan 24
  • New JSON Formatting App by Samuel Goodwin

    My vivacious and charming friend Samuel Goodwin has just released a new app for formatting JSON called Formatter on the Mac App Store for the low price for $4.99. You can drag and drop JSON files right on it, or use the included Xcode plugin to turn your gross mess of brackets and parenthesis into artisanally crafted pretty printed JSON files. Another thing I like about Formatter is that it includes a QuickLook plugin to make looking at JSON in the Finder a bit nicer.

    The pasta maker icon is pretty clever, too. Go buy it.

    → 3:07 PM, Jan 5
  • Getting Started with Meditation and Preparing for What Comes Next

    If you’re like me, you’ve felt anxiety, stress, anger, and a bunch of other emotions in the last nine days. That’s normal. We’re in a stressful place. 2016 has been a bad year for a lot of people for a lot of reasons. What I’m afraid of, and what I don’t want to happen, is for what’s going on in the world change me. I don’t want to become a more closed off, angry, less gentle person.

    That doesn’t mean I don’t plan to do what I can to fight against what I fear is coming, but that I can’t let someone else’s small mindedness and hate turn me into a more small minded and hateful person.

    A small thing that I’m doing in order to work against those instincts in myself – that maybe would be useful to others – is to have a daily meditation practice. I’ve been doing this practice semi-regularly for a few months now. When I’m consistent I feel like it helps me have greater awareness, focus, and ability to handle my emotions in stressful situations. I believe that especially now, as things are so uncertain, this kind of clear-mindedness is something that is going to help us respond to the challenges which are coming in the most meaningful ways.

    I’m not an expert in meditation by any definition, but I can give a few tips and recommendations based on what’s helped me so far.


    My first recommendation is to go easy on yourself. You’re not trying to “clear your mind”, you’re going to miss days, and some days will be a lot harder than others. It will get easier. Just keep doing it.

    I’ve found starting with guided meditation to be useful. I use Headspace, but I’m sure there are other places to find guided meditation, and probably some free ones. The reason I like it is that it gives me some direction while meditating so I’m not sitting there wondering the whole time if I’m doing right.

    Reading books on Buddhism and meditation is a good compliment to the practice. You don’t have to be a buddhist to meditate, but knowing some of the philosophy is useful for taking your practice with you when you’re not meditating. By far the best book I’ve read is The Heart of the Buddhas Teaching by Thich Nhat Hanh. If you’re looking for a quick intro to meditation – and a little buddhism – Sit Like a Buddha by Lodro Rinzler is short, easy to read, and will get you started.

    If you can meditate with others, try it. The times I’ve gone to my local Zen Center, done their meditation class, and listened to their talks on Buddhism have been nice. If you have something like that, maybe check it out. Meeting other people who’ve been through or are going through the same things with their practice can help you stay motivated.


    This is a challenging time to stay calm, open minded, and clear headed. Many of us are living in a state of anticipatory grief right now and feeling like we will be for several months at least. It’s normal to feel this way, but it’s also important to realize that letting these emotions control us and make us catatonic, or lash out without thinking, is the least useful thing we can be doing to prepare right now. What we need is to find a way to give ourselves a little space from our emotions so that when the hit comes we’re ready to respond.

    → 4:08 PM, Nov 17
  • Washington Post Discount for Amazon Prime Members

    Going forward from the election it’s both important for us to support the free press and to be as informed as possible. Amazon Prime subscribers get a discount on a Washington Post digital subscription so it’s only $3.99 a month. I recommend it.

    We should all make an effort to get out of our Twitter/Facebook/podcast bubble and know what’s going on.

    → 8:18 PM, Nov 15
  • Stupid Rice Cooker Tricks

    A few weeks ago, I heard Merlin Mann and Dan Benjamin discussing rice cookers and how great they are on episode 294 of their Back to Work program. Because I am a ridiculous person who buys things on impulse, and because I am a vegan who eats a lot of rice and vegetables, I loaded up Amazon Prime Now and the next morning was the proud owner of a Zojirushi NS-TSC10. It wasn’t the least costly option, but I chose the Zojirushi because I wanted one that would be useful for doing things besides just cooking rice. Also it having a cute elephant on it, being from Japan, and playing “Twinkle Twinkle, Little Star” when it finishes cooking, might have had something to do with it. Hard to say.

    I’ve used it a lot. I’m sure the thing I’ve cooked the most in it is rice, but that’s not the only thing by any stretch. I thought I’d share a few of the things I’ve made.

    Chocolate Cake

    The weirdest thing I’ve cooked in my rice cooker was a chocolate cake. It’s not actually that weird. The rice cooker I bought has a “cake” setting on it and if you search Google for rice cooker cake recipes you will find many. I used this recipe for the chocolate cake and it turned out great. It was a bit less mess and cleanup than when I’ve made similar cakes in the oven came out at least as well, or possibly better. It was moist chocolaty, and delicious.

    Steel Cut Oatmeal

    Ever since I saw the episode of Good Eats about oatmeal, I’ve preferred steel cut to the regular mushy kind. The problem is that when you make it on the stove it takes about 45 minutes to cook with semi-regular stirring involved. It’s sort of a pain in the butt. If you follow this recipe from Zojirushi’s own website, you’ll let the oats soak overnight and use the timer function to have the oatmeal be ready when you wake up. Steel cut oats way easier than cooking them on a stovetop and just about as good.

    If you don’t wake up when you thought you would, the rice cooker can keep your oatmeal warm for a really long time, so it’s no problem.

    Rice Porridge

    My mom used to make something like this sweet rice porridge when I was a kid with left over rice from Chinese food, and I’ve made it a ton. It’s super easy to make.

    Combine a cup of cooked rice (brown or white is fine) with one cup of soy/rice/cow milk, a dash of cinnamon and nutmeg, two tablespoons of brown sugar, a teaspoon of vanilla extract, and heat the whole thing up in a pot until it’s hot. Then you eat it. It takes a few minutes to make and is delicious. I’m not going to say it’s good for you, but, it’s got to be better than a pint of ice cream.

    You can adjust the ratio of rice to milk to taste. I like it kind of thick, but you can also make it so it’s almost more like a hot beverage.

    → 10:00 AM, Nov 8
  • Replacing Dropbox With iCloud Drive

    I’ve been using Dropbox for several years, and I can’t remember ever having a serious problem with it. It’s just where my files go. Lately, however, I’ve started wondering if it’s something I need to keep paying for or have installed on my Mac. The main reason is that I’m already paying for another cloud file syncing thing – iCloud Drive. It may not have all the features of Dropbox, but I feel as though my use of those features has gone down a lot in the last couple of years.

    What's Changed

    There’s three things that would have kept me on Dropbox before recently:

    • Apps that rely on it.
    • Collaboration and sharing.
    • An uneasy feeling trusting iCloud Drive with all my documents.

    At least two of these things have changed a lot. I’ll go through all of them.

    Apps

    I used to use text editors like Elements or nvALT on iOS and Mac for notes, but I’ve been using Apple’s Notes app for a while now, and it’s just fine. Other apps like Byword and 1Password include iCloud syncing as an option. I’ve been using iCloud for those apps for a long time now and I can’t remember the last time I had an issue. It seems like either everything I use has added iCloud as an option or I’ve moved to something else.

    Collaboration and Sharing

    Dropbox definitely has better sharing options. Where iCloud has these features, I have no complaints. I’ve used the collaboration feature in Notes and it worked great, but that’s about the extent of my use. Mostly I’m just not collaborating in this way as much as I used to. At work I’m using Trello or Google Docs, and in the rest of my life this just hasn’t really come up.

    I’ll miss the ability to right click and generate a link for any of my documents, but Droplr seems like an okay replacement.

    If I was still using shared folders as much as I was a couple years ago, I’d definitely be more tied to Dropbox, but I’m just not, so this has become a bit of a non-issue for me.

    That Uneasy Feeling

    I’ve had no problem syncing the things I have through iCloud in the last couple of years, but I just don’t trust it the way I do Dropbox to keep my stuff. I have no evidence or strong reason to think that – just a general feeling of unease.

    Apple’s strategy has been to present everything as though nothing will ever go wrong with any of their software or services, and so the user doesn’t need a lot of tools to help recover when something does. Because it won’t. Ever.

    All of Apple’s services just feel opaque. iCloud drive isn’t great as far as letting me know the status of my documents. If it did break in some horrible way, I have no trust that I would have a good way to get my stuff back.

    Unfortunately I don’t see this changing.

    My solution is to make sure I’m backed up and hope for the best. I don’t really know what else I can do to move forward other than to keep paying for multiple cloud syncing services forever. Hopefully it all works out.

    Moving Forward

    Currently iCloud is in the middle of uploading a couple hundred gigabytes of data that was previously stored in Dropbox. When that’s finished, I’ll move my Dropbox account to the free tier and uninstall the app from my Mac.

    There’s going to be things that annoy me about iCloud Drive forever. I hate the way it gives each app that uses it a top level directory, and I really don’t like that it’s not just a folder in my home directory but instead has my files stuffed away somewhere non-obvious.

    The strange feeling I have is that I’m not moving because iCloud Drive has gotten better than Dropbox, or even that it’s gotten as good. I’m moving because maybe it’s become sufficient for my needs. I’m purposefully not using what’s clearly the best thing on the market, because I think I’m willing to live without some of it’s features. Hopefully it’ll be good enough.

    → 7:13 PM, Nov 7
  • What I've Learned in Four Months of Aikido

    I mentioned previously that one of the reasons I neglected to post here the last few months is possibly because I’ve been getting into other things and just haven’t thought about it. More than that, I think it’s that while I’ve thought a lot about the things I’ve been doing, I don’t really feel like I know enough about them to feel super comfortable speaking publicly about it. That’s probably a stupid reason not to write, but it’s mine.

    The main thing that I’ve been obsessed with the last few months is studying Aikido. I try to go four days a week, sometimes three, but not less than that unless something unexpected happens. I’d like to get up to five or six days a week, but I’m trying to moderate myself a little. Anyway – I’m pretty into it.

    Before I go on let me put a big disclaimer here that I’ve only been studying for a little less than four months, and so anything I’m about to say is from the perspective of a beginner who hasn’t even taken his first test yet.

    Aikido is a Japanese martial art which is primarily defensive. It was first created by a man named Morihei Ueshiba (also known as Ōsensei) starting in the 20s and 30s and was developed into what it is today in the couple of decades after World War II. Instead of trying getting into a position where you can strike an opponent or do a technique you had in mind on them on them, you’re seeing the direction their own energy taking them and working with that. At least that’s how I understand it so far. Like I said: I’m a beginner.

    There’s also what the call the “spiritual side” of Aikido. A lot of time in class is spent relating Aikido philosophy of blending with an opponent and not engaging energy head on to other parts of life. I find those parts pretty interesting and giving myself a framework that helps me be a little more disciplined and aware has been nice. If nothing else, getting out of the house and doing something physical with other people a few days a week is a positive development.

    The biggest thing for me, so far, has been to do something where in order to succeed I need to focus on the process instead of worrying where I’ll be in the future. I don’t feel like that’s always natural for me, but I’d like to make it that way. If I can just do the best I can every day whether it’s day ten or day ten-thousand, I’ll make progress in the time it’s going to take, and probably more of it too. I think if I could apply that elsewhere it would be really helpful for me. Something one of my teachers has said before is that they’re not just trying to make us better martial artists, they’re trying to make us better people.

    Whether or not I’m actually able to use any of what I learn to defend myself physically against a person who might try to harm me (I’m nowhere close to that) anytime soon is sort of the less important part to me if I can become a more focused, disciplined person. Being someone whose able to deal with conflict better and maybe also be a little less hard on themselves when trying something new is a pretty applicable life skill for me. I’d also like to get really good at the techniques, but, like I said, that’s sort of secondary.

    So, that’s what I’ve been up to the last few months. Like I said, I’m totally a beginner, and I will be for a long time. Mine probably isn’t the best description of what this whole thing is about, but it’s what I’ve gotten out of it so far.

    It’s been a good thing for me.

    Also I’ve been told my shoulders are looking pretty buff, so that’s sweet.

    → 10:24 PM, Nov 1
  • Breaking the Blogging Seal

    For no particular reason I haven’t kept up blogging the last few months, even though it’s been kind of a huge three months for me. Maybe because it’s been a big three months, I’ve had other things on my mind, and that’s why I haven’t posted. Anyway – I need to stop that momentum and get back to posting. So here it is. I’m breaking the seal. More soon.

    → 3:00 PM, Oct 25
  • My Request for Apple Music: Challenge Me a Little

    I use Apple Music for streaming. I try to give it as much data to work with as possible so it can recommend new music to me. If I like a song, I tap the heart icon. I’m pretty consistent about it. The problem is, as much as I do that, it doesn’t seem to be doing a very good job at helping me discover new music.

    Whenever I look at “For You”, what I see is a bunch of playlists which are either collections of songs by musicians I already know, or other things that sound exactly like the music I already know. If it’s going to be learning my preferences – and the preferences of millions of people like me – it’s got a ton of data to work with, and what I’d like is for it to be gently helping me broaden my horizons over time.

    What I get is: “You like music by sensitive people with guitars, here’s a whole lot of exaclty that.”

    What I want is: “We know you don’t usually listen to hip hop, but we really think you might like this.”

    Maybe the problem is that the super conservative choice is the right thing because most people just want to hear music they already know they like over and over again. But, for me, I feel like it’s a big letdown and makes these sorts of services a lot less useful and fun than they could be.

    → 1:42 PM, Jul 28
  • Stanley Kubrick Exhibition

    Last Sunday I had the opportunity to check out the Stanley Kubrick Exhibition currently at the Contemporary Jewish Museum here in San Francisco. I’m a big Kubrick fan and seeing the props, correspondence, and equipment presented as sort of a journey through his career was really interesting.

    If you’re in the area and at all interested in Kubrick’s work, you have until October 30th to go, and you definitely should. In the meantime, you can check out the Flickr album I created with some of the photos I took of the exhibit.

    Stanley Kubrick Exhibition//embedr.flickr.com/assets/client-code.js

    → 11:03 AM, Jul 25
  • Meat Is Killing Our Planet and We Won't Even Talk About It

    Producing meat is destroying the planet, and eating it is destorying our bodies. This isn’t crazy vegan hippie rhetoric – it’s the truth. This article in the Washington Post has lots of charts and information explaining how it is.

    Do I expect anyone who reads this or looks at that article to make any different choices though? Not really. But why? So many people – for whom eating meat is entirely optional – are willing to label others climate change deniers, shame them for what kind of car they drive, or refer to others as ignorant and uniformed. But these same people don’t even consider changing their habits, even though just the greenhouse gas effects of meat production are so much worse for the planet than all transportation combined.

    I’m not even going to talk about the way we treat animals, but that’s just as upsetting.

    Lots of things people do are bad for the planet, and I’m sure than I am no exception. But the fact is this one thing is so much more worse than anything else we do, and people barely even acknowledge it. It’s simple to me: you can’t be an environmentalist and eat meat. Those two things are contradictory. If people really cared about the planet or global warming as much as they say they do, they would be willing to take the one biggest step to actually have an impact. If you eat meat while failing to accept the impact your choices have, you not only are contributing to the problem, you are a climate change denier.

    Obviously, this topic gets me pretty worked up. But just being upset and calling others hypocrites isn’t an effective way to help anyone think about their choices, or encourage them to make better ones. So, besides the Washington Post article I linked to above, I want to recommend some things. Even if you have no intention to change, I think that if you’re going to make choices, you should be willing to learn about what those choices mean and reconcile that for yourself. At least then you’re making informed choices.

    Eating Animals by Jonathan Safran Foer

    This book is great because it doesn’t skip any details of what meat production is doing to the planet, or how we mistreat animals, but somehow keeps the writing approachable and even a little humorous. It also gives voice to both sides of arguments by talking to farmers, factory farmers, people at slaughter houses, humane meat people, etc, and lets them all say their piece without discrediting it outright.

    Cowspiracy

    This is a documentary – available on Netflix – which contains a lot of the same information in Eating Animals, and is also pretty light hearted, with less time commitment. The film goes over a lot of the data, interviews environmentalists and animal rights folks, and asks the same question I have: why isn’t this information more commonly known, and why aren’t environmental groups willing to talk about the single worst thing we’re doing to the environment.

    → 4:04 PM, Jul 7
  • Health Experiment (Week 1 Wrap Up)

    The purpose of this experiment is to find out what would happen to my body and mind over 30 days if I tracked my calorie intake and I replaced drinking with exercise and meditation. My hypothesis is that I will lose weight, become stronger, gain better focus, and have less anxiety.

    Body

    From the day I wrote the original post (6/21) I have lost 1.8 pounds and my body fat percentage has gone down 0.9%. The exercise I’ve so far is mostly yoga, walking, and some pushups using a 100 pushups program. I’m probably going to start running again though within the next day or two now that my knees are feeling better. Since your weight can change about 2 lb a day (I’m told), it’s a bit hard to put too much into those specific metrics after only one week, but I still think the results so far look pretty promising. Here they are on a line graph:

    Week 1 weight Week 1 bf

    The trend lines on weight and body fat are both pointing down (which is great). My weight kind of fluctuates up and down a bit each day, but like I said, I think that’s expected. The body fat % tracking actually seems to be going down a lot more consistently, which is the number I care more about, since if I’m replacing fat with muscle, that’s going to affect the amount of weight change I have.

    Mind

    I’d like to see my focus improve more (ADHD sucks), but my anxiety has definitely been improving in the two and a half weeks or so I’ve been practicing daily meditation. I feel as though between meditation and learning about Buddhism, I’ve begun to reflect the way I talk and act sometimes, and make some positive changes to help me become the person I want to be. I think we all get carried away and say things we don’t really mean sometimes, or exaggerate for comedic effect. I want to not do that anymore.

    → 1:45 PM, Jun 28
  • Health Experiment (Day 7)

    It’s the end of the first week! I’ll be following this one up with a wrap up post for the past days.

    Stats

    Weight: 167 (+0.4 lb / +0.24%)
    Body Fat %: 20.2% (-1.94%)

    Active Calories: 753
    Total Calories: 2661
    Calories Consumed: 2112 (549 Deficit)

    Exercise

    Vinyasa Yoga

    I am pretty certain that the Apple Watch is way underestimating how many calories I’m burning during yoga, but it’s the only tool I have, so here it is.

    Active Calories: 289
    Total Time: 1:12
    Avg Heart Rate: 102

    100 Pushups Program (Week 1, Day 3)

    • Count: 25 (5x5)

    Mind

    Meditation

    • 10m Headspace (Foundation 2, Day 7)

    State of Mind

    Felt a bit anxious and not as focused in the earlier part of the day, but did okay with both later on.

    → 12:42 PM, Jun 28
  • Health Experiment (Day 6)

    A relaxed Sunday. Walked enough to make sure I hit my move goal, but nothing else special.

    Stats

    Weight: 166.6 (+0.8 lbs / +0.5%)
    Body Fat %: 20.9% (-0.5%)

    Active Calories: 619
    Total Calories: 2452
    Calories Consumed: 1502
    Calorie Deficit: 950

    Exercise

    • Walked to hit Apple Watch move goal (460)

    Mind

    • Missed meditation. Nothing extraordinary to report.
    → 12:29 PM, Jun 28
  • Health Experiment (Days 4 & 5)

    I managed to miss blogging over the weekend – so I thought I’d just combine Friday and Saturday days into one post. I went to yoga at my gym Friday, which was great. The new sort-of-related thing I did this weekend was that I managed to make it to the San Francisco Zen Center at 8:40am to attend their zazen meditation introduction and dharma talk. I’m going to try to start going regularly if I can will my body up early enough on Saturday.

    Day 4 (6/24/16)

    Stats

    Weight: 165.3 (No Change)
    Body Fat %: 20.7% (-0.96%)

    Active Calories: 981
    Total Calories: 2889
    Calories Consumed: 1694 Calorie Deficit: 1195

    Exercise

    Vinyasa Yoga

    Active Calories: 438
    Total Time: 1:12
    Avg Heart Rate: 104

    Mind

    Meditation

    • 10m Headspace (Foundation 2, Day 6)

    Day 5 (6/25/16)

    Stats

    Weight: 165.8 (+0.24%)
    Body Fat %: 20.7% (No Change)

    Active Calories: 624
    Total Calories: 2483
    Calories Consumed: 1469 Calorie Deficit: 1014

    Exercise

    • Walked to hit my calorie goal (460).

    Mind

    Meditation

    • Unguided walking meditation.
    → 1:13 PM, Jun 27
  • Health Experiment (Day 3)

    No extra exercise yesterday. I still made sure I hit my move goal on my Apple Watch, but I’ve decided to not try running again for a few days because of the knee thing. When I do start again, I’m going to try just doing it on a treadmill at the gym so it’s a little lower impact.

    I have managed to keep up with my standing desk all week. It’s actually not that hard. I suspect if I were heavier to start or weren’t using a mat it would be worse. I sit during lunch, meditation, and other times during the day when I’m not at my desk. Otherwise I’m standing all day.

    No weight or meaningful body fat change. Since your body can fluctuate a couple of pounds day to day no matter what, I’m not actually too worried about if this number goes up or down slightly for at least the first week.

    Stats

    Weight: 165.3 (No Change)
    Body Fat %: 20.9% (+0.5%)

    Active Calories: 540
    Total Calories: 2450
    Calories Consumed: 1790 Calorie Deficit: 660

    Exercise

    Just walked enough to make sure I hit my activity goal (460) for the day.

    Mind

    Meditation

    • 10m Headspace (Foundation 2, Day 5)
    • Unguided Walking Meditation

    State of Mind

    Focus was a little better than the day before, but I can do better. Anxiety about the same (good).

    → 2:18 PM, Jun 24
  • Health Experiment (Day 2)

    I almost didn’t go to yoga yesterday because I was afraid it would cause my knees to hurt more, but I did and it ended up not hurting them at all. I’ll probably replace running with a brisk walk or a bike ride for the next couple of days.

    I started two new things yesterday. A guided walking meditation, and the beginning of a 100 pushup program. I might use the guide for walking one or two more times and then continue doing it unguided. The pushup program should have me doing 100 pushups in 5 sets of 20 in 10 weeks if I stick with it, but it started off at just 18, which wasn’t too hard.

    Stats

    Weight: 165.3 (-0.3 lb / -0.18%)
    Body Fat %: 20.8% (-0.48%)

    Active Calories: 1029
    Total Calories: 2924
    Calories Consumed: 1778 (1146 Deficit)

    Exercise

    Vinyasa Yoga

    I only have the Apple Watch activity tracking to go off of here, and I don’t know how accurate it is for yoga.

    Active Calories: 514
    Total Time: 1:07
    Avg Heart Rate: 115

    100 Pushups Program (Week 1, Day 1)

    Count: 18

    Mind

    Meditation

    10m Headspace (Foundation 2, Day 4) Headspace Guided Walking Meditation

    State of Mind

    Anxiety was good, but focus was less than I would have liked it to have been. I forgot to use my Comodoro timer, and I think that hurt me. I’ll have to make a point to use it consistently going forward.

    → 12:24 PM, Jun 23
  • Health Experiment (Day 1)

    Yesterday was a good day other than that my knees were still hurting from last week at WWDC, which made running less fun than it could have been. I don’t want to hurt myself, so I’m going to try switching to biking until they feel better. I also made a point after work to get things I could make for lunch so I won’t have to eat downtown as much. That should save make hitting my calorie goals easier (plus save me money – you wouldn’t believe the cost of food in SF).

    Stats

    Weight: 165.6 (-1.9 lb / -1.13%)
    Body Fat %: 20.9 (0.0%)

    Active Calories: 621
    Total Calories: 2485
    Calories Consumed: 1470 (1015 Deficit)

    Exercise

    Outdoor Run

    Active Calories: 210
    Total Time: 30:49
    Total Distance: 2.03 MI
    Avg Heart Rate: 176

    Mind

    Meditation

    10m Headspace (Foundation 2, Day 3)

    State of Mind

    Morning was okay for focus, but not great. After taking 10m out to meditate focus and productivity both improved and I felt less anxious. Going to try meditating first thing before I start work instead of waiting later in the day.

    → 12:13 PM, Jun 22
  • An Experiment to Get Healthy

    Back when I was working from home in Portland my weight didn’t fluctuate that much. I ate reasonably healthy food, and I rode my bike and walked a ton. Without trying, I stayed around 145-150 lb for years (which was perfect for me). Working at an office and living in San Francisco the past couple of years, however, it’s become something I do need to start thinking about.

    I’ve been using a FitBit Aria scale – which measures body fat percentage as well as weight – for about two years. According to FitBit, my weight was 147.1 lb (22.1 BMI) with 15% body fat in July 2014. As of last Sunday (June 19) it’s 168.9 lb (25.7 BMI) with 20.5% body fat.

    Something has got to change. I haven’t felt this uncomfortable in my own skin since high school. I hate it.

    The Causes

    Okay, moving on. The biggest things I can see that would be affecting my weight are:

    1. I was taking Adderall for my ADD a lot more consistently before I moved. It suppresses appetite. I really hope the only way for me to maintain a healthy weight isn't through drugs. I weighed less than I do now before I started taking it though, so it's pretty hard to be sure how much this could have affected things.
    2. I was walking and riding my bike more before I moved. The data I have for this isn't that good -- all I have is step tracking to go on. Steps seem pretty consistent, but the further back the less data I have. I also have no way to know how much I was biking.
    3. I'm eating out a lot more for lunch, and the food in downtown San Francisco isn't the healthiest.
    4. I've been drinking more than I was before. It's like all people do here. Plus wine is really tasty.

    My Plan

    I would like to not have to rely on Adderall for focus and maintaining my weight if at all possible. With that in mind solution is to try this experiment over the next thirty days and report the results:

    What would happen if I replaced drinking and sitting with exercise and meditation?

    Specifically what steps am I going to take? A few.

    1. Using a standing desk. I don't expect this to make the biggest difference by itself, but it seems like there's pretty good evidence standing is better than sitting. Every little bit helps.
    2. Do yoga at least 2 days a week at the gym.
    3. Run at least 3 days a week. I'm using a Couch to 5k app on my phone so I don't burn out or hurt myself.
    4. Track calories of everything I eat using MyFitnessPal.
    5. No Drinking. I'm not planning to quit drinking forever, but I think for the duration of this at least, I should just cut it out entirely.
    6. Perform daily meditation to help focus. I'm using Headspace because it's a guided meditation program meant for beginners which ramps you up slowly.
    7. Use a Pomodoro timer app to help stay focused while working.
    8. Blog my results every day. What activity I did, my weight, body fat, how I did with calories, and my state of mind.

    So, that’s my experiment. I’m looking forward to seeing how it will turn out.

    → 5:27 PM, Jun 21
  • Hello Sense, Allergies, and Better Sleep

    As I’ve written about before, going to bed and waking up early has been an ongoing problem for me as long as I can remember. I’ve had more success fixing my sleep issues the past ten days than anything else I’ve ever tried in the past. A lot of that has been due to what I’ve learned using this little ball called Sense that tracks my sleep, monitors room conditions, and has a Sleep Cycle style smart alarm clock. After everything I’ve tried, this feels the most like I’m actually close to solving this problem for myself. It’s a crazy feeling after struggling with sleep my whole life.

    Sense and pill

    I’d used a FitBit Flex as a sleep tracker in the past, but it wasn’t super helpful. As long as I remembered to tap it when I went to bed it did a good job of tracking how long I slept and how much I moved, but that wasn’t enough. I could see I was taking a long time to fall asleep, sleeping too long, and moving a lot gave me zero hints why I could sleep for twelve hours and wake up tired.

    The sleep tracking part of the Sense is similar to the FitBit, but has two things that make it better. First, I don’t have to remember to wear anything or tell it when I’m going to sleep (newer FitBit trackers are also automatic). The Sense has a tracker called the pill that attaches to your pillow and then you never have to think about again except to not accidentally wash it. Second, instead of just time and movement, Sense tracks the room conditions while I’m sleeping. I can use the report it gives me to maybe figure out what was going on during the night and why I’m I slept how I did. It also gives me a sleep score which – while I have no idea how it’s calculated – does usually seem to match up pretty well to how I feel the next day.

    Sense sleep log

    The report tells me: what time I went to bed, fell asleep, what phase of sleep it thinks I was in, when I was moved around, and if there were any noise disturbances during the night.

    It also tracks conditions in my room 24 hours a day and tells me if anything is unideal for sleeping:

    Sense room report

    I started noticing that there were several “noise disturbances” every night, so that seemed like something to investigate. I downloaded an iOS app called Sleep Talk which records noises while you sleep. I then tried to match up the times the Sense said there was a noise disturbance to the recordings to see what was going on. It would be nice if the Sense did this itself, but the app worked well enough.

    What did I hear? Snoring and labored breathing. I was “lucky” that I’d been suffering from especially bad sinus allergies and was even more congested than usual the day I got the Sense. Because of this I was able to see my sleep quality improve over the next few days as my congestion got better. I’ve never been able to breath well through my nose, and I’ve also always had trouble with sleep, but for some reason I’d never considered the two might be connected. I started reading online about breathing, and of course not breathing well affects your sleep. In fact, that’s probably why I could sleep twelve hours and still be tired – it took me that long to get enough quality sleep to be rested.

    I decided to do an experiment. I knew that Zicam nasal spray would clear out my sinuses instantly, but that I could only use it for a few days in a row. I used it before going to bed one night to see what would happen. I also read that sleeping on your side is better for breathing and that a pillow between your legs helps you stay off your stomach, so I did that too. The next three days that I took the Zicam before bed I woke up by 8:30am after about eight hours of sleep feeling fine and rested. That’s remarkable for me. I honestly can not remember having a change like this before. My Sense sleep score also went up (from the 70s to the 80s).

    Since I couldn’t take Zicam for more than a few days, I also began taking Claritin every morning (as well as D-6, B-12, and a daily multivitamin). The Claritin helps, but not as much as I’d like. After some research, I found out that Flonase is usually better for people with year round allergies, and so I’ve started taking that. It takes a few days to reach full effectiveness, but the initial results are promising.

    I don’t want to speak too soon, but I think I may have figured this sleep thing out.

    → 4:06 PM, May 12
  • Creating StoryWorth for iOS 1.0

    I’m really excited to announce that a new app I’ve been working on for several months has come out today. The app is called StoryWorth, and you can download it now. It’s a companion to the website of the company I work for. StoryWorth lets you collect and share (with recipients you choose) your family stories. To get started, you invite a storyteller (mom, dad, grandma, etc), and then we start sending them questions. They can answer through the app, email, or on the website with text, images, or audio. Once you’ve collected some stories, we can print them up in a nice book (you can pay to have audio transcribed) you can put on a shelf and keep forever, regardless of what happens to us. I should mention too that StoryWorth is a paid service. We’re not interested in showing you ads or selling your information.

    Oh, also, we have an app now. It looks like this:

    HomeStorytellerStory

    Design

    For the design, a big focus was accessibility. We have users as old as one hundred, so we could be pretty sure some of the people using the app would have limited mobility or vision. The default sizes for text in the app tends to be a little on the large size, but I also did my best to support Dynamic Type so that users who needed to could turn up the font size. I’m looking forward to taking the accessibility stuff even further in future versions.

    Aesthetically, we wanted to go for sort of a book feel, while still looking cool and app-like. We did that mostly by focusing on typography and restricting the color palette so that the content and actions really stand out from each other. We use a sans-serif font (Lato) in our primary red color (except in navigation and toolbars) for actions, and a serif font (Merriweather) for most content and long form text entry. Overall I’m really happy with how the design of the app turned out.

    When choosing what features the app would have, our goal for 1.0 was to get parity on the most important things (writing, reading) with the website. It’s not completely one for one yet, but it’s an awful lot of it. Having a solid basis of a native app is also going to let us do things that the website can’t do easily when it comes to things like recording audio, offline reading.

    Technical

    StoryWorth is the first app I’ve shipped that’s entirely written in Swift. In the beginning, learning Swift while writing the app probably slowed me down a little bit, but it didn’t take me very long to become productive. At this point I feel completely comfortable in Swift and think I made the right decision. Swift still has some rough edges, but there’s enough good there to make it an overall win. Mostly the problems I run into have to do with using it with the iOS frameworks, storyboards, and other things that came around before Swift existed.

    Speaking of storyboards: I don’t know, man. I used them, and I guess they made things easier, but I also sort of want to tear them out half the time. I hate how they’re stringly typed, I hate prepareForSegue:, and I hate how using them pretty much precludes being able to use non-optional properties in my view controllers. On the upside, they’ve improved a bit over time. Storyboard references make it easier to break up a big monolithic storyboard into many smaller ones. Setting up child view controllers is really easy in a storyboard too. I only used a static table view in one place, and it ended up needing some cells to show or hide conditionally, so that wasn’t especially useful. As cool as that is, it turns out I never end up having more than one or two static table views in an app.

    Going back to Dynamic Type, there’s a couple of things I did to implement that. The first was to create UILabel subclass which listens for content size category notifications and adjusts itself as needed. This worked pretty well for pretty much anywhere I had labels, but not for some other things. Dynamically sizing table view rows were also a godsend, since all I had to do was set up my constraints and the table view would do the right thing if the font of it’s contained labels got bigger. Overall, I found working with Dynamic Type sort of a pain when it comes to native views. I’d like to come up a better solution in the future that will make it easy for me to support it in the places I didn’t get to in 1.0.

    I do use web views in a couple places in the app though, and it turns out supporting Dynamic Type in those is crazy easy. All you have to do is use one of the -apple-system styles for your CSS font property, set font-family and font-size (in em) to whatever you want. Make your controller listen for UIContentSizeCategoryDidChangeNotification, and whenever a notification comes in, reload the web view. Easy. There’s a good post about it on the official WebKit blog.

    Grab Bag

    • UIStackView is rad.
    • Protocol extensions are neat and useful.
    • The new Swift selector syntax doesn't like nil targeted actions.
    • Carthage breaks much less than CocoaPods for me.
    • I love universal assets.
    • I don't know if I'm going to stick with Core Data.
    • Color spaces are confusing.
    • App review remains a magical experience.

    Conclusion

    I took a job at StoryWorth because I wanted to work with nice people on something that’s actually useful, whose business model I understood, and where I could have a big impact. It’s been a while now, and I really like it still. I’m excited to improve the app over the next several months. Please download the app and invite your family. There’s a free trial, and if you decide to subscribe it helps us a lot. Getting to know your family and having something to hold onto forever is something you’ll thank yourself for.

    → 4:30 PM, Apr 5
  • Reducing Cognitive Load of Code

    I found this post called “How to reduce the cognitive load of your code” through Gus Mueller’s blog, and I wanted to endorse it as well.

    A good set of guidelines are: don’t be cute, don’t use weird formatting, keep it simple, and really, really, don’t be cute.

    → 2:51 PM, Mar 29
  • My Weekend With Twilight Princess HD

    I spent a good part of the weekend playing The Legend of Zelda: Twilight Princess HD that came out Friday for Wii U. I played the Wii version of Twilight Princess a bit, but bounced off of it because I found the motion controls tedious. This remastered version is based on the GameCube controls, and so it’s all buttons instead of waggling a Wii remote at the screen.

    Besides Link glowing in one scene for no apparent reason, the updated graphics look fabulous. While I don’t find the art style quite as appealing as what they did with Wind Waker HD, and the graphical fidelity is nowhere near something like The Witcher 3, I haven’t ever felt like I’m looking at a ten year old game. If anything it’s exceeded my expectations graphically. Some of the controls have aged less well, but nothing that makes playing the game not fun. The two control issues I’ve noticed is that the camera will sometimes do strange things, and getting Epona to turn around is painful.

    Anyway – I’m going to be playing more of it this week. If you have a Wii U and like Zelda games, definitely check it out.

    → 3:12 PM, Mar 7
  • Moving From Parse to OneSignal for Push Notifications

    Parse is shutting down, and if you want your app to keep working, you’ll need to move to something else. I’d recommend doing it sooner than later. Thankfully our app isn’t out for another few weeks, and since the only thing we were using Parse for was push notifications, it wasn’t more than a couple hours of work to switch over to something new. The thing we found to handle our push notifications was One Signal.

    Aside from Parse I’ve also used Urban Airship, Push IO, and a custom push server. Custom was definitely the worst. If I were writing the backend myself, custom might not have been so bad, but since I was always working with other developers, it was always a pain because it required involving someone else to test the thing and there was always something wrong with the certificate setup on the server. Out of all of those OneSignal has been the easiest, followed by Parse. I like OneSignal better than Parse though because it’s just push instead of one part of a larger thing that sort of expects me to be using their whole platform.

    → 4:37 PM, Feb 1
  • Email Validation String Extension

    I’ve been using this extension on on String to make checking if a string is a valid email easy. If you know a better place this could live, let me know, but an extension on String felt as good a place as any. I didn’t write the original regex (although I did need to tweak it to make addresses with + in them work), but I’ve tested it and it works well as far as I can tell.

    extension String {
        func isValidEmail() -> Bool  {
            if self.isEmpty {
                return false
            }
    
            guard let regex = try? NSRegularExpression(pattern: "^([a-zA-Z0-9_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", options: []) else {
                return false
            }
            return regex.numberOfMatchesInString(self, options: [], range: NSMakeRange(0, self.characters.count)) == 1
        }
    }
    
    → 6:44 PM, Jan 28
  • Less Gross Storyboard Segue to a Navigation Controller

    This is a really ugly piece of code I’ve found myself writing in Swift whenever I’m preparing a storyboard segue where the destinationViewController is a UINavigationController whose root view controller is the thing I actually need to set properties on:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let viewController = (segue as? UINavigationController)?.topViewController {
            // Set up the view controller
        }
    }
    

    And so I decided to make this slightly less terrible by adding this category to my app:

    extension UIStoryboardSegue {
        var navigationController: UINavigationController? {
            get {
                return destinationViewController as? UINavigationController
            }
        }
    }
    

    So now that ugly line becomes this:

    if let viewController = segue.navigationController?.topViewController {
            // Set up the view controller
    }
    
    → 6:12 PM, Jan 27
  • Streaming Zelda This Weekend

    I’m planning on finding time tonight and this weekend to stream the last five dungeons of “The Legend of Zelda: A Link to the Past” this weekend on Twitch… along with full color commentary (probably a lot of swearing when I die for the sixth time). If you have their iOS app installed, you can subscribe to my Twitch channel to get notified when the stream starts.

    → 1:46 PM, Jan 22
  • In Praise of Non-Magical Pointing Devices

    Last week I tried playing a game on my Mac for the first time in a long time. About a minute in I realized that a trackpad or Magic Mouse was not going to cut it. I needed something with actual separate buttons that click. The one I landed on, after reading a few positive reviews, was the Razer DeathAdder Chroma. Yes, I agree the name is ridiculous. I choose not to focus on that.

    I like it for a few reasons:

    • It's the number one gaming mouse on Amazon, but doesn't look too much like a gaming mouse, which is good, because I couldn't look at one of those and take myself seriously.
    • It only has two side buttons, which is just the right amount for me. I bound them to back and forward in Safari, Xcode, etc.
    • The driver software is fantastic for the tiny bit of tweakiness I want (assigning those side buttons), and also totally Mac compatible. You can even easily set different button configurations for different apps, and it will switch automatically.
    • It feels pretty good in my hand. The buttons feel nice and clicky, too. The Magic Mouse gives me hand cramps.
    • It was only $50.

    The things I miss are interial scrolling and gestures. But those suck on the Magic Mouse anyway, and are easily fixed by placing my trackpad on the other side of my keyboard for gestures.

    → 3:25 PM, Jan 4
  • Finally, Peace Returns to Hyrule

    I’d never beaten the original Legend of Zelda before. It’s a hell of a game. Really hard, too.

    WVW69iuMEjkuxhIyk3.jpeg

    Surprising open world games with a save feature never really caught on after it.

    → 12:07 AM, Dec 30
  • The "Why Am I Anxious?" Checklist

    I’ve come up with a list of things I should ask myself and do if I’m feeling anxious or antsy. Here it is:

    1. Did I not have any coffee today? Have some.
    2. Have I had too much coffee? Drink some water. Take a walk.
    3. Did I sleep not enough or too much? Keep working on that.
    4. Am I worried what someone is thinking of me? Talk to them.
    5. Am I worried about something I'm not doing? Stop worrying and do some of it.

    No matter what:

    1. Remember you're not stupid and people like you.
    2. Drink some water and take a walk.
    → 5:52 PM, Dec 14
  • Brent Harping on Swift Limitations

    Brent is harping on limitations you hit when trying to use protocol oriented programming in Swift:

    But these days we’re smarter: we use protocols. There’s no reason Folder and File should descend from the same class — they’re almost entirely different, and inheritance is a pain to deal with, so we use protocols instead. And we’re happy. It works great. Until you realize that, in Swift, you can’t do this.

    I hit something like this yesterday. So no, it’s not just him.

    → 4:25 PM, Dec 11
  • How John Zeratsky Became a Morning Person

    This post on Medium by John Zeratsky echoes a lot of what I’ve felt, and what I’m trying to get to. This part describes how I’ve been my entire life:

    It didn’t come naturally to me. When I had to wake up early—for a meeting, an event, or class—it was like the vignette above. I struggled to get out of bed. Often I barely made it to my engagement on time. And that rushed, zombie-like morning loomed over my day like a hangover.

    John also was motivated by the same thing I am though; the promise of how much more you can get done by being a morning person. Whether I like it or not, the world isn’t likely to adjust to my natural schedule, so if I want to get by in it, I need to figure out a way to change this about myself. Missing mornings – or being awake but useless for them – means I’m missing a couple hours every day I could be participating in the world, or doing something good for myself. The best part is that it worked for John, and he’s kept it up:

    It worked. I traded a typical night-owl schedule—up ’til midnight or later, staring at a screen, writing, doing design work, coding—for an uncommon routine where I go to sleep early, wake up early, and get a lot of work done in those quiet morning hours.

    If he did it, maybe I’m not hopeless.

    → 2:06 PM, Dec 11
  • Spreadsheets Are Cool

    I’m not accountant, I don’t financially analyzing anything besides my personal budget, and I have almost no occasion in my work to ever use one, but I get excited about pretty much any time I can think of a use for a spreadsheet. There’s a lot of times where a spreadsheet can replace an app made to do the same thing. A lot of the time the spreadsheet will be even better, because it’ll be customized to just the fields you need. Plus Numbers/Google/Office all sync now – which isn’t at all a given with apps. And if something I’m tracking becomes cumbersome with a spreadsheet, it could turn into a great proof of concept for my next app.

    Let me give some examples.

    Sleep Journal

    As I wrote about in my last post, I’m currently in the process of trying to fix my sleep schedule and become more of a morning person. The way I’m tracking that is with a Fitbit Flex I wear to bed and a spreadsheet that I keep in Numbers. Fitbit tracks most the data I need, but not everything (what time I put on my blue blocking glasses and misc notes). Also, leaving that data locked into Fitbit doesn’t help me if I want to analyze my habits overtime with charts, or if I want to share that data (in a future blog post, for example).

    Commute Journal

    To get from my apartment in the Sunset District (also known as Mars) to downtown San Francisco and back, there’s a few routes I can take, and I’d like to know which one is the best. What I’ve started doing is tracking my trips by using the iOS clock app and marking laps at points I want to track (when I get on/off public transit). This way I can track the average time each route took, how much time I spent walking versus public transit, and maybe if there’s a way to combine those segments differently to cut a few minutes off my travel time.

    Car MPG & Maintenance

    I don’t currently have a car, but I do have an RV. I track what kind of mileage I’m getting, and also when there’s maintenance done. When you’re driving around in a 27 year old vehicle, it’s best to stay on top of these things. If I see my gas mileage tank, I start to think there might be something up, and I take it in to get looked at before anything gets too bad. I used to use the app Gas Cubby for the same thing, but since it stopped being updated, Numbers has done the job just as well.

    → 1:31 PM, Dec 11
  • Fixing My Messed Up Sleep Schedule

    Sleep has always been a huge problem for me. My issue isn’t that I don’t sleep enough, it’s that I can’t sleep at night or wake up. If you don’t have a problem like this, that might sound stupid, but I’ve been like this as long as I can remember (at least since junior high). I’ve talked to a doctor before who thought I might have delayed sleep phase disorder, but haven’t gone so far as to do a sleep study.

    Things I’ve tried are a sunrise alarm clock, a blue light I shine on my face in the morning, and over the counter sleep aids. They all helped somewhere between not at all and marginally. Last night, I tried something new: blue light blocking glasses. During the day, blue light from the sun tells your body it’s time to be awake and you start producing serotonin. At night the lack of that light tells your body to produce melatonin, which makes you sleepy. That’s what directs your circadian rhythm, which makes total sense evolutionarily. Unfortunately we didn’t evolve with televisions, household lights, and iPhone’s that produce that same kind of light in abundance. If you’re around any of those things, your body won’t produce melatonin and it will be harder to fall asleep (I’m sure this affects some people more than others). This web page explains it in more detail if you don’t want to just take my word for it. Anyway, I bought some glasses block blue light that I can wear in the evening to my body does the right things.

    They are also the nerdiest looking things I have ever seen:

    Blue light glasses

    Never having company over in the evening again aside, the first night appears to have been a success. I started wearing them when I got home from work and was able to fall asleep earlier (surprising since I only woke up 11 hours before), and woke up the earliest I have in months (an hour before my alarm!) feeling fine. It would be sort of amazing if a $20 pair of yellow glasses really does that much to solve a problem that’s been ongoing for most of my life. My plan is to track my sleep (I love any excuse to make a spreadsheet) for the next couple of weeks and report back with the results. I also bought a new bulb for my sunrise alarm clock, so I’m going to start using that again, and I’m going to stop drinking coffee except in the morning.

    Excited to see how this goes.

    → 3:41 PM, Dec 4
  • Cultural and Unconscious Biases

    This post by eevee is specifically talking about video games, but I think a lot of it is a good characterization of discriminating behaviors, why they persist, and what people who don’t get it (saying “other side” feels wrong), don’t get. This part kind of jumped out at me:

    There are, of course, also cultural biases that tip the scales towards people who are white or male or cis or whatever. But even if you don’t buy that, it shouldn’t be a stretch to think that there really are overt cartoon sexists out there in the world who are just not vocal about it. Some of them might be judges or managers or politicians. Some of them might even make video games. You might think of them as weighted coins that always come up heads. And therein lies the problem. You have 100 coins. You flip all of them. 60 come up heads. How many are weighted? 10, you might think. And you’d be wrong, because 60 heads is entirely possible, so you can’t actually be sure any of them are weighted! But there’s a much bigger problem: which 10?

    I pretty much refuse to believe there is any such thing as a “meritocracy”, because even people with good intentions have unconscious biases. Good intentions (we just want to hire the most qualified candidate) aren’t enough to do the right thing. You need to actively and conscientiously work against unconscious feelings that you may have never even been aware exist. It’s really hard and it takes a lot of practice.

    → 2:37 PM, Dec 4
  • A Reasonable Take on Gun Control

    This article on Huffington Post lays out what I think is an extremely a reasonable take on gun control in the US, with action steps that don’t sound like they should be impossible (but probably are).

    Here's some common sense for you. I want gun ownership to be as boring and annoying as car ownership. I want you to go to some Department of Weapons and sit for hours. I want folks who own guns to prove their skill, their mental and physical health, and to be licensed and reviewed over the years just as happens with our driver's licenses. You earn the right to own and drive a vehicle; earn the right to own and use a gun.

    I take Adderall as medication for ADD. It works for me. Getting ahold of it was a pain in the ass, not just the first time, but every time. First I had to find a doctor who would prescribe it to me, which wasn’t easy, and once I did explain what I was feeling in such a way where they wouldn’t think I was looking to score (I tried non-stimulant medication first. it didn’t work). Then I had to get my insurance to pay for it. Having achieved those goals, I now have to take a physical prescription to the pharmacy every month. Also my doctor is in Oregon, and I’m in California. Since Adderall is a controlled substance, they won’t fill my prescription here. I fly to Oregon once a month to fill my prescription because that’s easier than going through the whole process of finding a doctor again.

    There’s some potential for abuse of the medication I take (although much less since I take the extended release version). Anyone probably shouldn’t be able to just buy it over the counter. But for fucks sake, why is it easier to get a gun – who’s only functional purpose is to take another persons life – than for me to get medication that helps me stay productive and focused and was prescribed by a doctor?

    → 6:21 PM, Dec 3
  • Quickies for NSString

    A list of what the title says from Mark Dalrymple. I’m sure he created this years ago, but it’s new to me. I’m considering putting this in my favorites bar. As an aside; it’s sort of amazing 8 years in how often I find myself reading the docs for NSString.

    → 6:13 PM, Dec 1
  • Brent's Post About Social Anxiety

    Brent wrote a post that pretty much describes how I’ve felt my whole life. This part grabbed me:

    I hated school even through my couple years in college. And here’s what that kindergartener’s fear turned into: the conviction that most people are likable, but that somehow I’m marked, and people can tell instantly, just by looking, that I’m not likable.

    This feeling of being marked, of being obviously unlikable in some fundamental and obvious-to-everyone way, persisted into my early 20s.

    The difference for me is that this feeling has continued to persist (I’m 30). There’s a few assumptions I’ve held onto for long enough that I don’t even have to think about them consciously:

    • None of my friends like me as much as I like them.
    • Others have a strong sense there's something wrong with me.
    • If I ever really needed help, I'd be on my own because no one else deep down really cares what happens to me.

    If someone as instantly likable and personable as Brent could have some of those same feelings, then maybe I’m not really all that bad either? I can’t believe I’m actually sharing this with other people.

    → 1:32 PM, Oct 23
  • Overcast 2

    Overcast 2 by Marco Arment is now available on the App Store. I’m sure I use Overcast more than any other app on my iPhone, and I think people are going to really dig the new streaming feature. Since I think I’m one of the people for whom streaming isn’t really a big deal, my favorite feature is the ability to support Overcast by actively (and optionally) patronizing the app. None of the features are locked behind a paywall anymore, if you like the app, give what you think it’s worth. I’ve already done it.

    Marco explains why he went this way on his blog:

    80% of my customers were using an inferior app. The limited, locked version of Overcast without the purchase sure wasn’t the version I used, it wasn’t a great experience, and it wasn’t my best work. With Overcast 2.0, I’ve changed that by unlocking everything, for everyone, for free. I’d rather have you using Overcast for free than not using it at all, and I want everyone to be using the good version of Overcast.
    → 3:56 PM, Oct 12
  • Auto-Incrementing Build Number Script

    I got this from somewhere I can’t remember. I’ve been using it a while and it works very well. I have it setup so that it will happen whenever I archive a new build for beta or release. You’ll want to change those configuration names to whatever your configuration names are in your project.

    if [ "${CONFIGURATION}" = "Release" ] || [ "${CONFIGURATION}" = "Ad Hoc" ]; then
        buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
        buildNumber=$(($buildNumber + 1))
        /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
    fi
    

    Add a “run script” phase to your targets build phases with this script and put it just below “Link Binary With Libraries”.

    → 1:22 PM, Oct 9
  • Functions as Factories

    Cocoa at Tumblr:

    Factories are a fairly well understood design pattern in software development. The benefits of using factories include:
    1. Abstracting constructors away from clients.
    2. Encapsulating data that clients do not need to know about.
    3. Allowing for more testable code by enforcing the idea of passing objects into initializers instead of referencing singletons directly.
    This post will show the power of a few Swift features as well as of first­-class functions.
    → 3:36 PM, Oct 8
  • What's new in OS X El Capitan

    I was asking on Twitter if there was anywhere to get an overview of what’s new in El Capitan that isn’t book length. My friend Andrew graciously pointed out that in fact there is… and it’s Apple’s own marketing page for the release. Duh.

    → 4:50 PM, Sep 30
  • Dynamically Sized Table View Header or Footer Using Auto Layout

    I’m trying to support Dynamic Type everywhere I can in my new app. Auto Layout and self sizing table view cells (buggy as they are) makes that a lot easier for the most part. Still, there’s other places that just setting up constraints and changing the font size of a label isn’t enough. The one I’ve just dealt with is a table view header (UITableView().tableHeaderView) with text in it. If I do nothing but set up my constraints and set the header view, the font size changing will just cause extra space to appear or my text to get cut off.

    The solution was to override UIViewController().viewDidLayoutSubviews(), get the proper size of the header view based on it’s constraints, set the frame on the header, and reset it as the table header view.

    It took me a little while to figure this out, so here’s what I did:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        // Dynamic sizing for the header view
        if let headerView = tableView.tableHeaderView {
            let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
            var headerFrame = headerView.frame
    
            // If we don't have this check, viewDidLayoutSubviews() will get
            // repeatedly, causing the app to hang.
            if height != headerFrame.size.height {
                headerFrame.size.height = height
                headerView.frame = headerFrame
                tableView.tableHeaderView = headerView
            }
        }
    }
    
    → 4:26 PM, Sep 29
  • You Can Do This In Swift

    This isn’t a hidden feature or anything – it’s just how optional binding works – but I guess what I didn’t get before was that this (responseObject’s type is AnyObject):

    func fetchUserInfoWithCompletion(completion: (ErrorType?, [String: AnyObject])->()) {
        executeGETRequestForURL(userInfoURL) { error, responseObject in
    
            guard let dictionary = responseObject as [String: AnyObject], fooInfo = dictionary["foo"] {
                completion(error)
            }
    
            completion(nil, fooInfo)
        }
    }
    

    Could become:

    func fetchUserInfoWithCompletion(completion: (ErrorType?, [String: AnyObject])->()) {
        executeGETRequestForURL(userInfoURL) { error, responseObject in
            completion(error, responseObject?["foo"] as? [String: AnyObject])
        }
    }
    

    So much better. So much code to delete now. Put this under the category of “things I can’t believe I didn’t get until now.”

    → 5:01 PM, Sep 23
  • The Growing iOS SDK

    David Smith writes about how much the iOS SDK has grown over time. One thing that was interesting is that more “SDK elements” were added in iOS 8 than iPhone OS 2 (which is crazy).

    The last paragraph echoes something I’ve felt for a while:

    There was a time when I felt like I knew my way around pretty much every non-game SDK available on iOS. Now I often find myself stumbling across frameworks that are completely foreign to me, which is both kind of exciting but also extremely daunting.

    I suppose that’s normal. I can’t tell you how often I find out about a “new” API only to realize it’s been around since iOS 5.

    → 3:03 PM, Sep 3
  • NetNewsWire 4

    The best is back! The folks at Black Pixel have shipped NetNewsWire 4 for Mac and iOS. I’ve already bought it from the App Store and it looks great.

    Congratulations to all of my friends at Black Pixel for getting this out the door. It’s been a long road, and I’m glad to see their work paying off.

    → 2:54 PM, Sep 3
  • Follow Me on Twitch

    I’ve been streaming games I’m playing on Twitch a fair amount lately. If you’re into that sort of thing, you can follow me there.

    → 3:00 PM, Aug 31
  • Acorn 5

    It’s a couple of days back now, but Flying Meat has released a new version of their fantastic image editor: Acorn. I’ve used Acorn for my work and personal projects since version 1.0 in 2008, and it’s incredible to see how far it’s come while still keeping the simplicity that made it so appealing in that first version.

    Gus is a friend – so don’t tell him I said this – but to me he’s always been the epitome of the one person indie who’s both a world class developer and also a fantastic designer. Check it out.

    → 12:37 PM, Aug 25
  • UITableView Extension to Deselect Selected Row

    Nothing fancy. Just a tiny little extension method that makes doing this in Swift slightly nicer.

    import UIKit
    
    public extension UITableView {
    
        public func deselectSelectedRowAnimated(animated: Bool) {
            if let indexPath = indexPathForSelectedRow() {
                deselectRowAtIndexPath(indexPath, animated: animated)
            }
        }
    
    }
    
    → 3:50 PM, Jul 23
  • Answers Events by Crashlytics

    I’ve used Crashlytics for beta testing my new app, including their lightweight analytics-thing Answers. It’s cool in that it shows you the most relevant data, but I was never going to be able to sell it as a replacement for Flurry or Google Analytics (which I loathe). Today they announced Answers can do event tracking, and on top of that it looks fabulous. The web UI makes it really easy to see and add the most common kinds of things I’d actually want to track, and the iOS SDK looks like it was made by people who have written Cocoa before.

    Hopefully Twitter can keep from fucking this up.

    → 2:36 PM, Jul 23
  • Fix Broken Swipe to Go Back With Hidden Navigation Bar

    Occasionally you need to a show a view controller as part of a UINavigationController stack where you want the navigation bar hidden. Unfortunately, hiding the navigation bar breaks the swipe right to go back feature.

    You can fix it by doing this in your viewDidLoad method:

    navigationController?.setNavigationBarHidden(true, animated: true)
    navigationController?.interactivePopGestureRecognizer.delegate = self
    → 6:00 PM, Jul 22
  • Swift NSManagedObjectContext Extension to Delete All Core Data Objects

    I made this NSManagedObjectContext extension so that I could delete all of a users data when they log out of the app I’m writing. The alternative was to delete the sqlite file itself and reinitialize my Core Data stack, but that seemed potentially more problematic and less safe.

    The two instance methods on NSManagedObjectContext for deleting objects are:

    • func deleteAllObjects(error: NSErrorPointer)
      • Delete all objects in a context. Bails out and returns an error if there's any problems.
    • func deleteAllObjectsForEntity(entity: NSEntityDescription, error: NSErrorPointer)
      • Delete all objects of an entity type. Bails out and returns if there's an error.

    I also included a convenience initializer for creating a new context with a parent. The way I use the deletion methods would be to create a private queue child context, block out the UI while this is going on with an activity indicator or something, and then call deleteAllObjects(_:) on the child. If there’s an error, you can just throw away the child context, and otherwise save your main context and commit it back to the store. Like this:

        func deleteEverything() {
            let mainContext = self.managedObjectContext
            let workerContext = NSManagedObjectContext(parentContext: mainContext, concurrencyType: .PrivateQueueConcurrencyType)
    
            workerContext.performBlock {
                var error: NSError?
                workerContext.deleteAllObjects(&error)
    
                if error == nil {
                    mainContext.performBlockAndWait {
                        mainContext.save(&error)
                    }
                }
    
                if let error = error {
                    println("Error deleting all objects: (error)")
                }
            }
        }
    

    Here’s the code for the extension:

    https://gist.github.com/collindonnell/4d082298a86e0f1d1a51.js

    → 4:16 PM, Jul 22
  • Kourosh Dini Talks GTD and OmniFocus on Mac Power Users

    Kourosh Dini wrote the book everyone using OmniFocus should read called Creating Flow With OmniFocus. Seriously, I can’t recommend it enough. Another thing I recommend is listening to the most recent episode of Mac Power Users where they have Kourosh on. He talks about how he does GTD, and a little OmniFocus specific stuff too. I’ve kind of fallen off the wagon a bit lately, and this has made me decide to get back on and get my system in order. I should stick a task in my inbox to remind me to blog about that.

    → 4:13 PM, Jun 24
  • Daniel Jalkut on Apple News

    Apple News And The Open Web | Bitsplitting.org:

    I’m optimistic that Apple’s News app will be a strike against centralized services such as Medium, Twitter, and Facebook. A strike against signing over content to a 3rd party mediator for the sake of a greater chance at connecting to an audience. Apple may not be the world’s best technology company when it comes to either storing data or building a social network around it, but they are damned good at building a captive audience of delighted users who trust the company to provide access to a variety of 3rd party content.

    Calling iMessage an impressive social network is a bit of a stretch considering my messages still sync across devices in seemingly any order. I don’t know if the News app is going to pull anyone who’s dedicated to RSS away from it, but it might be great for those who aren’t.

    → 5:42 PM, Jun 15
  • The Kinect is dead

    Ben Kuchera writing for Polygon:

    The real story though, or at least the lack of story, is that the Kinect is well and truly dead.

    When the Xbox One launched you couldn’t buy one without a Kinect. Microsoft knocked it out of the park with their E3 announcements today, but missing was any mention of the Kinect. They’re also dropping the price on the Xbox One bundles which don’t come with it, but not on the ones that do. I don’t know if “dead” is the right word, but it’s certainly on life support.

    Having used an Xbox One both with and without a Kinect, I think it’s kind of a shame that the Kinect hasn’t done better. Without it the Xbox interface is kind of hard to get around. With it, it’s great. I use the voice commands to pause video, raise or lower volume, use the snap feature, and go to apps all the time.

    I don’t see how anyone who’s used an Xbox One both ways could not prefer having a Kinect. That’s not enough though. It’s still not strictly necessary, expensive, and doesn’t make the games themselves any better (which is the reason people buy game consoles). Microsoft had a cool thing that they did a bad job making a case for, and now it’ll probably just kind of fade away until it’s axed in the next console revision.

    Oh well. We’ll always have this bullshit vaporware promotional video of the first Kinect from 2009:

    [youtube www.youtube.com/watch

    → 5:36 PM, Jun 15
  • Core Data Programming Guide Updated

    I’ve used Core Data in most apps I’ve written since 2009, and I’ve felt for a long time is that the documentation was pretty lacking and out of date in a lot of places. I haven’t read it yet, but Apple has updated the Core Data Programming Guide today to “reflect current best practices and APIs.” I’m hopeful that things are getting a little better, but there’s apparently no reference to Swift, so, who knows.

    → 4:17 PM, Jun 9
  • Tools and Toys

    Tools and Toys is a website run by the incomparable Shawn Blanc which is sort of like if The Wirecutter and a regular blog had a baby. They publish just the right amount of content that you can keep it in RSS without getting overwhelmed while still getting a lot out of it.

    → 3:46 PM, Jun 9
  • Cool Nylon Apple Watch Band

    These nylon bands from Monowear look pretty sweet. They remind me a lot of the bands I used to wear with my Timex. The site doesn’t say if they’re using the Apple lugs or not, but if they (otherwise I’d be scared of causing some kind of damage) are I’ll definitely get one.

    Monowear watch band

    → 2:50 PM, Jun 2
  • Optional Punctuation in Swift

    All of the punctuation in Swift looked pretty weird to me until recently, but now that I get it, I’ve really learned to appreciate how great the syntax actually is. The way I think of it is this: if you’re using ?, you’re asking a question, and when you use ! you’re asserting that you already have the answer. Of course, for the second case, you need do need to be sure or your app will blow up.

    So, for example:

    Asking a Question

    if let foo = dictionary[“foo”] as? String { … }

    Is the value for the key “foo” a string? If so, assign it to the constant foo.

    delegate?.objectDidSomething(self)

    Do I have a delegate, and can it respond to objectDidSomething:?

    Making an Assertion

    managedObjectContext!.save(&error)

    I know that managedObjectContext is not nil.

    let foo = bar as! String

    I know bar is a string, so nothing will go wrong casting it.

    → 2:28 PM, May 5
  • A Few Apple Watch Thoughts

    • Scratches show up on stainless steel easier than I expected. Thankfully it's pretty easy to polish them out.
    • WatchKit apps have a lot better performance than I expected. Based on Twitter, I thought they'd be pretty much unusable.
    • Parts of the UI are a bit laggy, but I suspect that'll be fixed in a software update.
    • The screen switching on automatically really only works when you're standing with your arms at your side.
    • If I don't wear the band fairly tightly, I miss taps.
    • I love not having everyone around me know when I get a notification.
    • Not having to fish my phone out of my pocket to find out why it's buzzing is just as great as I hoped it would be.
    • I would really like a way to know who in my address book has an Apple Watch.
    → 5:31 PM, May 4
  • Real-World Testing with XCTest

    Kind of old now, but I really like this post from the August issue of objc.io. The two things that stood out for me was that it used XCTest instead of a third party testing framework, and that it gives real examples of how to approach which tests to write. I’ve been totally totally on board with the idea of unit testing for a long time, but my biggest hurdle has always been knowing what to test. Thinking of what tests to write in terms of Given-When-Then pattern they go over has given me some new ideas.

    → 3:07 PM, Apr 6
  • Trying Swift Again

    On my most recent project, I decided to try going Swift from the start. I did the same thing when I started working on a rewrite of the Lovely app around the end of last summer, but found the tools too immature then. This time I’ve spent about a week with it, and everything seems is working out fine (so far). I’ve tried to keep up reading about the language itself, so the syntax hasn’t held me back much. One difference between now and the last time I really dove into Swift is that either something in my brain has clicked regarding optionals, or the language changed a bit over the past six months to make optionals align with my brain more. I still can’t what the debugger commands are.

    The other day on Twitter, I was part of a discussion comparing Swift to Objective-C. My feeling is that Swift isn’t better, but some parts of it are delightful to me, and I like it. For example, method overloading in Swift is pretty great, and I’m looking forward to doing interesting things with enums. Better though? In some ways, but not in others. Colin Cornaby pointed out that the ease of dropping down to C in Objective-C comes up a lot, and that C++ compatibility is pretty much a requirement for a lot of apps. I think he’s right.

    The way I look at it is this: Objective-C didn’t have to be “broken” for Swift to be a great language. I don’t expect Objective-C to go anywhere in the near future, and that’s a good thing.

    → 2:04 PM, Apr 6
  • All the Zelda

    Over the last few months I’ve become a tiny bit obsessed with Zelda games. I’d never really played one before last summer, and now I want to play them all, except maybe “The Adventure of Link” because I hear it’s terrible. 

    Given that the hardware I have is a Wii U and a 3DS, there might be a few that I won’t be able to play, but I think I’ve collected all that I can. Maybe someone can let me know if I’m missing any though. 

    Here’s what I’ve acquired so far – new, used, or Virtual Console – broken up by platform it ass originally released for:

    NES

    • The Legend of Zelda (1986)

    SNES

    • A Link to the Past (1991)

    Gameboy

    • Link's Awakening (1993)

    Gameboy Color

    • Oracle of Ages (2001)
    • Oracle of Seasons (2001)

    Gameboy Advanced

    • The Minish Cap (2004)

    Wii

    • Twilight Princess (2006)
    • Skyward Sword (2011)

    DS

    • Phantom Hourglass (2007)
    • Spirit Tracks (2009)

    3DS

    • Ocarina of Time 3D (2011)
    • A Link Between Worlds (2013)
    • Majora’s Mask 3D (2015)

    Wii U

    • The Wind Waker HD (2013)

    My plan is to play them all in the order they were originally released in (not the date a remake was released), excluding the ones I’ve already beat. Now that I look at it though I’m realizing this is going to take forever. 

    → 4:03 PM, Mar 9
  • Idea for a Web App

    All of my experience writing web apps have been to learn or test an idea, or something that I decided wasn’t such a great idea after all. For a long time I’ve wanted to come up with something useful enough to want to publish, but simple enough that I thought I could get it done in a reasonable timeframe as my first project. I think I’ve thought of something.

    Neither Xbox Live, Nintendo Miiverse, or PlayStation Network gives you a way to find your Twitter/Facebook friends. What I’m thinking of doing is making a site (probably using Django) which lets you login with Twitter and/or Facebook, enter what someone would need to find you on any of those gaming networks, and then use that information to find your friends who’ve done the same on the site.

    I’m imagining that as far as web apps go, this is a pretty simple one. In my mind it’s just social login, a form to enter your Xbox/Miiverse/PSN usernames, some API calls to get your friend lists, and some database queries to match it up to users of the site. Am I missing anything here?

    → 8:11 PM, Mar 2
  • My Everything Through the Xbox One Setup

    I haven’t posted in a while due to a bunch of reasons, and I’d like to get into a rhythm again. I thought I’d start by sharing the kind of unique way I have my media stuff running through and Xbox One.

    I’ve played a bunch of games on the Xbox since I got it in November – and a bunch of them have been great. But the Kinect and HDMI in are the unique part I wanted to mention. My set up is that I have a Kinivio HDMI switcher with a TiVo, Apple TV, and Wii U going into it, and the switchers output plugged into the Xbox. The Xbox can control be setup to control TV functions, and with the Kinect it can do those with voice commands (“volume up/down”, “mute”, “pause”, etc). Since I have everything running through my Xbox, I can keep using those commands with any of my other devices.

    Having a bunch of things running through this specific HDMI switcher works especially well because it automatically switcher to any input that start getting a new signal, so I rarely have to manually switch inputs.

    The only downside is that I have to have my Xbox One on to use anything else, but in practice that hasn’t been annoying at all.

    → 6:09 PM, Mar 2
  • Updating an iOS 6 App

    Been working on a new version of an app of mine called Closeby that I haven’t touched since iOS 6.

    A few thoughts about the process:

    • My design taste has come a long way in the last two years. Some features in I remember spending time on that now I can't imagine why I'd want them. Others I didn't do then seem obviously necessary and I have no idea why I didn't.
    • I really like iOS 7+ style design.
    • I'm a lot better at programming than I was two years ago. It's not awful, but there's code in here I'd never have written today, and it's nice to see than I haven't stagnated.
    • Cocoapods can be a pain in the ass, but it's still the best bad choice.

    Maybe I’ll post some before and after screenshots when I get a chance to work on it more.

    → 4:48 PM, Nov 5
  • Brent Is Going to Omni

    Brent Simmons is not only a friend, but one of my favorite Cocoa developers. His blog is the most indispensable about writing software I read. Omni is one of my favorite Cocoa development companies. Can’t wait to see what they do together.

    → 3:35 PM, Sep 29
  • 360|iDev min

    I’m super excited to be opening up 360|iDev min October 6th in South Carolina! I’ll be giving a talk about the design patterns, processes and tools we use to make our iOS app at Lovely. I’ve also seen a lot of the other speakers before at 360iDev proper, and they’re all wonderful.

    → 4:21 PM, Sep 26
  • The Jefferies Project

    The Jefferies Project

    What if... in a few years from now, we figure out a way to make deep space travel possible. What if... the first interstellar spacecraft to be built is commissioned by the US Navy and its design is inspired by a science-fiction TV show from the sixties... what would it look like?

    [youtube www.youtube.com/watch

    Neat! I don’t know why there’s so much emphasis on guns though. Who is it supposed to be shooting at?

    → 12:07 PM, Sep 9
  • Falling Back in Love With Video Games

    About three weeks ago – on a whim – I went and bought a new Nintendo Wii U. The Wii U hasn’t sold great, but Nintendo games are what I grew up on, so it seemed like a good way jump back in. I hadn’t really played a lot of video games since I was a kid, but Mario Kart 8 looked awesome, and maybe I could get some of my work friends to come play it with me. I also bought a copy of the latest 2D Mario and a Zelda game too.

    Turns out it’s great. Not only have my friends come over a few times for some Mario Kart, but I think I sort of forgot how fun video games can be. I liked it so much I also went and bought a 3DS XL, which is also fun (my favorite game for it so far is The Legend of Zelda: A Link Between Worlds).

    If you haven’t played any games in a while, maybe give it a shot. I was pretty sure I was “not a gamer,” but I was totally wrong. It’s a blast, you can do it with friends, and it’s a nice way to get away from programming or whatever you’re doing without fully turning off your brain and receding into a vegetative state.

    → 1:42 PM, Sep 5
  • Automatically Move Downloaded Applications

    The first thing I always want to do when a new application is move to ~/Applications. In the past I used Hazel to automate this, but it works just as well with an Automator folder action.

    Here’s the actions I set up to do this in Automator:

    1. New folder action.
    2. Receives files and folders from "Downloads".
    3. Filter finder items > Kind is "Application".
    4. Move finder items to "Applications".
    5. Reveal in Finder.

    And here’s a screenshot:

    move_apps_from_downloads

    → 11:33 AM, Sep 4
  • Ninety Days

    Justin Williams recommends that you don’t spend more than ninety days on a 1.0. I’m with Brent that I want to see apps that take more than three months to make, but I still think Justin has the right advice.

    Some apps are deep, and there’s no way around the time they’ll take to get right. Coda comes to mind. Overcast might too. A majority though – especially on iOS – are really all about one thing that makes it unique and everything else falls out of that one thing.

    Don’t ship garbage. Do figure out what your app is really about, do the hell out of it, and then start shipping updates.

    → 5:34 PM, Aug 4
  • Alamofire

    Alamofire is a new networking library – written in Swift – from the creator of AFNetworking. So far I’ve just read the post on NSHipster about it, but I like what I see. It’s not a value judgment, but something AFNetworking has never quite sat right with me. This looks very lightweight and more like something written to be idiomatic Swift rather than Objective-C in Swift’s clothing.

    → 5:14 PM, Aug 4
  • Swift Optionals

    I understood the concept of optionals right away, but since the debugger doesn’t work with Swift in the third beta of Xcode 6, I’m given no clue what I’m actually doing wrong when my app explodes. This article did a pretty good job clearing things up for me.

    Matt Bridges:

    Objects that may or may not be nil (and the nil-checking code that accompanies them) are the cause of many common programming errors. Swift’s optionals offer compile-time cues to developers about when it’s necessary to nil-check and when it’s not, and makes it harder to write code that misbehaves in the presence of nil.
    → 3:05 PM, Jul 20
  • My New Job

    I hadn’t mentioned it here, but a couple of months ago I took a full time position running iOS development at Lovely. Lovely is a great service for people looking to rent a new apartment, and it’s been really exciting working with the team. This also means I’m now living in San Francisco, so hopefully I’ll be able to run into some people here.

    → 3:49 PM, Jul 2
  • Vendor Unique Identifiers

    I haven’t needed to get a unique device ID since before we stopped being able to use -[UIDevice uniqueIdentifier] until today. Apple added the method -[UIDevice identifierForVendor] in iOS 6 which totally replaces the old method for any of my needs.

    What the method does is give a unique ID for any apps from the same vendor on a given device. The part which might be a little confusing at first is that “vendor” does not mean the same developer account, but instead means any apps where the first part of the bundle identifier (CFBundleIdentifier) is the same. So com.collindonnell.myapp and com.collindonnell.myotherapp would get the same identifier, but com.albinadevelopment.anyapp would not.

    → 5:10 PM, Jul 1
  • Faster Playback in QuickTime X

    Just learned from the Accidental Test Podcast that if you option click on the fast forward button in QuickTime X you can increase the playback speed.

    → 12:10 PM, Jun 27
  • How the CEO of Evernote Organizes

    I never feel like I have a great answer on how to organize anything, so this response on Quora by Phil Libin is really interesting to me.

    The main points are that he:

    • Changes it up pretty often.
    • Has about forty-five total notebooks.
    • Has one primary notebook that most things go into.
    • Most of his other (at least thirty) notebooks are shared.
    • Doesn't use very many tags.
    • Uses one notebook for each "major" conference he goes to.

    I’ve also found most of my stuff going into one notebook (I call it “Filing Cabinet”). The most effective way for me to find anything is to search, so it would probably be useful for me to pare down some of the other notebooks I have and use a few strategic tags in their place.

    → 1:56 PM, Jun 24
  • Objective-C Without the Smalltalk

    This is a really good post lamenting some of the direction Swift has chosen to take:

    Gone is the dynamic nature of ObjC; it has instead been replaced by a rigid, generic based type system. I know the world of C++, Java, and C# programmers have rejoiced. Myself, having worked in Visual Studio building tools for .NET and Windows developers for many years and leaving that for the world of Cocoa and ObjC, I am greatly saddened by this turn of events.

    Objective-C without the C is a worthwhile goal, but I don’t think anyone was asking for Objective-C without the Smalltalk. I’m still learning and planning to use Swift, but I think dividing into pro-Swift and anti-Swift crowds is probably too narrow of a view. Both languages are better and worse in different ways. It’s going to be up to us to learn those differences.

    → 1:31 PM, Jun 17
  • The New DuckDuckGo

    I hadn’t been using DuckDuckGo as my main search engine recently, but the big revision they just did has made it amazingly slick and fast. If you install their extension you can use it as your main search engine in Safari.

    → 1:37 PM, May 23
  • A Small Thing for My Dad

    I’ve been hearing about Harry’s cartridge razor subscription service for a while on different podcasts, but since I’ve been using a safety razor for about four years now, it didn’t really interest me too much. The other day when I heard an ad though, I thought of how I’d been thinking of getting my dad a fancy-pants safety razor set with brush and everything, but hadn’t because I knew it’d be too fussy for him to use, and so I went to the website, read some reviews online to make sure they were actually good razors, and ordered my dad the “Truman” set in blue with a subscription that will sent him more razors and cream every four months.

    For the cost of $93 a year (plus $15 for the initial pack) my dad will never have to think about getting fresh razors or shaving cream again. It’s a small thing, but something I can’t imagine anyone being upset that you did for them.

    → 12:07 PM, May 11
  • Idea for Networking and Model Objects

    I’m considering how to handle a pretty big refactoring of how networking code is handled in this app, and after talking to my friend about how he’s handling networking/model object creation in an app he’s working on if the way I’m thinking is a good idea or not.

    What my friend described is that he’s using the active record pattern, which roughly translates here to sticking everything into the model, and creating new NSURLSession objects as needed. I don’t like the idea of needing to create a session object for every request, since the nice thing about NSURLSession is that all of your requests get to share a delegate, which minimizes repeated code in a lot of cases. I also had an assumption that NSURLSession has some smarts about managing its own queue of tasks and that creating separate session objects would mess that up. The other thing is that if you had some shared code specific to the service you were talking to, having all of your model objects manage all of their own networking seemed like a good way you might end up with some repeated code later on.

    All of that aside, I do kind of like talking directly to the model objects when I need to get things done with them. It feels pretty natural that if you need to do something with SomeObject that you’d talk directly to it. The solution I’m thinking of is to borrow from Core Data and create a class that’s sort of like an NSManagedObjectContext which manages an NSURLSession and which I dependency inject as needed. It also gives me a nice place to stick things which are common to the service, so that code doesn’t get repeated across model classes.

    For a service called Foo whose API I need to interact with to create Bar model objects by ID, I might have a class called ALBFooAPIContext and do something like this:

    [Bar objectWithID:barID usingContext:fooContext completionHandler:completionHandler];
    

    That method could then talk to the context object however it needs to in order to get stuff done. Is this a terrible idea? I’d probably go for calling the context class something else, except I think it’d be a good place to store stuff that is actual contextual to how I’m talking to the service (maybe a currentUser property).

    → 4:05 PM, May 5
  • WWDC 2014

    I will be at WWDC this year. I’ll also be in SF before and after. If you’re going to be in town and want to get together, get in touch.

    → 10:29 PM, May 4
  • Web Hosting for Developers

    Marco thinks we should all suck it up and learn basic Linux server administration, and that a lot of people are going to get burned by highly abstracted solutions like Heroku and Azure:

    There’s a learning curve and necessary integration work for every back-end option, from iCloud and Dropbox to your own colocated servers. AWS, Azure, Heroku, App Engine, Parse, and similar services aren’t free, easy, or automatic. (Neither is “scaling” with them, regardless of what you’ve heard.) Hosted infrastructure is like sync: it has a minimum, unavoidable level of complexity to accommodate. You can’t just check a box or set a BOOL and have it all taken care of for you.

    We definitely had the experience at my old company of – even at our pretty small scale – not being able to get what we needed out of it and it getting prohibitively expensive. Marco would definitely know, so I’m inclined to listen to his advice. I’ve been leaning towards hosting my band app on WebFaction with Django instead of Azure, although not due to costs or because I think it’ll be a problem for me to scale, but because Django seems like a better fit for the specific thing I want to do. Maybe I should go all the way and put it on Linode?

    Read Marco’s original post.

    → 3:16 PM, Apr 29
  • WorldWideWeb Source

    It’s less nuts to me how much different the source code for Tim Berner Lee’s WorldWideWeb than modern Objective-C than it is how little has actually changed in the past thirteen years. I don’t think it would be any issue for me if I was asked to start fixing bugs in this today.

    → 4:06 PM, Apr 28
  • The Record Season 1

    On Saturday I used the ten hour drive from Portland to San Francisco to listen to all of the first season of The Record by Brent Simmons and Chris Parrish. This seasons topic was “Seattle Before the iPhone.” Since I started learning Cocoa about a year before the iPhone SDK became a thing a lot of the people that they interview are people who I looked up to, and later became friends with, and read the blogs of before I actually knew how I was going to make this into a career, so I think I’m what you’d call the core demographic.

    You should check it out. The whole thing is fantastic.

    → 3:56 PM, Apr 28
  • Band App Diary #3: More Thoughts on the Feed

    Continued from this post.

    My first thought is that it seems like I should be able to generate an RSS feed pretty easily. Maybe I should be looking to what gets RSS feeds contain as guidance for what I return from the feed endpoint.

    My second thought is that a completely different approach would be to – instead of returning an array with a bunch of feed item dictionaries created on the server – return a JSON dictionary containing arrays for each item type (songs, shows, videos) and have the logic to display and sort them in the client. That would certainly make the server code simpler. The client could have a sync object that posts a notification when it starts and stops, and then I’d just do a Core Data fetch of all the different types and mash them together into an NSArray in the feed controller.

    I’ll still keep it as one API endpoint (instead of calling shows, then songs, etc) since Azure charges me something per API call, it’s the same number of database calls, and it’s easier for dealing with when sync starts and ends on the client.

    The reason this appeals to me is that I fear each of the different item types will end up being different enough that I won’t really save that much code on the client by trying to normalize feed items on the server. It feels like it could become kind of restrictive later. It should also make caching easier since it means I can have a one to one match between my server and client data model instead of needing the sort of imaginary “feed item” objects. The last benefit I can think of is that it saves me from having to make another API call every time I want to show a detail item.

    The downside is that the RSS feed now would be extra code if I wanted to do that. Not much extra code though, and I was only really thinking of doing it because it seemed like kind of a freebie.

    I think I’ll do this unless someone gives me a good reason why I shouldn’t.

    → 7:34 PM, Apr 22
  • Band App Diary #2: Database to Feed List

    Since I’ve decided on going with a single feed list that’s going to represent all of the different kinds of band content that might get produced, I’ve been thinking about how to represent that in a database and how I’m going to generate the JSON the iOS app needs. I’m using a database instead of something like MongoDB because I understand databases fairly well, and because I’ve decided to use Azure Mobile Services for the server, and using MSSQL is the most straight forward option for that. I think I could probably get by deploying and hosting the app myself somewhere else, and for a future project I might do that, but the way I’m viewing Mobile Services is as a really nice front end for creating a Node app where I don’t have to think about server stuff at all. At this point it’s better if I can just focus on writing code.

    So, getting back to the database, some of the things I need to represent are:

    • Shows
    • Songs
    • Videos
    • Social
      • Instagram
      • Twitter
      • Facebook

    There’s probably more I’m forgetting, but that’s a pretty good start. The first way that I thought to represent all of the different feed item types was to have a big items table that would have the information for a feed item with an type ID, but that doesn’t work, because each of these things could actually be significantly different (a show song won’t have a lat/lon or venue name, but a show will).

    The shows and songs tables might be have some columns like this:

    • Shows
      • unique_id
      • venue_name
      • lat
      • lon
      • date_time
      • duration
      • city
      • description
    • Songs
      • unique_id
      • media_url
      • title
      • description
      • post_date

    I’m leaving some things out, but they aren’t really critical right now for what I’m trying to get at. What I want to do is get all of the different feed item types and serve them up as JSON via one API endpoint to my iOS app. In order to keep things simple, I think the best way to do that is to when the endpoint is called fetch each of my feed item types, loop through each and create an object for each with the information that’s needed to display them in the feed, add them all to an array and return that. The properties could be things like:

    • unique_id
    • title
    • description
    • thumbnail
    • type (integer value to differentiate each item type)

    I could then use the type and unique ID to do things like call a “show with ID” endpoint to display a detail item. I’m almost certain that this is not the most efficient way to do this, but also that if I need to optimize it later, I should be able to do so in a way that doesn’t change anything for the client. The reason I’d like to represent each type as being the same in the feed JSON is that it makes it possible to keep the client code a lot simpler. I’m not sure if that’s the right call or not. Maybe someone with more experience can tell me if I’m way out in the weeds here.

    Update 7:39 pm: I had more thoughts about this approach being a good idea or not.

    → 4:23 PM, Apr 22
  • Band App Diary #1: Initial Design Thoughts

    If you read this blog lately, you know that I have (am) a band called Fisherman’s Porch, and that I’ve been making music for a long time. One idea I’ve had for a while has been to somehow combine my app making and music skills in an interesting way. I’ve also wanted a reason to do something with development that would give me some real world experience writing server side code. I’m going to follow Brent’s footsteps and put all of my design and code thoughts out there, so that hopefully I can learn something from the feedback I get.

    The other day when I posted on Twitter that I was trying to think of a side project I could use Microsoft’s Azure Mobile Services to write a backend for and Nick Harris responded with this:

    @collindonnell write an app for your music with a blog like feature talking about the songs.

    This seems like the perfect project to try this out on for a few reasons:

    • There aren't thousands of Fisherman's Porch fans out there (yet!), and it's not going to be storing a bunch of peoples important personal data, so I can experiment as much as I like with the design and backend architecture.
    • It's not an idea anyone can “steal,” so I don’t have to be secretive at all about creating it and blog about the whole process.

    An App Worth Downloading

    I don’t want to make an app that’s just a static advertisement for my music, because no one will download it, and if they do, they won’t keep it. Plus, designing an app like that just isn’t as interesting to me. I want to use this to stretch my design muscles and see what I’m capable of. Ultimately, the hope is that the app could somehow get people who would have otherwise never ever heard of Fisherman’s Porch to become interested, and people who are interested to stay that way. If you think about how stupid most apps that are created to advertise different brands and whatnot actually are, it’s a pretty big goal.

    So, I think it’s got to do a few of things to have a chance at achieving that. First, the content can’t suck. If my music and other things I put into it are lame, it doesn’t matter what I do. I’m going to take it as read that my content can’t suck. Good content alone is going to be enough though. There’s tons of bands with good songs no one cares about.

    The second thing is that it’s got to be fun to touch and look at. The UI has to be great. It can’t look like a list of songs in the Music app. For the kind of apps I’ve created in the past (productivity mostly), I’ve gotten a lot of mileage out of “what would Mail/Contacts/Music do?” as a starting place. If I were a famous rockstar, that might fly, but I’m not at all. It has to feel like something special.

    The design also needs to look full with the amount of content one person (me) can put out. If I had a table view of six songs, another separate photos view with a few photos, and a videos list with two videos on day one, that’s going to look empty. Instead of a tab bar app with a separate tab for each of those things, or some kind of table view based navigation hierarchy, I’m thinking a single feed that has everything in it. If you want to just listen to my music, you can do that in this app, but the main purpose of this app is to find out what Fisherman’s Porch is up to right now. The types of content I can think of right now are:

    • Music.
    • Videos.
    • Photos.
    • Content from social networks like Twitter, Instagram, etc.
    • Other links to things like blog posts.
    • Shows.

    On the technical side whatever I do should also accommodate the possibility of me coming up with new types of content in the future. I don’t know what those are yet, but I guess that’s kind of the point. Out of all of those types of content, shows are the one that I think deserve their own special view. Giving shows their own view gives me a nice place to put things like getting a push notification if I’m playing a show nearby or requesting a show in your area. Requesting a show could be as simple as a single button. I’d store the location on my server and if I see a bunch in one general area, I can find out about booking a show there at some point.

    Inside of the feed list, I think it would also be nice if people could comment on items that show up there. Review a show, give feedback on a song, that sort of thing. Of course this is the perfect place for trolls to tell me that I “totally suck, lol,” so I think before someone can leave a comment I’d ask them to authenticate with either Twitter or Facebook to remove some of the anonymity. If there’s a way to do it without being a total tool, it might be cool if I could use that as a chance to ask them to like/follow Fisherman’s Porch. I’m thinking more like a checkbox which is default off instead of an alert view that pops up in their face after they log in.

    Other random things the app could maybe do that might be cool:

    • Notifications for new content. If this is annoying people will just delete the app though, so I might have it somewhere that people have to turn on instead of just on for everything by default.
    • Passbook passes for shows. Maybe.
    • Have some basic analytics so I know which songs get listened to the most or the general geographic region people who listen to my music are in. Nothing creepy, but it would be useful to know if I have a big cluster of fans in one area when I go to book a show there.

    I don’t know if all of this will make it into the first version, but I’m kind of excited about this app as a place I can try new things. Since I’m already over a thousand words into this post, I think I’ll take a break and collect my thoughts on what’s all going to need to happen technically.

    → 6:22 PM, Apr 19
  • The Best Guitar Stands

    Until I was about fifteen or sixteen, it seems like the only kind of guitar stand I ever saw looked like this:

    standard-guitar-stand.png

    Generic, and prone to falling over when bumped. These are no good. A trip to LA with my dad when I was in high school was the first time I ever saw an A-frame stand, that are now even more ubiquitous.

    a-frame-stand.png

    So, I’ve been using some variation of that for about fifteen years. This type is better because the guitar leans back slightly and the weight of the stand is distributed more evenly on the base, giving it a lower center of gravity. A lot of them tend to be kind of heavy, however, and they don’t fold up as nicely for carrying as you imagine they do.

    After a show recently where I had to carry one of these along with some other gear, I decided to try something a little different. I purchased a couple of these Hercules stands for home:

    hercules-gs415b.png

    What’s nice about these stands is that they fold up surprisingly small (Hercules also sells a carrying bag for them), are very stable and have these cool little grippers that fold in over the head stock when you’ve set the guitar on the stand:

    IMG 2024

    They’re a little more expensive ($40-50), but not much. I also bought one of their small floor stands which are like the regular heavy A-stands, but are much more light weight, at least as stable, and fold up extremely small:

    hercules-floor-stand.png

    Spending $40 or $50 on a guitar stand seems like a lot of money. But when you consider that your guitars probably cost at least several hundred or thousands of dollars, it’s silly not to spend an extra $20 or $30 for a better stand.

    → 3:44 PM, Apr 11
  • The Revival of the Manual Typewriter

    I enjoyed this article on Medium about one mans infatuation with manual typewriters.

    Using a typewriter has challenged me to think, and write, in an entirely new way. Over time, I’ve learned that the defining trait of a typewriter lies in its sole use as a writing tool and that its most valuable qualities are what it lacks.

    Since I grew up in the nineties I’ve never had to use a typewriter as a serious tool. As long as I ever had to turn in a type written report, it was done on a computer. Logically, a typewriter seems antiquated, inefficient, and the idea of only having one copy of something is terrifying.

    Something is kind of indefinably cool about them though that makes me maybe want to give it a shot. I sort of feel the same way about record players. There’s got to be a German word for nostalgia over something you never really experienced first hand.

    → 11:06 PM, Apr 8
  • The Kindle Is Flawed But Worth It

    A couple of weeks ago I bought a Kindle Paperwhite. I like it a lot. The backlight isn’t so intense I can’t read in bed without keeping myself up all night, it doesn’t get uncomfortable to hold, and it doesn’t give me the option to get distracted and open Twitter.

    The typography does indeed suck. None of the typefaces look all great at the size I want to read them at. I keep flipping between Baskerville and Caecilia. I’m gravitating more towards Caecilia because it looks decent at smaller sizes on the lower resolution screen (probably Amazon chose it originally). Anyway, it’s not that bad – I can live with it.

    GoodReads integration is cool, although I have no idea why it’s so manual. The Kindle shows me what percentage of the book I’ve read on every page, but for some reason, even after adding the book to GoodReads from the Kindle (why can’t it have an option to sync my books automatically?), I have to go to the GoodReads website to update how far into the book I am there (which I won’t ever do).

    This is actually not the first Kindle I’ve owned. I had a second generation Kindle in 2009 (which I stopped using at some point). It’s quite an upgrade in a bunch of ways, although you can tell that the main focus has been making the Kindle cheaper and that making the reading experience better was secondary. The screen is better, but not iPhone 3GS to iPhone 4 better. Not refreshing between every page flip is nice, although I don’t remember that bothering me too much.

    One thing that really stinks and hasn’t changed at all is that reading books which aren’t just prose is awful. I’m currently reading The Practice of Programming, and just finished a book called The Next America. The Practice of Programming has lots of code samples, which get formatted badly between pages. The Next America also had a lot of problems. There were a lot of charts in it which rendered at a size I think would be illegible for a lot of people. Still, I’m sick of having to move books around from place to place and the space they take up, so it’s worth it. It’s just surprising that in 5 years they couldn’t make this better.

    I guess what I really think is that the Kindle is flawed in a lot of ways, but that it’s the positives – e-ink screen, having every book with me always, not having to own and move a bunch of large heavy books – are so appealing that for less than $200, it’s worth it to own one.

    → 6:45 PM, Mar 21
  • New Tracks to Check Out

    I posted a couple of new tracks I’ve been working on that you can check out on my band site if you’re into that sort of thing. I sort of had the realization that at this point, my issue isn’t that too many people might hear my music, and that instead of sharing what I’m working on privately, I should post everything – demo versions, works in progress, etc – for free and see how people react.

    → 11:19 PM, Mar 17
  • NxMW Episode 6: Post Industrial Hellscape

    Bob and I are back on a regular for recording North by Midwest. The next episode will be out Friday, but a couple people have told me that last weeks was their favorite so far, so that may be a good place to start listening if you aren’t already.

    → 4:53 PM, Mar 11
  • Picking Up My Dolphin Yesterday

    I’m now the proud owner of a 1988 Dolphin motorhome. I had to fly to Bend, Oregon, and then drive four hours back through central Oregon and over Mount Hood (where it was snowing). Anyway, it was a pretty crazy trip, and I took some photos.

    taking_off_pdx.JPGrv_in_bend.JPGrv_in_snow.JPG

    → 2:44 PM, Mar 11
  • Beta Test My Album

    Over the past while I’ve been working with a stronger dedication to finish something I’ve had in mind for a long time: record and release an album of original music. Since I was fifteen I’ve been writing songs, during and after high school I had a band, and I’ve performed solo with varying frequency since then. Recording and releasing music is part of a much larger goal to alongside making apps (which I love and would never stop doing), to make music a large and essential part of what I do. I also decided to give it a name; I’m calling the project Fisherman’s Porch.

    The reason I’m posting this now is that a couple of weeks ago I started thinking, “what if I beta tested my album the same way I do apps?” The idea is to put the music I’m working on in front of a group of people and see which songs and see how people react. The music is my own and personal, so I’m not saying I want to design an album by committee (that sounds like a way to make really crappy music), but maybe putting something out there now to a group of interested folks and seeing how people react to everything would be useful.

    If you like folky, indie, acoustic music, maybe you can help. If you like musicians along the lines of Death Cab for Cutie, The Avett Brothers, Rock Votolato, David Bazan, etc, this might be something you’d enjoy. You can check out this short video of me performing to get a fairly good idea.

    Technically the way I plan on doing this is to set up a Glassboard group and put up links to new tracks as I record them. They could be anything from a fairly produced album-ready version of a song, to live tracks, to something I recorded live into my iPhone.

    I’m going to be honest and say that while I’m not looking to just be told me how great I am, I want this to be a positive experience that encourages me to finish the album, I’m really not looking for any negativity or to be told that I suck. If that’s how you feel, that’s fine, but please just keep it to yourself.

    So if you’d like to be hear what I’m working on, it’s really easy. All you have to do is use this link to join the Glassboard and check out the tracks that I’m going to start posting. Really excited to see how this turns out.

    → 8:43 PM, Mar 6
  • Dancing With weakSelf

    There was a really good post on the Black Pixel blog by Rich Wardwell about the implications of capturing self in Objective-C blocks which Brent Simmon’s posted a response to on his blog. If you’re lost, I’m talking about doing this sort of thing to avoid retain cycles:

    __weak MyClass *weakSelf = self;
    self.someObject.blockProperty = ^{
        weakSelf.someProperty = something;
    };
    

    Brent’s thoughts/rules for blocks partially mimic my own1. I never use -[NSNotificationCenter addObserverForName:​queue:​usingBlock:]; I just don’t see the benefit. Unlike Brent, it’s not uncommon for me to copy a block and assign it to a property, but usually if I start having more than one or two somethingHandler blocks, creating a delegate protocol is a better fit most of the time (this code also tends to be easier to debug). I also agree that thinking about if self really needs to be used in the block at all is a good practice (Rich also mentions this).

    I can’t say why exactly, but whenever I have to the whole weakSelf thing, it feels like I’m doing something wrong – it seems like kind of a code smell. That’s not to say I never do it (I do it all the time), but my general feeling is that if I need to, I should probably think about if I’m approaching this from the right angle.


    1. One difference. At some point recently I realized I'd memorized the crazy block syntax: BOOL(^someBlock)(NSString *string). I'm not too proud of this, since I'm pretty sure it points to some kind of underlying psychological disorder ↩
    → 6:08 PM, Mar 4
  • Make Spotlight Searches Less Annoying With This One Weird Trick

    I pretty much never never want to “Search This Mac” if I’m starting from a Finder window.

    2014 02 27 213035 search this mac

    → 10:36 PM, Feb 27
  • January 26th Video of Me Performing Music

    I have a new music thing I’m trying to get started called Fisherman’s Porch. Here’s a video of me performing some songs a couple of weeks ago at an open mic in Portland.

    Post by Fisherman's Porch.
    → 5:03 PM, Feb 6
  • Thoughts on the Verge Review of Pebble Steel

    Nilay Patel’s review of the Pebble Steel is pretty good, but I did have two thoughts after reading it.

    • If the Pebble Steel was rated an 8.5, does that mean that the best a smartwatch released with current technology could have only possibly been 15% better?
    • It's worth considering that you're potentially taking fashion advice from someone who, in the featured image for the article, is also wearing a weird studded bracelet of the type a teenage girl might buy at Hot Topic circa 2005.
    → 4:45 PM, Jan 28
  • How to String a Guitar

    Stringing your guitar this way will help it stay in tune by preventing slipping. Worth knowing how to do right.

    HowToStringAGuitar

    Diagram found here.

    → 9:57 PM, Jan 25
  • Why Can't Everyone Grow Up and Treat Women Like People?

    This ad for Infinity Augmented Reality is super creepy and awkward. It plays to someone with the fantasies of a junior high school age boy: put on your smart glasses, hop in your Ferrari, do a little day drinking, hit on a random woman at her job, and then drive to your next appointment. Are men really so bad that this works on them?

    The part that bothers me the most is at 1:34 when he starts using his glasses to hit on the bartender. Take the creepy glasses out of the equation: why do companies in 2014 think it’s okay to portray women as sex objects? Was the extended shots of the woman licking her lips really demonstrating the unique benefits of the software? It’s gross.

    I don’t know how many women would be excited for the kind of future where a guy they never gave their name to adds them on Facebook and invites them over for some Sauvignon Blanc and casual sex the same day, but I feel like not many. Women all ready have to deal with guys pulling creepy and inappropriate shit in the real world. Garbage like this, booth babes at conferences, and everything else that tells men it’s okay to look at women like a subspecies isn’t helping.

    Stuff like should be offensive to women and men. For women, it portrays you not as an individual taking equal part in an exciting future, but as sex objects and exploitation targets. For men the message is clear: if you’re interested in technology it’s because you’re a sex crazed loser who never learned to see women as people, and who can’t get laid without magic glasses.

    If you’re a man and this appeals to you: grow the fuck up.

    → 2:04 PM, Jan 17
  • Don't Store Static Content in Code

    Sticking large blocks of static content directly in code is a bad idea, but I see it all the time. You keep your image data separate, so why have a 2000 word privacy policy stuck in the code directly? Loading content like this from static text files, as an HTML string into a web view, or keeping configuration data in a property list is a much better choice, and what I do pretty much anytime I can.

    If you have code like this in your app, you’re doing it wrong:

    self.titleLabel.text = @"Privacy Policy";
    self.lineTwoLabel.text = @"Really private. So policy.";
    self.paragraphOneLabel.text = @"<600 words of body text>";
    self.paragraphTwoLabel.text. = etc...
    

    Instead, if you’re just talking about static text with some styling, you could keep all of that in an HTML document and do something like this:

    NSString *privacyPath = [[NSBundle mainBundle] pathForResource:@"lovely_terms_of_use" ofType:@"html"];
    NSString *privacyHTML = [NSString stringWithContentsOfFile:privacyPath encoding:NSUTF8StringEncoding error:nil];
    [self.webView loadHTMLString:privacyHTML]
    

    Let’s say you had a list of documents like this you needed to display, like terms and conditions and about, which were all listed as rows in a table view. Instead of coding what each row is, you could save a lot of code by putting that information into a property list. If you store the info for each document as an item in array – with keys like title and documentName – you can load that array in your view controller and then pretty much automate this whole process with two classes and a few lines of code.

    On top of getting clutter out of your code and saving the amount of code you write, there’s other nice things you can do now too. For example, maybe you want to be able to update any of these documents remotely. All you need to do is check a URL, download a copy of the files into your cache directory, and check for if there’s a match there before you display the one you bundled with the app.

    Getting a feel for where you can get static content of out of code and into external resource files lets you not only write better code, but less of it.

    → 5:33 PM, Jan 15
  • Misconceptions About Sound Proofing Versus Treatment

    A friend who wanted to sound proof the garage at her new house, so that her band could use it as a practice space, was asking for advice for how to do that cheaply via Facebook. The recommendations she got were to put up acoustic foam or egg crate material on the walls, and that’s totally wrong. The misconception people have is they don’t understand the difference between sound proofing versus treatment.

    When you see a picture of a recording studio with acoustic foam on the walls, what that’s there to do is to cut down on uneven reflections and make the room sound better when you’re in it1. What foam or other acoustic treatment does not do is keep the sound in the room from escaping to the outside. In order to sound proof a space, you need to add a lot of mass – as in concrete or brick walls. Anyone who tells you something different doesn’t know what they’re talking about.


    1. Foam is pretty bad for treating rooms too, because it's too low density to stop bass reflections. Bass frequencies cause just as many problems as higher ones, so if you only treat high frequencies you end up with a room that just sounds kind of dead. Good studios use higher density material, like rigid fiberglass, and also diffusors to scatter the reflections and stop what's called nodes. ↩
    → 3:15 AM, Jan 11
  • Push Notification Distractions and Anxiety

    Everyone knows that distractions are productivity killers. But I’ve also started to become aware that all of the vibrations and dings going off in my pocket and on my desktop all day aren’t just distracting, but that every time they go off, I also feel just a little anxious. There’s a tiny bit of stress every time I hear or feel a notification that takes me away from what I’m doing.

    I have no idea if I’m the only person to ever feel this way, but I don’t feel like it can be that uncommon. We just aren’t built to have our concentration broken in that way so often. So, in order to be more productive, less anxious, person I’ve decided to do a few things about it.

    Deleting Noisy and Useless Apps

    I had a bunch of different social apps on my phone I didn’t need: Facebook, Facebook Messenger, Path, Foursquare and Tumblr. Of those, I use Facebook to keep up with people who I don’t have a better way to track, and Tumblr for browsing and time wasting. Nothing has ever happened on any of these that needed my immediate attention, so I deleted all of them from my phone.

    The social apps I kept were for Twitter, App.net and Instagram. For Twitter and App.net, I deleted the desktop clients I had and decided to only use them from my phone. I kept Instagram because I like some of the pictures I take with it, but I may change my mind on it too.

    Any apps that I don’t use on at least a near-daily basis, I also deleted. If they’re that important, why do I have them buried in a folder on my third home screen? For any apps I use, but that send notifications for things that aren’t time sensitive (e.g., Instacast for new podcast episodes), I turned off notifications all together.

    Dealing with Mail

    Mail is one case where sometimes I might get something kind of urgent, but that most of the time is just buzzing away annoying me for no reason. I moved it to my second home screen, and turned off notifications and badges for everything except VIP. I also removed a few people from VIP that didn’t need to be there.

    Using Do Not Disturb

    The last thing I’ve started doing is keep “do not disturb” active on both my phone and computer whenever I don’t want to be bothered (which is a lot). On your phone, you can set it to always let certain people and repeated calls through, but I turned those off too. If I need to focus, nothing is so urgent that it can’t wait for a little bit.

    → 9:53 PM, Jan 6
  • iA Drops Syntax Control Patent, Internet Silent

    Last week, the Internet exploded when the website for Information Architects new app, Writer Pro, mentioned the company filing a patent on a feature called “Syntax Control.” What the feature does is use Apple’s NSLinguisticTagger class to highlight syntactic components of your document (adjectives, nouns, etc), to help while editing. I’m not a patent expert, but based on what understand, I don’t believe in them. I’m willing to be flexible, but the point is I wouldn’t have filed for a patent if I were them, and I understand what everyone was so upset over: patents can be used for extorting other companies, and we all hate patent trolls.

    One part of the reaction I don’t understand is those who say their patent is more invalid because it’s based on an Apple class. The building blocks for anything you want to do exist. What’s patentable is the specific way in which you took those building blocks and made something with them. Whether those building blocks got you 10% or 90% of the way there is immaterial. How you execute is all that counts. Since I don’t like any patents, it’s bad either way, but the idea that the technical difficulty to implement something matters doesn’t make sense to me.

    The other thing I don’t get is why I saw no one commending acknowledging iA for this1:

    We will drop our patents pending. Thank you @dhh for clearing our minds.

    — iA Inc. (@iA) December 27, 2013

    //platform.twitter.com/widgets.js

    So, what happened is:

    1. A company did something a lot of people didn't like.
    2. Those people voiced their opinion.
    3. The company listened and corrected what everyone was upset about.

    If a company does something you don’t like, you speak out, and they correct it, that means what you did worked. It means you got what you wanted. Isn’t the right thing to acknowledge them for it? If you don’t, why would anyone listen to you the next time?


    1. Except for all the people who retweeted and favorited their tweet. ↩
    → 6:25 PM, Jan 3
  • Money Doesn't Mean They Don't Have to Respect You

    Most developers I know do work for other people, either as a contractor or an employee. Two things that have taken me a long time to understand when working for others – but that I’m becoming more certain of – are that you shouldn’t work for anyone who doesn’t treat you with respect, and it’s up to you to make those you work for understand that they need to.

    The software industry is full of young overworked, overstressed people. Often they also hate confrontation, and have limited skill or comfort expressing themselves. That applies to both the people signing and cashing the checks.

    Because of this, if the person who’s hired you has something that’s bothering them, they’re likely to keep it to themselves until they feel it’s reached a head, and explode with emotion. If you’re not comfortable dealing with people like that – even if you know you’ve done everything right – you’re going to defer, apologize and back down. And you have good reason to be that way; they’re paying you and you want that money.

    The problem you’ve created for yourself is this: you’ve now demonstrated to this person that they don’t need to talk to you in a business-like way if they’re feeling frustrated. And once someone loses respect for you, you never get it back. There’s no amount of money that’s worth working for someone who doesn’t respect you, and really, I don’t think most people are going to fire you because you showed that you have dignity.

    One way to deal with situations like that would be to explain the first time it happens that you understand they’re feeling frustrated, but that your business relationship doesn’t make talking to you anyway they like all right. A better way would be to set things up from the beginning so that you the situation. Usually the problem is that people weren’t communicating, so make it as easy as possible to communicate with you.

    If the people you’re working for don’t have an issue tracker – bring your own and have them use it. Explain how you want to receive feedback on your work at the start, and avoid getting it through email, because it’s really easy for others to abuse. Also, if you’re remote, avoid it being team chat if you don’t want to work the same hours they do. You want to pick something everything about the status of the project can go into it, and everyone can check at anytime.

    You’re not going to fix anyone, and in software you’ll always have stressful situations. But you can do better than letting your work become a place you’re constantly disrespected.

    → 5:21 PM, Jan 1
  • My Analog Writing Tools

    As much as I love computers and technology, I use paper a lot. I’ve used it for writing song lyrics most days since I was fifteen, blog ideas, sketching and a lot of other things. Systems and special ways to get things done are great, but not sustainable. The tools I’ve stuck with a long time are simple, and some haven’t changed since I was a freshmen in high school (I hope what I make with them has improved).

    When I was a kid, I carried around a notebook from the drugstore I’d write lyrics for my band in. When I filled it up, I moved onto another one. When I felt I had reason to (sharing with others), I’d type them into the computer as a text file. It stayed that way for the next several years. Today is the same, except I might replace a text file with Evernote for some things, and I’m consistent about getting things into my Mac where they’re backed up.

    Notebooks

    What notebook or pen you use isn’t important if you like using them. I like a notebook with thick paper so that ink won’t bleed through, and impressions won’t show on the next page. Moleskine notebooks have thin paper, and they’re expensive, so I don’t use them.

    There’s two notebooks that I use for capturing whatever I need to. A big one for when I’m sitting some place like my desk or a table at a coffee shop, and a small one that I carry in my back pocket.

    Since I don’t have it with me all the time, the big one gets less use. What goes in it ends up being stuff like lyrics or sketches where the extra space is helpful. I carry a bright orange Rhodia notebook that I like a lot because it was affordable, the paper is nice, and it looks kind of cool. Expensive notebooks made me anxious to write in them, so I don’t buy them.

    My small notebook gets all kinds of stuff put into it. Ideas for blog posts, grocery lists, sketches of app ideas. Most of it’s temporary, but some things like app sketches I might take a picture of and add to Evernote. When I fill one of these, I throw it into a drawer and start a new one. I’ve carried Field Notes for years. They’re kind of expensive, but not crazy, and they’re the perfect size to fit in my back pocket.

    Pens

    I carry a Fisher Space Pen clipped inside my front pocket when I’m out doing things. It’s wet where I live a lot of the year, I end up writing into my small notebook outside a lot, and the ink doesn’t bleed when wet. It goes great with the cool waterproof Field Notes I got last year. When I run out of those books I may need to find a replacement brand with the same paper I can use.

    The space pen is good because it’s durable and portable, but I like something smoother when sitting at a desk. I started using the Uni-ball Jetstream in November, and I like them. You can get a three pack for $13 on Amazon. I used to use Pilot G2 pens, but these are better.

    → 10:03 PM, Dec 31
  • Tools to Make Software Less Dysfunctionally

    Someone on Twitter the other day sent me a message asking me what tools I was using when making apps for things like issue tracking, testing, managing tasks in a project, etc. I don’t know if I’m the best example of anything, but I can tell you what’s worked and not worked for me in the past.

    You Need to Write Things Down

    The biggest issues I’ve had working with others have come when the team isn’t on the same page about what everyone needs from everyone else. Having a daily check-in where everyone gets together isn’t a bad thing, but it’s not a replacement for having an issue tracking and project management system in place.

    If you’re thinking this can all happen in email threads: you’re wrong. An email thread is a terrible place for this sort of discussion to happen. People don’t respond, everyone has different habits when it comes to email, and people inevitably mix up 10 different topics into one thread that goes on for weeks. You need a system that allows you to create a task, assign it to someone, and have running commentary on the same page.

    The best place to do that is in a dedicated issue tracker, maybe a project management tool, and a good chat system if you’re working with other people.

    Issue Tracking

    The issue trackers I’ve used and liked are GitHub Issues and Lighthouse. What I like about both of them is that they’re both extremely simple, reasonably freeform, and let you enter enough detail into your ticket to explain what’s going on. Some people like other tools, and that’s fine too, these are what’s worked for me. As a general rule if something gets very complicated I’ll stop wanting to use it.

    Both of these will integrate with your source control repo, let you tag issues with whatever you want, create milestones (v1.0, v1.1, etc), comment on existing issues, and assign them to team members. Speaking of teams – you should be using an issue tracker even if you’re just one person. Apps like OmniFocus are great for runway level tasks, but bugs and enhancements are usually more than just a task, and you want to be able to get an idea of how they connect.

    What’s great about GitHub Issues is that it’s free if you’re all ready using GitHub, and it does most of what you want. What’s better about Lighthouse is that it does everything Issues does, but a project in Lighthouse isn’t tied to a specific GitHub repo. You can’t have Issues without a repo, so if you have a project with more than one repo (e.g., web backend and iOS app), there’s no way to track things across the two.

    I’d recommend giving GitHub a try until you feel yourself bumping up against the walls, and then try Lighthouse.

    Project Management Tools

    Project management tool like Basecamp or Asana can work well when you have a team and you need a 10,000 foot view of what you’re working on. For individuals or even small teams, I don’t think you always need one. For one person writing their own apps, I’ve only seen these used for procrastination and the kind of task shuffling that distracts people from actually making their thing.

    On the size teams that I usually work with, I’ve rarely felt a dedicated project management helped up get anything done faster. Maybe for non-technical project managers, but those people are usually a net negative as well1. I imagine when a team gets to a certain size you need something like this, I just don’t generally work on teams of that size, so I don’t know.

    In my experience a good issue tracker can take the place of a dedicated project management app, but not the other way around. The reason is that project management tools usually have a concept of tasks, but usually don’t have the right fields to put in all of the detail you need when tracking new features and bugs.

    Group Chat

    If you’re working with a team, you should have a persistent chat system. I’ve used Flowdock, HipChat and Campfire. Hipchat has the best native apps, but I prefer Flowdock because it was the easiest to integrate with other things like GitHub, was the hardest to lose track of things in and has the least ridiculous annoyances and limitations.


    1. Project managers who understand design and development, or at least stay out of everyones butt can be a different story. ↩
    → 8:19 PM, Dec 30
  • Meslo Is a Better Version of Menlo

    Meslo is a tweaked version of Apple’s Menlo font which fixes what I think has always bothered me about it – small vertical line spacing which makes it feel really cramped. Meslo also changes the alignment of the asterisk, which wasn’t bothering me as much, but is fine this way too. It comes in three varieties so you can pick the amount of space you like best. I’m giving 11pt Meslo LG M a try and it’s a nice improvement.

    → 10:54 PM, Dec 29
  • Three Good Books About Writing

    Writing is hard. It’s also true that the only way to get better is to do it a lot. No amount of time I’ve spent thinking or reading what others say would count for anything if I didn’t put it into practice. The thing about practice though is that practice doesn’t make perfect: practicing the right way does. You can do the wrong things over and over again and ever get as good as you could have been. To get better you have to learn from others, and then also use what you learn.

    However much I improve – however more clearly I can organize and express my thoughts – I don’t think that I’ll ever be completely satisfied with how I write, but I don’t want to stop trying. These are a few books about writing that have helped me maybe get a little better. They’re probably three of the most well read books on writing, but if you haven’t, I recommend them all.

    The Elements of Style, William Strunk Jr. & E. B. White

    Short and pretty terse, Elements of Style is full of practical rules and guidelines. It won’t tell you how to be a good writer, but it might keep you from embarrassing yourself too much. It’s kind of like K&R of writing books. I keep meaning to re-read it.

    On Writing Well, William Zinsser

    The first part goes over the basics and general writing topics, and there’s lots of good stuff in there. Later on it talks about specific kinds of writing: travel, sports, business, memoirs etc. The title gives it away – On Writing Well is about learning to write non-fiction well.

    On Writing, Stephen King

    Sort of half about writing and half about Stephen King’s life. Both parts are great. It’s worth reading for anyone because it’s entertaining and funny, but it’s also got lots of tips about how to suck less at writing interspersed.

    → 7:26 PM, Dec 29
  • Turn Off Text Antialiasing in Xcode

    I’m not sure in what way my brain is broken to cause this to bother me so much, but I’ve often found myself staring at Xcode after a long time, fixating on the antialiased text being hard to read. I’m pretty sure a retina display would solve the problem, but that isn’t an option for my iMac or MacBook Air. Instead, what you can do is pick a font which has bitmap versions included for small sizes1 and type this into Terminal:

    defaults write com.apple.dt.Xcode NSFontDefaultScreenFontSubstitutionEnabled -bool YES
    defaults write com.apple.dt.Xcode AppleAntiAliasingThreshold 24
    

    Restart Xcode and the slightly fuzzy antialiased text will be replaced with slightly pixelated non-antialiased text.


    1. I like Anonymous Pro, which has bitmaps for up to 13pt. ↩
    → 6:16 PM, Dec 28
  • Which RSS Readers Subscribers to My Blog Are Using

    I was looking at the page in Feedpress1 today which breaks down subscribers by which RSS reader they use, and it seemed worth sharing. I don’t know if my results are normal or not, but my stats looked like this:

    • NewsBlur: 34%
    • Feedly: 16%
    • Feed Wrangler: 14%
    • Google Reader: 13%
    • Feedbin: 8%
    • NetNewsWire: 4%
    • Other: 11%

    The readers which were only a couple of percentage points that I grouped into other were: Fever, The Old Reader, Bloglovin, SimplePie, Apple-PubSub, Shrook, NewsGatorOnline, Tiny Tiny RSS, Stringer, Reeder, feedzirra, rss2email, UniversalFeedParser, Downcast, and throttle.2

    A few things jumped out at me:

    1. NewsBlur is more than double the next closest with 34%, but the top few seem pretty competitive.
    2. I thought Fever (what I'm using right now) and The Old Reader (because I'd heard of it) would be higher, but both had just a few people using them.
    3. I have no idea why Google Reader still shows up, but it's a pretty high percentage. I guess that means the number of subscribers is 13% lower than what's reported since Google Reader is shut down.
    4. For an app that's still in public beta and doesn't have any syncing, NetNewsWire did surprisingly well.
    5. A small group of people are still reading RSS in Safari/Apple Mail, which was removed in Mountain Lion.
    6. I'd never heard of a bunch of the readers in the "other" category.

    I’d be interested to see other peoples stats to figure out how typical my results are. My entirely unfounded guess is that these numbers are not typical for some reason due to who my subscribers are or where they came from. I see people talking about all of the top three or four in roughly equal balance, so it’s hard for me to imagine that NewsBlur isn’t just a little more popular, but more than twice anything else.3 I suspect that if I had a Daring Fireball sized audience the numbers might be distributed a lot more evenly, but I could be wrong.


    1. Feedpress is an alternative to Feedburner that you pay for, has better reporting, is easier to move away from, and probably won't go away for no reason. ↩
    2. It probably says a lot about who reads my blog that at least three of these are open source projects you need to compile yourself. ↩
    3. Although it's a great service and might deserve to be. Of the ones I've tried it'd be the easiest to recommend to non-hardcore tech people. ↩
    → 10:29 AM, Dec 28
  • The Products Apple Doesn't Have Time to Improve

    If you haven’t been to the Safari Extensions Gallery in a while because it was terrible, never updated and impossible to finding anything, check it out again. Apple updated it at some point recently to make browsing categories and finding extensions easier. It only took them several years to do it. Of course there’s still no search, so it’s a little more like a feature page for a product than The App Store, but hey, maybe by 2016 or so we’ll get there1.

    As happy as I am that Apple did update their site, I’m sort of surprised they bothered. The dearth of good Safari extensions compared to what Chrome has is a good example of Apple’s tendency to get something going, get kind of sidetracked and then not give it the attention it needs to succeed. FaceTime being pretty much stagnant since day it came out — besides the horribly named “FaceTime Audio” — is another good example. Why doesn’t FaceTime support groups? It seems a little odd it’s missing useful features that iChat video conferencing had ten years ago.

    With extensions, if Apple thought they were worthwhile beyond claim feature parity for their browser, they would have launched them with a “Safari Extensions Store” that had the kind of search and curation their other stores have. Without at least that, they were never going to get the kind of massive third party community that other browsers have.

    What makes Apple outstanding as a company is their ability to focus. What holds some of their products back is that the level of focus they have can mean things which aren’t considered central to their current plans or business get left to stagnate.

    As disappointed as these things can make me, the truth is I know the reason Apple can make things I like so consistently is because of that focus. I know I prefer how they are to the spastic way other companies seem to always be doing fifty things at once. It would just be nice to see a little more interest in these semi forgotten products that they’ve already released.


    1. Or you could go to Safari Add-ons which is more usable for finding extensions, but in a less attractive package. ↩
    → 7:00 PM, Dec 27
  • DragonDrop Is the Mac Utility I Use Most

    DragonDrop has been out for a while, but I still get asked about it whenever I use it during a presentation. Let’s say you’re dragging a document (an image for example) from one app or Finder location to another, and the thing you’re dragging to is obscured. Without DragonDrop you may be able to do some trackpad acrobatics, enable Expose and make it work without losing the file. If you have the app though, you can just give your mouse a little shake and a small window like this will pop up:

    Drag Things Here

    Then just drag your file onto the window, and it becomes a floating panel that sits above other windows:

    DragonDrop WithItem

    Now you can move over to the app you were working with before and drag the files onto it from DragonDrop. I use this all the time when I’m adding files to Xcode, or when I’ve grabbed an image from online that I want to send to someone in an iMessage.

    There’s probably a way to achieve a similar effect with LaunchBar or other similar apps, but DragonDrop is perfect as an app that does one thing really well. Plus it’s only $4.99, so why wouldn’t you have both? You can get it on the Mac App Store for $4.99.

    → 12:52 PM, Dec 27
  • How I Chose a New TV

    Aside from occasionally becoming obsessed and bingeing on entire seasons of a TV show, I wouldn’t say that I watch a lot of TV. I’ve never had a cable subscription as an adult – or even seriously considered buying one – and didn’t even own a TV until the Apple TV 2 came out. I think I mostly bought one the 32” Panasonic (for about $400-500 in 2010) that I bought at that time so I’d have something to hook the Apple TV up to. The living room in my old apartment was a bit smaller, so at the time 32” was fine. In my new place though it was small enough to be hard to find a position for it where it wasn’t hard to read, so I recently upgraded to a 50” Samsung Plasma (which seems huge).

    Requirements

    I knew what size I wanted, and that I wanted it to look good. Since I didn’t really want to spend more than about $500 though, I needed to prioritize what was important to me. To get the size and quality I wanted, I came up with a few guidelines:

    No apps or similar bullshit

    I wanted the closest thing to a dumb screen I could get. It’s going to be hooked up to an Apple TV all the time, so there’s no value there for me.

    Plasma

    Plasma is supposed to have better picture quality for the money. The only serious issue I could hear about people ever having with was screen burn in, and everything I found said that it’s not an issue with newer models.

    720p

    I’ve never owned a 1080p TV, but everything I read said that you have to sit really close to a 50” TV to tell any difference between 720 and 1080. Since I knew I wouldn’t be, there didn’t seem to be a value for me.

    What I Chose

    The model I landed on which fit was the Samsung PN51F4500, which The Wirecutter also picked as their choice for a $500 TV a few weeks after I bought mine. The speakers aren’t great, but it hasn’t really bothered me. I figured that if I really wanted good sound I’d have to buy speakers eventually no-matter how much I spent on the TV. The 5.1 sound bar system that Vizio makes looks pretty sweet and isn’t too expensive if it really starts to bother me.

    The TV definitely looked better than my old one as soon as I hooked it up, but I knew the out of box settings are not what you’re supposed to use at home and that I should change something. The problem was that I had no idea what to change. Last week I heard about the THX app for calibrating your TV from John Siracusa on the Accidental Tech Podcast and bought it. It took about ten minutes to go through all of their calibration steps, and the difference was immediately obvious. If you’ve never calibrated your TV, you should get the app and use it. I also turned off every setting I could find that sounded suspicious like automatic brightness and some things that had to do with audio delay.

    I don’t know if my specific case is useful to anyone else, but I’m happy with my choice, so maybe the little bit of research I did can save someone some time.

    → 2:00 PM, Dec 26
  • Introducing My New App: Braid Mail

    A few months ago I started working with a team on an iOS mail app called Braid Mail. It’s been pretty crazy time, like I imagine most startups are. I’ve flown back and forth to San Francisco a bunch of times, had some late nights and a lot of trips to the Ritual Coffee cart in Hayes Valley. Version 1.0 came out not long ago, but I knew we’d be doing a few things with it in the next update that made where we were going a little more clear, so I didn’t want to push it too hard… until now.

    (If you’d like you can just go get it for free now before continue reading.)

    Version 1.1 still isn’t perfect (software never is), but it does a good job of showing off at least one unique feature that I think people will really like that displays in the app in two ways, the categories and the activity screen. Here’s what that looks like (worth mentioning the activity screen is using data we made up in this shot):

    Activity Screen The Sidebar

    What categories are is Braid recognizing important messages for you and turning those into categories we display in the side bar. So if you have emails from an airline, we’ll add a “travel” category, or if you have shipping notifications, we’ll add a “deliveries” category. The idea is to – without messing with your inbox and screwing up your organization – put things into a place where you can find them easily without having to search or poke around too much.

    The activity feed is related to categories, but serves a different purpose. Instead of discrete categories for your email, it’s a running list of all the kinds of messages which Braid was able to categorize. It’s a different way of viewing incoming messages that makes it easier to see what kind of mail you’re receiving, and find stuff that’s important when you’re not sure of what category it might fit into.

    When designing Braid Mail, the goal was to create something which felt completely at home on iOS 7 and also introduced features that we didn’t feel were being done great by any other apps available for iOS users. My opinion has always been that when creating something new it’s better to decide what your app is about and really do the hell out of that thing, and that’s the direction that we’ve taken in designing Braid.

    We still have a lot we want to do, and I’m sure we will for a long time. For starters we want to support more services than just Gmail, and give you the ability to tell Braid how to categorize messages that it didn’t know about. As it stands I think there’s a lot for us to be proud of here, and I’d really appreciate you taking the time to check it out. It’s free on the The App Store and you can get it now.

    → 9:13 PM, Dec 24
  • Photos+

    My friend Justin Williams has just released his new photo viewing and management app, Photos+. It’s excellent. Photos+ can be used as a true replacement for the built in Photos app, and has the right features for hardcore photography nerds to love it without ever feeling the least bit complicated. In fact, if anything I’d say just getting around feels less complicated than in the system app, because it eschews a bunch of features I almost never use.

    The grid view in Photos+ is my new favorite way to view my photos on any platform. Instead of putting each photo into an equally sized and spaced grid of images, thumbnails are scaled proportionally and put nearly right up against each other. This maximizes the number of photos you can see at a time and makes them large enough that you can actually tell what you’re looking at. It’s a better example of iOS 7’s content first strategy than Apple has actually shipped themselves in any of their apps.

    You can read Justin’s post about Photos+ on his blog, or just go get it right now for $2.99 on The App Store.

    → 2:59 PM, Dec 18
  • What if Apple Got Rid of Star Ratings?

    I may be overlooking something that would make this a terrible idea, but it’s something I haven’t heard anywhere else: what if Apple got rid of star ratings for in app reviews? The reason those “rate this app” dialogs are so popular isn’t because app developers hate their users, it’s because the way apps are rated is flawed and many developers feel it’s the only way for them to level the playing field. Without solving the reason developers use them in the first place, there’s no way they’re going away. I agree with Marco’s statement that those dialogs are annoying spam, but that app reviews should not be eliminated completely. Without a way to try an app before purchasing, getting rid of app reviews entirely doesn’t make any sense. The 1-5 star rating part of reviews though? Kill it and leave these options for reviews:

    • The ability to leave a written review with a title and subject.
    • The ability to mark other reviews useful or not.

    You could still leave a useless review, but it’s possible to make those have less impact than they do now. Apple could display reviews in the order of most useful, weighted towards the recency of the review, and the dates users marked it useful. If a review was marked useful many times for something that was fixed in an update, that review would get pushed down over time. Useless reviews would still exist, but hopefully thoughtful and concise concise ones would bubble to the top and bury them.

    → 7:43 PM, Dec 14
  • Handling Colors Better in Your Apps

    When I’m working on an app something that I try to avoid is to have lines of code like this mixed in my display code:

    view.backgroundColor = [UIColor colorWithRed:0.75f green:0.64f blue:0.64f];
    

    Instead, I create a category on UIColor — called something like UIColor(MyAppColors) — and add a class method whenever I need to use a new color to the app. That makes the line above something more like:

    view.backgroundColor = [UIColor alb_defaultBackgroundColor];
    

    The main reason I do this is that if I ever want to tweak a color which gets reused in multiple places, I only need to change the category method for it to be updated everywhere. It’s a good practice to avoid having literal strings and numbers strewn throughout your code, and this is a good example of why.

    → 7:14 PM, Dec 10
  • Deformed Freak Born Without Penis

    The Onion reports on a truly sad story:

    Sources said the abnormal, visibly blemished creature has been repeatedly passed over for employment opportunities, frequently gawked at and harassed on the street by total strangers, and has faced near constant discrimination for over two decades, all due to the horrific and debilitating birth defect. Sources confirmed that, unfortunately, such cases are actually quite common, with roughly one in every two babies afflicted with the lifelong disfigurement.
    → 8:31 PM, Dec 3
  • Demobilizer Safari Extension

    I was going through some links I’d sent to Reading List, and couldn’t quite remember what the Safari extension was which redirects you to the non-mobile version of a site. It’s called Demobilizer by June Cloud; the same company which makes the Delivery Status app (which I use a lot).

    → 8:22 PM, Nov 29
  • The Salon Product Grey Market and Diversion

    I saw this article from something my hairdresser (of course) posted, and I learned a few couple of things:

    • Hair products have an expiration date.
    • The salon products that get sold at the grocery store, drug store, Target, etc are not licensed to be sold there, are likely expired, and therefore might not be any good.

    It’s pretty much explained in the first couple of paragraphs:

    What happens is that the world's least threatening black market underlords (actually, they call it the "gray market") will buy salon products from a legitimate distributor, then set them aside in a warehouse for years until the barcode expires so they can't be tracked. During this time, not only does the barcode expire but so does the product inside, warping from heat or just the cruel sands of time into something that is an ineffective shadow of its former self.
    → 4:38 AM, Nov 20
  • Brent's Vesper Sync Diary

    Brent Simmons has been writing a series of blog posts to journal how he’s been approaching sync in Vesper, and I strongly recommend reading it. Brent’s ability to think through an entire problem is something I constantly work to improve in myself. It’s the thing that really separates great developers and designers from everyone else who starts by typing, and defers thinking until something blows up.

    Here’s the posts he’s published so far:

    1. Syncing Tags
    2. Core Data
    3. Immutability, Deleting, and Calculated Properties
    4. In Another Country
    5. Sync Tokens and Efficiency
    6. Merging Notes
    → 7:38 PM, Nov 16
  • Why Indie Developers Should Check Out Portland

    According to this article from Freelancers Union, Portland is the most freelancer friendly city in the country. This statistic1 in particular kind of blew me away:

    The Portland community has more “micro-entrepreneurs” per capita than any other city in the country. According to ESRI Business Analyst (cited by Portland Development Commission, there are 5,287 “small firms” per 100,000 residents in Portland, the highest in the country, beating even Seattle and Austin. Entrepreneur Magazine named Portland one of the top cities for entrepreneurs.

    For app makers who are or want to go indie, Portland also has some pretty great benefits that don’t get mentioned in the article.

    Quality of Life

    Do you remember the 90′s? People were talking about getting piercings and tribal tattoos, people were singing about saving the planet and forming bands. There’s a place where that idea still exists as a reality, and I’ve been there.

    If the idea of living in a place where you can ride a bike or walk instead of driving a car, be in close proximity to the best coffee shops and microbreweries in the country and travel to the beach or mountains within an hour, Portland may appeal to you. As a bike riding vegan2, I have to say that I am definitely in the right demographic for those things to appeal to me, but I don’t think you need to be a special little snowflake like me to enjoy it here.

    I also like that I can almost always shop at a local business to find what you need without going out of my way. To be completely honest, I couldn’t tell you how to get to a strip-mall if I needed to. Near my house there’s a local coffee shop, Mexican food restaurant, clothing store and seafood place all next to each other. I like to joke if this were anywhere else in the country that might be a Starbucks, Chipotle, Gap and Bubba Gump Shrimp Co3. You can still find those things if you want to, but I like that what’s in my face most of of the time are locally owned places instead of the chains I could find in any other city in the country. Our biggest chain grocery store is even local (and also possibly the best grocery store in the world).

    I could go on. But if you like local music, farmers markets, and living in a safe place while still having the advantages of a big city, there’s a lot here for you. If you have a unique hobby (knitting, canning, vegan body building) and would like to find other people to enjoy it with, you can probably find them here.

    Cost of Living

    Even though with Portland as trendy as it is, the cost of living has stayed low. For example, the median home price here is $232,900 (compared to $543,800 in San Francisco), and browsing on Craigslist I can find 900 sq. ft apartments in a cool part of town for under $1000/month. There’s also no sales tax in Oregon, which is great for a couple of reasons. First, it makes things cheaper, but second it encourages people to support local businesses (which there are a ton of).

    Living in a place where you don’t have to compromise between quality of life and cost of living is great as someone who’s independent. It means that if you’re doing freelance work and want to take a couple of months off to write your own app, you can afford to do that, and that if you want to live off of selling your own products, the amount they need to generate to get you there is a lot less.

    Last year I was able to mostly focus on putting out updates for Pinbook for a few months, and I don’t think that would have been possible had I lived in a place where my rent was higher and I had to pay for a car every month just to get around.

    Close to San Francisco and Seattle

    Since my company is in San Francisco, and also things like also things like WWDC and Macworld happen there, I travel to the Bay Area a lot. I also have a lot of friends in Seattle who I like to see whenever possible. From Portland, a flight to San Francisco takes around an hour and a half (there’s also a train to the airport, so getting there is easy), and if you’re not buying at the last minute the price is almost always less than $180. If I want to go to a Seattle Xcoders meet up — or just to visit friends for fun or go to a concert — I can take Amtrack (which has Wi-Fi and a dining car) for about $45 each way, or Bolt Bus (also has power and Wi-Fi) for about $11-22 and be in downtown Seattle in less than three hours.

    About the Weather

    It does rain a lot here, but I would describe the weather as pretty temperate. The coldest it’s ever likely to get is into the thirties, and in the summer I can’t remember a lot of unbearable 100°F days like when I lived in Sacramento. I’d describe the usual rain here as more of a drizzle. It doesn’t often rain terribly hard, just a little a lot of the time. The other thing no one tells you about about the weather here is that the summers are amazing. June through September you’re in the best city to ride a bike in the country and it’s beautiful out. For comparison, because we’re further north it stays light out about 30 minutes longer than in Northern California in the summer.

    Lastly

    I don’t know if the unique benefits of Portland Oregon would appeal to everyone. It’s a pretty progressive place, so conservative people (politically or socially) might not find it so amazing – although I could be wrong. If you think that it might appeal to you though, consider coming and checking it out. At the least, you can get some donuts and check out the world’s largest book store. If you’re looking for tips on when the best time to come is or what you should do while you’re here, go ahead and ask me on Twitter.


    1. Another statistic is that we have 40 microbreweries that operate in the city, which is the highest per capita in the country, although I'm not sure that is entirely relevant to independent software development so much as just something that's awesome. ↩
    2. I like to describe myself as your stereotypical northwest liberal elite. ↩
    3. Not that there's anything inherently wrong with that. ↩
    → 9:48 PM, Nov 12
  • The US Treasury's Debt Limit Page

    The United States Treasury:

    The debt limit is the total amount of money that the United States government is authorized to borrow to meet its existing legal obligations, including Social Security and Medicare benefits, military salaries, interest on the national debt, tax refunds, and other payments. The debt limit does not authorize new spending commitments. It simply allows the government to finance existing legal obligations that Congresses and presidents of both parties have made in the past.

    I do not understand the confusion here or why you can explain this to the same people over and over and have them still not understand it.

    → 12:31 AM, Oct 19
  • UIManagedDocument for Core Data Apps

    As someone who’s spent a lot of my career being the “Core Data guy” on many projects, I’m a bit embarrassed to admit I hadn’t taken much of a look at UIManagedDocument until now. UIManagedDocument came around with iOS 5, and I think because it seemed vaguely iCloud related (it’s not), and because none of the apps I was writing were document based (they don’t have to be), I never gave it a second thought. Now that I have, I can’t see any compelling reason to not use it for all of the apps I’m writing.

    The best way to think of UIManagedDocument is as a replacement for the “Core Data Stack” class I’ve seen people write in a lot of different projects. What that class usually does is encapsulate set up of a Core Data stack into one class (NSManagedObjectContext, NSManagedObjectModel, and NSPersistentStoreCoordinator), often times with a private queue parent context for background saving. Doing this can make it as easy to set up a new stack as passing a file path and persistent store options to your class. What UIManagedDocument does is exactly everything I just said, and so it saves you having to write a bunch of boiler plate code — which is nice. Creating a new document just involves calling -[UIManagedDocument initWithFileURL:] and setting whatever persistent store options you like. You can now pass the document around as needed, or just use its managedObjectContext property to grab its context and inject that wherever you like.

    But what if your app doesn’t work with documents in a way where having multiple persistent stores makes sense? Just create one document with a filename defined in your app. One good use case for using multiple documents is in an app where multiple accounts are allowed. If each account is its own document, than logging out just means deleting the file for that account. Also, since UIManagedDocument is easy to subclass, if you had an app that allows login from different services, it wouldn’t be a terrible place to put syncing logic that applies just to that service. If you were writing an app where you want to save the users data and sync through Service A, Service B or iCloud, you could write different document types to handle some specific differences for the two services and one that you place into an iCloud container.

    I haven’t been using the class long enough to say that I’m sure I won’t run into any show stopping problems, but since the API is simple enough that they haven’t jumped out at me yet I’m only seeing upsides to using it right now.

    → 5:20 PM, Oct 16
  • North by Midwest 05: Spicy Taco

    With a nation in crisis only one podcast featuring myself and Bob Cantoni have put feet on the ground to take the temperature in Washington DC. Possibly my favorite episode yet. Check it out or subscribe in iTunes.

    → 5:08 PM, Oct 4
  • Short Review of Marked 2

    A few days ago Brett Terpstra released a new version of his wonderful Markdown preview app Marked. It’s only available outside of the Mac App Store on its own site, and costs $11.99. The great thing about Marked is that even though it does a lot, you can ignore any features you don’t want easily. If all you want is Markdown preview for when you’re writing Sublime Text or BBEdit, you just have to launch the app and use it that way. If you do decide to explore them though, some of the new features are great.

    Two things in Marked 2 are the most useful for me personally. The first is the ability to set up words to highlight which you’d like to avoid or consider alternates for. I can’t think of another time where a writing app has done something that will actively improve my writing, so this feature alone is worth the $11.99. The second feature that I’m going to use a lot is the ability to preview a document that’s being worked on in MarsEdit. The preview window in MarsEdit is fine, but basic. Being able to use Marked when writing in MarsEdit means I won’t miss out on its features if I decide to skip the dance of writing in another app and then copy and pasting my text before publishing.

    Cody at MacStories has an in-depth review that’s worth reading if you want to find out about all the new features. You can buy Marked 2 from its own website.

    → 2:14 PM, Oct 1
  • Unsubscribe Rule for Apple Mail

    I’ve been making a point lately to take back my inbox and actively unsubscribe from websites which send me unwanted email, and I’ve come up with a great trick to make doing that easier. All I did was create a new Apple Mail rule called “Unsubscribe” which looks at incoming messages for the word “unsubscribe” in the message content, and then set the color of that message to orange. I could probably go crazy and write an AppleScript to automatically create a new action in OmniFocus, but I don’t get so many of these that it feels worth the added effort.

    Unsubscribe Rule

    → 1:29 PM, Oct 1
  • Hipster Ipsum

    Artisanal filler text for your site or project:

    Fugiat post-ironic aliquip authentic, pop-up kale chips Thundercats readymade Etsy Shoreditch vegan polaroid try-hard sed sustainable. Consectetur nesciunt Tumblr mixtape. Nostrud Tonx nihil aesthetic ugh. Raw denim try-hard Wes Anderson American Apparel, keffiyeh pickled actually whatever locavore. Reprehenderit Cosby sweater Pinterest velit mollit, +1 direct trade. Laborum nisi sunt, you probably haven't heard of them delectus pug artisan synth freegan lomo squid. Aute laboris keytar fugiat High Life.

    Choose “Hipster with a shot of Latin” or “Hipster, neat.”

    → 3:47 PM, Sep 29
  • Live Long in Oregon

    Agree or disagree with Obamacare, Oregon’s ads for our exchange are fucking awesome. My favorite part of this ad is that Laura Gibson (our primary cultural export is indie rock and bacon donuts) calls out five or six Oregon jobs, and two of them are “stay at home dad” and “indie rock band.”

    [youtube www.youtube.com/watch

    → 2:10 AM, Sep 28
  • North by Midwest 4: "Agassi Headband"

    We’re recording these things on the regular, like real podcasters. Check out our latest episode.

    → 8:42 PM, Sep 27
  • North by Midwest Episode 3

    Bob and I have put out a new episode of everyone’s favorite podcast themed on one host being from Portland and one being from Cleveland. You can listen on the web, or wait for it to appear in your favorite podcast listening app.

    → 4:59 PM, Sep 25
  • OmniGraffle 6

    OmniGraffle 6 is here and looks fantastic. I was using OmniGraffle 5 last night.

    → 4:00 PM, Sep 25
  • Valve's SteamOS

    Valve (the people who made Portal, Half-Life, Team Fortress 2) are making their own OS. They’re also going to ship two of their own consoles: a $100 box that streams games from your computer, and a $300 one that’s standalone.

    Steam is already extremely popular, and has a TV-centric mode, so if they can take that mode and get rid of the whole needing other people’s OS to run Steam games thing, this seems like it could really work. I’m not sure it changes Nintendo’s situation that much (which is not great), since their success is based more on creating fun games with unique gameplay, but if I were Microsoft or Sony, I’d be shitting myself.

    The Verge has a big article on the whole thing.

    → 12:17 PM, Sep 23
  • FCModel and Current Thoughts on Core Data

    Marco Arment’s Core Data alternative that sits on top of SQLite and FMDB is on GitHub and looks excellent. Core Data has generally worked well enough for me, but maybe not so well that I’m not interested in alternatives. What he’s done is make something simple with a couple of great features built-in:

    • Multi-threading support: Database operations happen concurrently via a serial queue, so you shouldn’t stomp all over yourself. I assume if you’re accessing your model objects in your own threads the normal rules apply.
    • Active record style access: You only need to worry about talking to your model objects and classes, which is simpler in most cases than the way Core Data does it.
    • Simple schema migration: You can version your database and then receive a callback to update your schema as needed.

    The whole thing is pretty similar to what Brent Simmons describes in his objc.io article about using SQLite instead of Core Data. Brent raises a couple of reasons for wanting to do something a bit different in his article. Mostly it comes down to hitting performance walls and wanting something that’s just a bit simpler and less general. The truth is that because Core Data is a general solution which completely abstracts you away from the idea of using a database, I’m not sure there’s anyway that it couldn’t be a bit complex in places and that there wouldn’t be walls to bump up against. In my experience with Core Data everything works great except when it doesn’t, and because you’re so abstracted away from the implementation detail of it using a SQLite store, when you do hit those walls, you hit them hard. Some things I’ve run up against with Core Data are:

    1. Threading still sucks, even if it has gotten better.
    2. Tries to solve for edge cases I'm not sure anyone has and is overly complex because of it.
    3. Having to pass around an NSManagedObjectContext to do just about anything.
    4. When you have problems, it's not always easy to find documentation that explains what's going on.

    All of that being said, I still think that Core Data does do a lot for you. The first three issues I raise are mostly mitigated by having good code hygiene and also by using MagicalRecord. Taking the time to read the documentation and also Marcus Zarra’s book on the topic (before you start using MagicalRecord), would probably solve a lot of problems for people as well.

    As far as performance goes, it wasn’t easy to get there, but Pinbook imports bookmark collections in the range of 20,000+ in a few seconds on an iPhone 4S, so it is possible to get very high performance when using Core Data. I can’t imagine there’s too many iOS apps out there that have those kinds of performance requirements.

    There’s also some specific things that Core Data really makes a lot easier. For example, it’s batching and faulting mechanisms work really well. One thing that I did not have to think about very much when developing an app that might need to display 50,000 items in a table view was managing memory for those items. I’m sure I could have come up with a way to handle that using a custom solution, and it wouldn’t have even been that hard, but with Core Data it was practically free. I’m also hearing from friends that Core Data sync might be finally working the way it should in iOS 7, and if that’s true, and I write an app which really just needs to make sure a users data remains in place between iPhone, iPad and Mac versions, would be awesome, although I’m not holding my breath until I have time to play with it myself.

    No general solution will ever be perfect fit for every case. In those cases writing a custom solution is nothing to fear. If you’re writing a Mac or iOS app, however, Core Data probably is the right fit most of the time, and you should really consider what you’re doing when it’s not.

    → 6:28 PM, Sep 17
  • 360iDev September 8-11 in Lone Tree Colorado

    I'm excited to be given the opportunity to speak at 360iDev again in 2013. As usual, it's a great lineup this year, and there's a few talks this year that I'm really excited about. In particular Brent's SQLite and Justin's Core Image talk are two that I'll definitely be at. I'll be closing out the first day with a general session talk called App Making for Deadites about what Ash's journey in The Evil Dead movies can teach us about making great apps 1. I'll also be on a panel with my friends Matthew Henderson and Samuel Goodwin in the same room Tuesday morning.

    360iDev will be held in Lone Tree Colorado September 8-11, 2013. You can buy your ticket now, or check out the schedule.


    1. I'm really hoping that I haven't grossly overestimated how many people have seen those movies. ↩
    → 2:55 AM, Aug 26
  • Izze the Little Brown Pig

    About seven years ago — when I was twenty-one and had just been hired at the Guitar Center in Sacramento — I bought a baby guinea pig and named her Izze (like the soft drink). Last Thursday she died. Friday I cleaned all of her stuff out, took her cage to the recycling, and put her food bowl in a drawer in the kitchen. Seven years old is a long time for a guinea pig to live, and a quarter of my life so far. The day I got her I could hold her in the palm of one hand. On Thursday I had to take her on the bus in a box to the vet so that they could cremate her and dispose of her ashes.

    Before Izze, I had two others — Teddy and Dolly. Teddy I got when I still lived at home and worked at a Petco. She was one of these animals someone at the store decided couldn’t be sold for one reason or another, so they left her in the back with all of the sick animals. Eventually she would have gotten sick and died back there, so I took her. I had Teddy for about three and a half years, and she died while I was in Germany about a year before I moved to Portland. Dolly I got from a guinea pig rescue in the South Bay right after I moved out of my parents house. She only lived a couple of months; she was probably older than they thought when I adopted her from the rescue.

    While Teddy was still alive — right before I was about to go to Germany to work with Cultured Code for a couple of months — I bought Mooby (like the fast food mascot from Kevin Smith movies). Mooby was big and had a lot of personality from the day I bought her. Since Teddy died while I was gone, the next four years it was just Izze and Mooby. When I moved to Portland, They sat next to me as I drove a U-Haul truck to Portland. The first month I was here, they stayed with me in a hotel and chewed up some of the furniture (oops). After that they both came with me to the three different places I’ve rented since moving to Portland. When Mooby died last year I was pretty broken up about it, and Izze was all by herself for the first time.

    I was a little afraid to write this, because I thought people might make fun of the fact that I’m talking about a guinea pig, and not a dog or something. Really though, why should it be any different? Seven years is a long time. I’m twenty-eight now, and that pig went with me to every place I’ve ever lived — from before I had any idea what I could do with my life, to finding a career that I love, to moving to an entirely different state. She was there for every part of what I consider my adult life so far.

    Izze was a sweet little brown guinea pig who squeaked whenever I opened the refrigerator, peeked out her cage to see what I was up to, never bit anyone her entire life, and who was the companion who’s stayed with me the longest so far in my life. I’m going to miss her a lot.

    Izze getting her cage cleaned. Macintosh Meets MoobyPainting a friend had made for me.

    → 9:45 PM, Aug 25
  • Tumult Hype 2.0

    The Tumult guys sit behind us at our office in San Francisco, and I’ve known them for a few years besides. Hype is an really great HTML5 animation builder for Mac, which now has an iOS companion app. Go read their post about it to find out more.

    → 3:36 PM, Aug 20
  • The Startup T-Shirt Stereotype

    Braid Lab’s own Jason Corwin questions whether t-shirts are a worthwhile investment for startups on in a post titled “The Startup T-Shirt Stereotype.”

    You're at the bottom of the barrel, nothing left to wear, and you're forced to dig into the dresser equivalent of a junk-drawer. A graveyard of shirts, it's almost like having your own personal crunchbase in your dresser.

    Stickers on the other hand? No question. Yes. My house is primarily decorated by various Octocat variations and stickers from my friends companies.

    → 2:35 PM, Aug 20
  • Nicer Segue Preparation With Storyboards

    When we started developing the iOS app for Braid, a decision I made early on was to use Storyboards. If you’re not familiar, storyboards are a way to create iOS user interfaces visually and draw connections between the different screens in your app. In storyboard-speak, each screen is referred to as a “scene,” and the transitions between each scene is called a “segue.” Storyboards are a fantastic feature for a couple of reasons, including that when using storyboards you can set up static and dynamic table views visually, drag and drop container view controllers and get a visual picture of what you’re entire app looks like.

    One part of coding with storyboards has always bothered me though — the strange way that Apple’s example code shows how to set up a view controller before a transition (setting a delegate, detail object, etc):

    https://gist.github.com/collindonnell/11484b74e489575c2275.js

    The string comparison felt a little gross to me, and if you have a lot of different segues, the if/else in this method could get long pretty fast, even if you’re breaking out what happens in each condition into it’s own method. If you do end up writing a method for each segue, all of those -[prepareForSomethingWithSegue:sender] methods could get repetitive pretty fast.

    A nicer way is to use a block for each segue you need to prepare and to encapsulate that into it’s own class, which I did. The class is called BRLSeguePreparationController and makes it very simple to deal with preparing for segue’s in this way.

    1. Create a BRLSeguePreparationBlock for each segue you need to prepare for.
    2. Set them using -[BRLSegueController setPreparationBlock:forSegueIdentifier:]
    3. Call -[BRLSeguePreparationController prepareSegue:identifier:] from your view controllers prepareForSegue:sender: method.

    Here’s an example:

    https://gist.github.com/collindonnell/cb8654a97ecddda04704.js

    I’ve given the class it’s own GitHub repo and an MIT license, so use it in your own projects. If you make any improvements, make sure you add a pull request on GitHub. If you find the class useful, please check out my companies website to find out what we’re working on, and download our Passbook pass from there to keep up to date when our app comes out.

    → 8:24 PM, Aug 17
  • Introducing My New Company: Braid Labs

    I’ve been a bit quieter the last couple of months on my blog and Twitter, and it’s not for no reason. Since the beginning of June I’ve been working on a new project with a team in San Francisco (I go back and forth), and I wanted to wait to talk until I had part of it to show. First though, let me tell you about the team and why I was so excited to work with them.

    (Short version: I have a new app I’m working on with a team, we made a Passbook pass, and you should go get it.)

    The Team

    I’ve known my friend Zain — who’s been a longtime Django developer — for about four years. We met around the time that I had just spoken at the first or second 360iDev, and Zain at DjangoCon, before having a crazy fun time hanging out in Boulder Colorado for a couple of days. We’ve been friends ever since, and in between Zain went through Y Combinator, worked for Trulia, been a big Django contributor and continuously worked on neat things. He’s absolutely one of my favorite people. Which is why — even though I’d never considered doing this sort of thing before — when he told me he had a new company he was working on and they needed a fourth guy who was an iOS developer to be a founder, I was interested to find out more.

    The other two guys are Jason and Idan, who are also Python developers (everyone on the team has a technical background). Jason handles the business side of things, and also helps Zain with developing the backend for our app. I’d describe him as one of the nicest and most immediately likable people I’ve ever met. Idan works on design, and if you’ve ever worked with someone who considers their designs sacrosanct and is unwilling to consider the opinions of others, then something like the opposite of that is Idan. He’s a great designer and will absolutely defend things he thinks should be a certain way, but he’s never made me feel as though we weren’t designing the app together. Because I love design myself, and care so much that the end product is the best it can be, most of the times I’ve worked with someone else it’s felt stifling more than anything else. With Idan, I feel like we’re able to collaborate and that our mutual goal is to make the best app possible.

    The App

    Of course, the best team in the world wouldn’t mean much if I hadn’t also been excited about what we’d be working on. The app is an e-mail client, and it’s called Braid. One of the first decisions I was a part of making was that it would be iOS 7 only, and we’re working hard to get Braid ready for the release. I’ve almost always used Apple’s Mail clients, and although they don’t have the most features, they’ve always worked the best for me. The reason is that everything else I’ve tried that’s different has wanted me to treat my e-mail in a special way to take advantage of it, or tack a bunch of things onto e-mail that don’t feel like they belong. Braid is about making e-mail better, not about fundamentally changing the way you think about it or turning your inbox into a to-do list.

    One way we’re doing that is with our follow-up feature. Follow-up in Braid isn’t about pushing things out for a specified amount of time regardless of what happens between now and then, it’s about saying “If I don’t hear back from this person by a certain date, remind me to follow-up.” You tell Braid to do this at the time that you send your message, because usually that’s the time when you have the most context for what’s going on with this person. Instead of turning your inbox into a to-do list, we’re giving you an additional “waiting for” list. To us that’s a lot more useful, because the alternatives have always been flagging/starring messages — which have limited context — and apps that continuously pop the same messages up over and over again in your inbox, turning it into a to-do list.

    Add to Passbook

    The app can’t come out until iOS 7 does, but we wanted to give people who are interested something sooner. So today, you can add us to your Passbook. It’s be the best way keep up to date with us, and we’ll even periodically send you interesting stats about your e-mail (and possibly other goodies). Go to our website from your Mac or iOS device, select “Get a Pass”, login with Gmail and we’ll show right up in your Passbook.

    → 5:43 PM, Aug 14
  • How I Fixed Not Being Able to Remotely Connect to a Mac

    As long as I’ve had my iMac (about six months), I’ve been unable to connect to it through either Back To My Mac, or even locally on the same network. Whenever I tried, Finder would spin for a second and then report “connection failed.” The solution for me ended up having something to do with the Apple ID associated with my user account, because what ended up fixing it was to go to the Users & Groups preference pane, click change, remove the Apple ID and re-add it. Afterwards I can connect remotely and locally. I couldn’t find this anywhere else as a solution to this problem, so I figured it might be helpful to someone else having the same problem.

    Change User Apple ID

    → 8:17 PM, Aug 1
  • The San Francisco Rent Explosion

    The San Francisco Rent Explosion:

    In San Francisco, the median rental price for an apartment reached $3,295 in June 2013. During this most recent quarter in San Francisco, a one bedroom will cost you $2,795, a two bedroom $3,875, and a three bedroom $4,750.

    This article demonstrates exactly how insanely expensive trying to rent an apartment in San Francisco is right now. If you have a dog, it’s hard to imagine someone who’s moving from somewhere else even having a shot at finding a place.

    → 3:50 PM, Jul 19
  • Use Find My Friends To Help Your Mom Worry Less

    Since I’m working in San Francisco now, I’ve been traveling back and forth a lot, and every time I talk to my mom she always asks me to let her know that I got there and home safely. A neat feature I just discovered in Find My Friends is that if you go to the “me” tab, you can set it to notify whoever you want every time you arrive at a specific location. So, I can set it to notify Mom whenever I reach SFO or PDX.

    → 11:50 AM, Jul 9
  • Pat Metheny on Many Reasons Kenny G Is a Douchebag

    Pat Metheny is a well known jazz guitarist with three gold albums and twenty Grammys. He also really dislikes Kenny G. Somehow I ended up on this article where he talks about it, and it’s just great from beginning to end.

    The best part is that if you ever meet a Kenny G fan, you now won’t need to be a jazz expert to explain in detail why he sucks. I can’t imagine that you ever will, but it’s good ammunition to have incase you ever met that one fan who won’t let “not for me” stand1

    Besides thinking he sucks as a musician, he’s also pretty pissed about the time Kenny G overdubbed himself over a Louie Armstrong track, and in the paragraph after this one calls it “musical necrophilia”:

    Not long ago, Kenny G put out a recording where he overdubbed himself on top of a 30+ year old Louis Armstrong record, the track "What a Wonderful World". With this single move, Kenny G became one of the few people on earth I can say that I really can't use at all - as a man, for his incredible arrogance to even consider such a thing, and as a musician, for presuming to share the stage with the single most important figure in our music.

    Read the entire original article.


    1. Although, I really can't imagine that anyone in 2013 is that big of a Kenny G fan. ↩
    → 7:09 PM, Jul 6
  • North by Midwest Episode Two

    The second episode of myself and Bob’s wonderful self-help podcast — North by Midwest — is available now. This week we discuss our trips out of town, soy yogurt and the risks of defying me. Check it out, or subscribe in iTunes.

    → 8:01 PM, Jul 2
  • Satechi Portable Energy Station Follow-up

    Last month, before headed to WWDC I wrote a review of all the different external battery packs I’d used up until that point, and mentioned that I’d gone for a 10,000 MaH brick style one called the Satechi Portable Energy Station on the recommendation of The Wirecutter. Since then I’ve used it at home, at WWDC, and during my current six day trip to San Francisco, and it’s worked great.

    I usually have my backpack with me, so if I need to charge, I can just put it with my phone in one of the pockets for 30 minutes and have my phone mostly charged. I’ve used it a few times on this trip, haven’t charged the Energy Station itself, and it’s built in power indicator is reading three fifths full.

    If you need to buy one locally, or can’t order the Satechi from Amazon in your country, I’d suspect that any other similar capacity charger will probably be just as good.

    → 4:12 PM, Jun 29
  • Jumping to Protocol Definitions With Pragma Mark

    Using pragma marks to organize source files is one sign that the person who wrote the class put a little bit of care into what they’re doing, but they can actually be more useful than just a way of breaking up an implementation file.

    My favorite trick is to use how I name my pragmas to jump to protocol definitions more quickly. I always use a pragma mark before the implementation of a protocol in my source, and in most of the code I’ve other people write, they do something like this:

    #pragma mark - Table view data source
    

    A better way is to use the actual name of the protocol you’re implementing instead, like this:

    #pragma mark - UITableViewDataSource
    

    Now, if you command+click on that Xcode will jump right to the protocol definition, and option+double-click will take you straight to it’s documentation.

    → 4:44 PM, Jun 27
  • NetNewsWire 4 Public Beta

    NetNewsWire has been my favorite feed reader for the Mac since I’ve known what a feed reader is. When the great folks at Black Pixel took it over, I knew they’d do something great with it and — since I love being right — I’m happy to say the new beta really is just as great as I’d hoped. Syncing will come in time, and in the meantime it’s absolutely worth it to download the beta and spend the $10 to pre-order the final version.

    The hardest, scariest, thing I can imagine is to take something so many people love, and that does so much, and dramatically simplify it without ruining the essence of why people loved it in the first place. The public beta of NetNewsWire 4 shows not only that Black Pixel gets it, but that once again they can deliver on taking something outstanding and making it even better.

    Go download it for free.

    → 2:30 PM, Jun 25
  • Bob and I Have a Podcast

    My friend Bob Cantoni and I first met at Çingleton Deux about nine months ago, and came up with the idea of starting a podcast together. So, we’ve done that, and we’re calling it North by Midwest (I’m from Portland and Bob i s from Cleveland).

    In our first episode we talk about Skype ringtones, expensive dates, my crazy ergonomic keyboard and self checkout lines at the grocery store. Go check it out and subscribe in your favorite podcast listening app.

    → 12:42 PM, Jun 25
  • Interview With Kim John Il's Sushi Chef

    This interview with Kim Jong Il’s personal chef of ten years kind of blew me away. The man himself is from Japan — and does not come off as a great person — but for several years he was maybe the only person who was able to talk to the dear leader like a human being without getting shot for it.

    → 5:50 PM, Jun 20
  • Brent's AltWWDC Slides

    Brent Simmons slides from AltWWDC on how he made Vesper are really informative. I’m strongly reconsidering my use of Core Data in a new project partially because of them.

    → 3:27 PM, Jun 17
  • 10 things designers need to know about iOS 7

    Really good article that covers most of the high level changes in iOS 7 that designers need to be aware of:

    We’ve scoured Apple’s Transition Guide and picked out the 10 most important considerations for designers. Read on to find out what you need to know about iOS 7 and how it will necessitate changes to the way you present your content.

    You can read the entire thing here.

    → 2:19 PM, Jun 11
  • Great Coffee Near WWDC

    If you’re near Moscone West during WWDC and looking for coffee, you might find yourself defaulting to the nearest available option: Starbucks1. If, however, you want something a lot better and a lot more local, there’s no reason to settle for something you’re not crazy about. San Francisco is full of great local establishments. I know of at least three within walking distance I can recommend.

    Blue Bottle (0.3 mi)

    Right around the corner from Moscone West, there’s Blue Bottle. It’s definitely the place you’ll see the most fussy coffee loving Apple nerds are headed to, partially because its great, and partially because its great. They also have a good variety of other snacks2. On more than one occasion I’ve run into other conference goers while waiting in line who I either knew or didn’t know but was able to start a conversion with. Speaking of the line: it’s usually around the corner. It can be a bit unpleasant when it’s hot out — like it was last year — and although you will meet people in in the line, it’s probably not a great choice if you want to sit down and talk since seating is very limited.

    Besides being long, the line actually tends to move pretty fast. If you just want to grab a coffee to go, Blue Bottle is a really good choice.

    Sightglass Coffee (0.6 mi)

    A little further — but still totally walkable if you’ve got a little time to kill — is my personal favorite place in the city: Sightglass Coffee. The shop itself reminds me a lot of some places here in Portland, and I actually get their beans from a local shop that sells them here pretty often.

    When you walk in, the first thing you notice is that it’s surprisingly large. I’m used to things in San Francisco being a little smaller, and Sightglass is the exception. Because of that there’s ample seating upstairs, making it the best place I know of to meet someone if you want to sit down and talk for a while.

    You won’t run into as many people from WWDC as you would in the Blue Bottle line, but they make all the same things you’d get Blue Bottle at least as well, and you can actually sit down and relax for a bit.

    Philz Coffee (0.9 mi)

    Granted, I walk a lot at home, and I’m not attending the actual conference this year, so you may be less willing to walk nearly two miles round trip for coffee than I am. If you do want to explore a bit though, Philz is worth checking out at least once. It’s a chain, but only in the Bay Area. The atmosphere is nearly the opposite as Blue Bottle or Sightlass — more hippy than hipster, and what they specialize in making is a pseudo-pour over in these metal pots I’ve never seen anywhere else. Instead of stating a country of origin, the coffees at Philz have names like “Philharmonic” and “Ambrosia Coffee of God.”

    It’s worth checking out for a couple reasons. First, you get to walk by AT&T park to get there, which I recommend. Second, the coffee is surprisingly good and the atmosphere seems like something you’re unlikely to see outside of San Francisco.

    Let’s Get Coffee

    If you’re the kind for whom half of the fun in a new city is exploring the local coffee culture, San Francisco is a great place to go, and these are just three of a bunch of great options. If you’ve got any suggestions for me, or want to do some exploring, or just want to grab coffee this week, get in touch.


    1. If you like Starbucks and don't care to try anything else — go ahead, it's right there, and if you enjoy their products, that’s very convenient for you. ↩
    2. I’ve usually had good luck finding vegan things here, if that’s a concern for you. ↩
    → 5:45 PM, Jun 9
  • My One WWDC Prediction

    Like everyone else, I have no idea what Apple might announce tomorrow morning. Tim was clearly not blowing steam when he said they were doubling down on secrecy. So here’s my one prediction:

    • Helvetica Neue as the new system font for OS X 10.9.

    I was hoping for Myriad Pro – It has similar proportions and I think would fit great as a direct replacement for Lucida Grande that looks better on retina screens, but I’m pretty sure it’s Helvetica Neue.

    → 4:17 PM, Jun 9
  • Giving it Away

    Gabe has one of the best takes on the dangers of giving away our privacy to companies like Google and Facebook I’ve heard:

    The danger in Facebook collecting conversations in a restaurant is not that they will know what kind of perversions you might enjoy and sell you appropriate paraphernalia. The danger is that Facebook holds an enormous index of identifiable, personal information in one place.

    Read his entire post.

    → 10:00 AM, Jun 7
  • Introducing Vesper

    Of all the people I’ve had the opportunity to spend time with over the past few years, three of the smartest and most talented are Brent Simmons, Dave Wiskus, and John Gruber. Today they’ve released Vesper, an app I was lucky enough to help test. Vesper is a note taking app, but instead of being a replacement for Evernote or Notational Velocity — it’s sort of its own thing.

    While other apps do a lot more, the amount of more that’s there usually makes getting to the simple things kind of a kludge. Vesper — in contrast — is painstakingly simple, and designed by someone who was totally okay with people either loving or hating it. I don’t mean that I think anyone was inflexible in creating it — during the beta I saw them take a great deal of care in selecting the best feedback and integrating it into the app. What I mean that I can’t imagine anyone being “just okay” with this app, and that I think the reason for that is that there was a clear vision for what Vesper is and isn’t, and that it’s been adhered to without compromise. My guess is that a lot of people are going to fall into the love it category.

    Buy Vesper on The App Store.

    → 9:52 AM, Jun 6
  • Which Mobile Battery Pack You Should Buy for WWDC

    If you’re attending WWDC next week, the one piece of gear that I think is more essential to getting than any other is getting some kind of mobile batter pack for your phone. No-matter what you do — including not using it — your phone will be constantly running out of battery the entire week. It’s important — and not too late — to get one before leaving, because the local Apple Store is likely to be sold out of all but the crappiest models1. As far as type, there’s three varieties you might come across, and over the past three years I’ve now tried all three.

    Dongle Style

    Dongle Style Battery Pack

    In 2011, I ended up getting one of this style for a good reason — I didn’t buy one before leaving and it was the only kind available at The Apple Store. It seemed practically useless, and was also pretty unwieldy. I’m not sure these are even being made for the iPhone 5, or if you’ll run across it, but if you do avoid this type as it’s going to end up being more trouble than it’s worth.

    Case Style

    Case Style Battery Pack

    Last year, I was at least a little smarter and made a decision on what to get before leaving, and so I bought one of the case style chargers that are probably the most common. I found this style to be a big improvement over what I had the year before, and with the side benefit of being a pretty substantial case2.

    It seemed to give me enough power that if I started off the day with both it and my phone fully charged, I could end the day just about running out of battery. It’s also nice, because you don’t need to do anything extra to bring it with you. The disadvantages were that it does make your phone kind of hard to pocket, it’s not enough power to last more than one day and it’s going to be useless once Apple changes the form factor of the iPhone. Because of that, I was only able to use this for a couple months until the iPhone 5 came out, and it’s sat in a drawer ever since.

    Brick Style

    Brick Style Battery Pack

    This year, I sized up and bought a brick style charger. Instead of connecting directly to the iPhone at all, it’s just a brick with two USB plugs on it. It also holds about 5-6 times as much power as the case style charger I had last year, which means that it should theoretically last more than one day if I’m the only one using it3.

    It does mean that I’ll have to have something to put it in wherever I go (a lot of people could probably fit it in a front pocket), but I’m likely to have my backpack with me, anyway. It does require bringing an extra cable everywhere I go, but that tradeoff bothers me less than it being worthless to me should the shape of the iPhone ever change. On The Wirecutter’s recommendation, I bought the Satechi Energy Station 10000 for $60 on Amazon (their affiliate link), but I think that any of this style with a similar capacity (10,000 MaH) that you can get before leaving should be fine.


    1. On that note, if you're attending the actual conference, and bringing a MacBook Air, it's a good idea to pick up a Thunderbolt to Ethernet adapter as well, because they'll definitely sell out of those, and Apple has ethernet available in the lunch/labs area of the conference center. ↩
    2. Which is useful, because there's a good chance you're going to drink too much and drop your phone. ↩
    3. I think that would be extremely optimistic assumption. On the upside, you're likely to be the most popular person at the bar. ↩
    → 9:14 AM, Jun 6
  • The Cheapest Generation

    Link: The Cheapest Generation

    Article in The Atlantic about how millennials just aren’t as interested in buying houses and cars as our parents:

    The largest generation in American history might never spend as lavishly as its parents did—nor on the same things. Since the end of World War II, new cars and suburban houses have powered the world’s largest economy and propelled our most impressive recoveries. Millennials may have lost interest in both.

    I don’t know if I’m different than other people my age — this article says I’m not — but debt of any kind has always scared the crap out of me. It’s difficult for me to paint buying a new car or a house in any other terms than a lot of money I’m going to owe someone else. I just can’t get more excited about either of those things than I am scared of the debt they represent.

    → 8:35 PM, Jun 5
  • Migrating From Octopress to Wordpress

    After several months of running this blog using the static blogging system Octopress, I‘ve moved back to self hosted Wordpress. There’s a lot of things I liked about Octopress, and there’s a lot of things to not like about Wordpress, so like everything, it really it just came down to which tradeoffs I could live with.

    The main benefits you hear about when moving to a static system like Octopress are:

    1. Your site won’t go down when you get Fireballed.
    2. Your published site is all static files, so it loads really fast.
    3. You get to write in Markdown, and your files get stored that way.
    4. Easy to keep posts under source control.
    5. The default theme is pretty nice (on Octopress specifically).

    Some of this, I think, gets oversold, and no one ever seems to focus much on the disadvantages (some of these apply more to Octopress than other systems):

    1. Your posts all get saved and stored as plain text — which is great — but because of that if you ever want to move to another system that doesn’t happen to use static files formatted exactly the same way, it's non-trivial to get them into that system.
    2. If you're not a Ruby developer, setting everything set up and working correctly is probably going to be a pain in the ass.
    3. Using an app like MarsEdit probably isn't going to be an option. I tried a couple times and could never get OctoMars working correctly.
    4. It's going to be pretty hard to blog from your iPhone/iPad unless you set up some kind of Rube Goldberg machine involving Dropbox or SSH-ing into a server. That's adding a lot of friction.
    5. If you don't like the default theme, there's a lot less out there to use, and I found writing one from scratch to be pretty inscrutable.

    Of course, a lot of this applies to just me. If you’re not worried about migrating out of a static system later, don’t have a favorite blogging app or don’t care about being able to publish from your phone, most of this isn’t really going to apply. And, for what it’s worth, a few of my other issues — including the fact that Octopress hasn’t had a major update in two years — probably would have not have been an issue had I chose Pelican instead of Octopress.

    Octopress to Wordpress Migration Script

    If you search for guides on how to migrate from Wordpress to Octopress, you’ll get a lot of results, but not so many the other way that describe how to actually migrate a large number of posts the other way. I also had to think of someway to maintain a bit of my nerd cred, and so I wrote a script to do the migration.

    What it does is parse an Octopress _posts directory, reads the YAML front matter and content, and then sends it to a Wordpress blog using the Wordpress XML-RPC API (there was a good Python module for this part). I can’t guarantee that it‘ll work in your specific case, and it won’t retain categories from Octopress, but it did work for me. I’ve put the script on GitHub for others to use and improve.

    → 6:35 PM, Jun 5
  • In San Francisco Next Week

    Although I didn’t buy a ticket this year, I’ll be in San Francisco all of next week during WWDC. On Wednesday I’ll be speaking at AltWWDC on tips and tricks for writing fast apps. Be sure to get in touch to grab coffee or beer if you’re around during the week.

    → 12:38 AM, Jun 5
  • Apologizing in Advance

    Currently in the process of moving blog engines, so I apologize in advance for any repeats in the feed.

    → 7:47 PM, Jun 4
  • Back to Google Apps

    About a month ago, I posted about how I was switching my work e-mail from Google Apps to Fastmail, and how it was just super. Well, after a month it wasn’t, and a couple of nights ago I switched back.

    Ultimately FastMail had a major issue I didn’t see any easy way to get around: the spam filtering. It just isn’t nearly as good as Gmail. There’s two ways spam filtering can fail: it can let spam into your inbox, or it can mark things spam that aren’t. Between the two, I can live with spam making it into my inbox occasionally, but I can’t live with it marking important things I want to see as spam. The other issue I had that it would greylist messages it thought might be suspicious and cause them to be delayed by up to an hour.

    The biggest thing that I was hoping to get out of switching was to use something that worked better with Apple’s mail apps than Gmail, and it did in the way that there was no concept of labels to contend with, but I think the better solution is just to suck it up and use a native iOS client for Gmail and its web interface when I’m on a Mac. The side benefit is that I’ll never send work e-mail from my personal account and vice-versa this way. It also turns out that there’s some pretty great Mail apps for Gmail on iOS I had no idea existed. The biggest downside is that I don’t have direct access to my regular address book through Gmail, but maybe separating work and personal contacts isn’t the worst thing I could do anyway.

    → 3:43 PM, May 30
  • Nick Bradbury Joins Automattic

    Nick Bradbury (FeedDemon, Social Sites, Glassboard) has taken a job at Automattic (the people who make Wordpress). It sounds like a great fit. Congratulations, Nick!

    → 6:14 PM, May 18
  • Springboard #7

    I had a fun time recording Springboard with Ash Furrow recently. We talked about completion blocks, getting started in iOS development and writing a niche app.

    → 6:25 PM, May 8
  • Pinbook Support in Sunstroke Fever Reader

    If you use Shaun Inman’s Fever for RSS, the app Sunstroke just got a big update which, among other things, adds iPad support. One of the other features I’m a pretty big fan of is support for using Pinbook to send links to Pinboard. To enable it, go to Settings, find Sunstroke, and switch it on. Because the app takes advantage of Pinbook’s x-callback support, it’s really seamless and you’re sent right back to Sunstroke after you finish.

    → 3:32 PM, May 1
  • From Gmail to FastMail

    Late last week — due to nothing wrong with Google’s services — I turned off my Google Apps for Business account and switched my work e-mail over to FastMail. The reasons for switching weren’t that Gmail had done anything wrong, but that I valued the better OS integration of Apple Mail more than the features of Gmail, and that Apple Mail really sucks as a Gmail client.

    Why do I think it sucks? Well, the fact that labels in Gmail aren’t really directly comparable to mailboxes in Mail is annoying, but not show-stopping if you stay away from the web interface. The biggest reason was that archiving works differently on Mail for iOS and Mac with a Gmail account, and does so in an incompatible way. On iOS archiving means always sending messages to “All Mail” — even if the label is hidden — and on Mac it means always sending it to a mailbox named “Archive”.

    And so — after doing some research and finding out what other people were using — I switched to FastMail. If sending calendar invites with a Google account worked on iOS, I’d probably miss Google calendar, but I’d already been using an iCloud calendar because of that anyway. Archiving also still doesn’t work right between the two platforms: for some reason Mail on iOS can only send messages to an “Archive” mailbox if you’re using an iCloud account — which is insane — but there’s nothing I can do except hope it’s fixed in iOS 7.

    One thing that FastMail makes a lot easier is automatic forwarding to another address. So, for example, I use Tender for my support, which has a feature that lets me forward support mail send to a specific address to Tender in order to create support tickets. In Google, I either had to route it through an account, or set up a Group that forwarded to it, either of which was a pain. In FastMail I tell it “support@mydomain = address@tenderapp.com,” and it works. In general I feel like a lot of these most common tasks are easier with FastMail, because it doesn’t seem so focused on the idea that I’m managing a really large business, rather than a small one with a few e-mail accounts.

    If you’re happy with Google, stick with it. If you’re not, FastMail is working out really well for me so far.

    → 6:23 PM, Apr 29
  • Azure Mobile Services and Core Data May 1st in Portland

    On May 1st, I’ll be giving a presentation on Core Data at Microsoft’s Portland offices, and Josh Twist (of the Windows Azure team at Microsoft) will be giving a presentation on Windows Azure Mobile Services.

    I saw Josh give this presentation in Seattle a few weeks back, and it’s great. They’ve really made something that can make a lot of developers lives easier without needing to be an expert on writing server software.

    Also, there’s going to be free pizza.

    It’s right downtown, so I’m sure some of us will go out for drinks after. It’s free — but space is limited — so register on EventBrite if you’d like to come.

    → 7:30 PM, Apr 25
  • Systematic #41

    Brett Terpstra was kind enough to have me as a guest on his show Systematic, and the episode is out now. We discuss indie app development, coffee and wearing watches.

    → 1:30 PM, Apr 23
  • How and Why I’m Using Evernote

    I’m not sure what triggered it, but all of a sudden it seems as though the nerd world has gotten into — or back into — Evernote. Merlin Mann talked about it on his recent visit to Mac Power Users, Brett Terpstra said nice things about it on on Systematic recently, Gabe Weatherhead has been posting about it on MacDrifter and I’ve been obsessed with it the past several days as well. It’s also possible that it’s been that way all along, and I just never noticed. Like I bought a blue Volvo station wagon, and now I’m seeing them everywhere.

    There are two reasons that I’ve sort of always shied away from getting too into Evernote in the past:

    1. Afraid of being locked in. Finder and text files have no lock in.
    2. I hated all of the apps.

    Lock In

    Evernote makes it pretty easy to get my actual files out as attachments (PDFs, images, etc). It’s also got full AppleScript support, so I don’t think getting my text out would be all that difficult either. I’d probably lose any RTF formatting going to something else, but I don’t use a lot of formatting, so I don’t think that’d be a problem for me.

    The Apps

    The last time I tried Evernote — about a year ago — my experience was basically like this:

    1. Install the Mac version of Evernote.
    2. Drag a PDF onto Evernote.
    3. Watch it crash.
    4. Uninstall the app.

    Fast forward to now, and the apps are between good and great in terms of stability and user interface. It seems like version 5 was a big update that fixed a lot. Some of how you get around in the Mac version is a little confusing, but not terrible, and nothing I can’t get used to. As just a way to quickly enter and find text based notes, it can’t really compete with nvALT, but you get a lot for what you give up.

    Why Use Evernote

    Fiddling is fun, but I’d like to avoid the temptation to switch every time someone comes out with a new app update. There’s a few things Evernote offers that no one else really can.

    A Shareable Bucket for Everything

    Besides Finder, Evernote is the only app I know of that you can really just throw anything at — PDFs, images, text notes — everything. And it’s not just that you can put everything into it, it’s that it treats most of those things the same way (through OCR), so that doing a text search is going to bring up results from all of the above.

    I’ve put this to a lot of use already. For example, every time I buy a new bag of coffee now I take a picture of the label and put into a notebook called “Coffee Beans.” So I can now search for “Guatemala” and have all the bags of Guatemalan coffee I’ve bought show up. Or search “Stumptown” and have every bag of Stumptown beans I’ve bought come up.

    Another use might be looking for a new apartment. Create a new notebook called “Apartment Hunting” and share it with your significant other/roommate. You can now both add pictures of “for rent” signs you saw out and about, or web clippings from Craigslist. All of the pictures you took are now automatically tagged with the location, and if you want you can manually add location data to the web clips as well.

    Add-On Apps

    I noticed when Evernote bought Penultimate and Skitch, but since I wasn’t using either of those apps a lot at the time, I didn’t put much thought into it. Now that I’m looking at them again, the ability of both apps to sync with Evernote has made them both really attractive. Penultimate plus a Cosmonaut stylus is combination I could see actually using for sketching app ideas besides paper. Since Skitch is now available on iPhone, iPad and Mac, it means that if someone sends me an app to test, I can take a screenshot on whatever device I’m on, mark it up with design notes, and send it back to them.

    The other add-on apps I’ve been using are Evernote Food and Hello. Food let’s me search recipes from within the app, but also sync against any existing recipes you’ve already got in Evernote. It also lets you make a note of whenever you’ve had a meal somewhere, or search for any restaurant and save a note on it. And of course it saves the location, and often even has the menu for the place you were at. I’ve been using it to back fill places I liked in San Francisco, Montreal, Denver and New York so that the next time I’m in any of those places I don’t have to try and remember where it was I had a great vegan panini.

    I’ve played with Hello less — because I haven’t been to any conferences or meet ups this week — but I tried it out at home. What it seems to do is let you take a picture of someones business card when you meet them, it can then pull their data off using OCR, sync it with your address book, and keep a running log of when you’ve met this person. I’m kind of excited about actually trying this out.

    How I’m Using It

    The biggest thing I’ve learned is that — like butterflies — notebooks are free. It’s usually easier for me to create a new notebook on a topic than to try and fit it into an existing one, so I’ve just been creating as many as I need, as I need them. I add one for every project or area of my life, and then if any seem very closely related, I drag them together to create a “stack” (Evernote’s concept of a folder). I’m doing more or less the same thing with tags, although I’m trying to stick with using tags for items that could potentially be spread across multiple areas, and notebooks for items which probably aren’t. Sometimes there may be overlap, but I’m not too worried about it. The best plan seems to be adding whatever contextual information you think would help in terms of title, tags and notebook, and then using search to find it later.

    Another lesson is that Evernote really works best if you put as much as possible into it. For things which are strictly bookmarks, I’m not going to stop using Pinboard, but I’m giving it an earnest shot for text notes. The way I differentiate between things that go in Pinboard vs Evernote vs Instapaper is actually pretty simple. Pinboard is for something where I want to actually visit the site later (knowing it might change), I might make a web clip in Evernote of something if I want to capture it exactly how it is right now (like a recipe), and Instapaper is for things I want to read later.

    Because I’m putting as much as possible into it, I now have one place I can look on any device for almost anything via a text search. How cool.

    → 4:03 PM, Apr 20
  • QuickRadar

    Every iOS developer who’s ever complained to an Apple engineer or evangelist is familiar with hearing “file a Radar.” Unfortunately, Radar’s web interface is pretty clumsy. QuickRadar is a free menu bar app you can install that lets you easily file new bug reports to Apple via a global key command.

    → 7:30 PM, Apr 11
  • Stop Using Success/Failure Blocks

    I‘m not entirely sure where this first started, but a pattern that you seen a lot in third party Objective-C libraries is using separate success/failure blocks for callback on asynchronous API. It’s surprising that is has caught on for a couple of reasons. The first is that most good Objective-C developers seem to want to do things the “the Apple way,” and Apple doesn’t use this pattern anywhere. The other reason is that the problem with it isn’t an edge case, but something you’ll come up against whenever you use the pattern.

    As an example, here‘s a piece of code that uses separate success/failure blocks:

    [object doSomethingWithSuccess:^(NSData *data) {
        [self.activityIndicator stopAnimating];
        // Do something with the data
    } failure:^(NSError *error) {
        [self.activityIndicator stopAnimating];
        // Do something with the error
    }];
    

    And here’s how I’d write it:

    [object doSomethingWithCompletion:^(NSData *data, NSError *error) {
        [self.activityIndicator stopAnimating];
        if (data != nil) {
            // Do something with the data
        } else {
            // Do something with the error
        }
    }];
    

    If you go and look at any Apple API that uses a completion handler, you’ll see they follow the second pattern. Using separate success/failure blocks forces you to repeat code, because cleanup code is usually independent of success or failure. Don’t do that.

    [Update 4:28 PM: As Tim pointed out in the comments, the success flag I had on my callback block was superfluous, so I removed it from the example.]

    → 2:37 PM, Apr 7
  • NSHipster Discusses iCloud

    NSHipster talking about iCloud: > The Lisa. The Twentieth Anniversary Macintosh. The iPod Hi-Fi. The MacBook Wheel. > > Each of these products exemplifies Apple’s obsessive pursuit of quality as much as its unrivaled ability to anticipate the direction of things to come and execute flawlessly.

    It only keeps getting better from this point on.

    → 2:57 AM, Apr 1
  • My Friend, Logan

    Looking at Tumblr the other day I ran into this photo. It was tagged “Julian Koster,” and although I’m not familiar with Julian, I immediately recognized the showman behind him. He was the sidekick of someone I was lucky enough to briefly know named Logan Whitehurst in his band — Logan Whitehurst and the Jr. Science Club.

    I grew up in a town about forty-five minutes north of San Francisco in wine country called Petaluma. During the second half of highschool, my life primarily centered around a place called The Phoenix Theater: a former opera house turned movie theater, turned music venue that sits downtown. I was lucky enough to see lots of great bands, get to the know the manager Tom Gaffey, help work the soundboard once or twice, and perform there with my own band several times.

    One of the things that made The Phoenix awesome was that it was the right size (about 700 capacity) to have up and coming national acts perform. Of the groups I saw, the one I became most obsessed with and looked up to was The Velvet Teen (who are still together). At the time their lineup consisted of three folks: Judah, Josh, and Logan. For me at sixteen or seventeen, they seemed impossibly cool. For me at twenty-eight, they still seem like they were impossibly cool.

    I’d be surprised if my best friend/drummer Justin and I missed any shows that The Velvet Teen played at The Phoenix over the next two years.

    I can’t remember the exact circumstances that lead up to me talking with Logan, but I have a pretty good idea. If there was one part of being in a band I was good then, it was ingratiating myself to people I wanted to meet and (hopefully) open for. I think something about being a chubby, nerdy and excitable teenager probably helped with this a lot. Combined with the fact that Logan was — and I say this with no exagerration — one of the nicest people I’ve ever met, it’s easy for me to imagine how we ended up talking.

    I emailed him once or twice asking about recording, music, anything else. I remember that he always signed his emails “Your Friend, Logan.” I thought it was cool that I could tell people we were “friends.” Of course, it was probably his default signature. Eventually I asked him if he’d like to help us produce an album, and he said yes. Whenever Justin and I were together for the next few weeks, one of us would usually stop mid-sentence and “Dude. Logan from The Velvet Teen is going to produce our album.”

    Logan introduced us to his friend Dan — who was in the construction phase of building a recording space in Rohnert Park — and together they helped us put together a ten track CD over four long days that we called “QWERTY” (primarily funded by Justin’s highschool graduation money). Logan even drew some pretty awesome cover art for us.

    Justin and I continued to play music together for about another year and a half. We performed around Sonoma County, The Phoenix, the Bay Area and made a couple of trips out of state. A couple of times Logan and Vanilla joined us.

    After that summer I exchanged email or talked to Logan over I.M. a few times, but not much. Around this time — the end of 2003 — he’d gotten really sick, for reasons no one knew. I remember getting an email from him at the beginning of 2004 saying that he’d “just been sick for a really long time.” In May of 2004 Logan found out that he had brain cancer.

    Eventually my band broke up, and I moved to Sacramento to live with a girl that I’d been seeing. I can’t remember if it was just before, or just after I moved, but at some point I came back to play a show at The Phoenix by myself. Outside I ran into Logan on the street with his girlfriend. He was always extremely vibrant and gregarious — and he still was — but he was walking with a cane, and his hair was thin. It was weird to see him that way. He looked like someone who was recovering from cancer treatment. I forget what I was running around doing, maybe getting ready for or promoting my show, so I only stopped briefly when I saw him. As I walked away he said “I hope you find whatever you’re looking for,” probably because I was acting a bit spastic and in a rush. This was the last time I talked to Logan.

    In 2006, Logan’s cancer was in remission, and recorded and designed the artwork for another Jr. Science Club album. By now I was working at the Guitar Center in Sacramento, and focusing on new things in my life, so I didn’t talk to Logan at all for a while. I did find out that his cancer had come back though, and in December of 2006 he died.

    It’s weird that in the scope of people in my life, I didn’t really know Logan very well, but he had a permanent impact on me, and I think about him a lot. It’s funny how something like a picture of a plastic snowman can trigger it to all come back at once.

    → 4:20 PM, Mar 26
  • Switched to NewsBlur

    Last week when Google announced that it was shutting down Google Reader, it seemed as though the impetus had been created for developers to create a million new RSS aggregation/syncing services. My feeling is that it’s probably a bit harder than it looks to make something like this work well and scale, most of these projects will fail early, and a couple will gain a following.

    Fortunately we don’t have to wait to find out which of these makes it, because there’s already a great paid service out there called NewsBlur. I’ve been using it full time for a few days now, and I dig it. Its social features are actually cool (they work like a running comments list for sites without comments), it’s already got a serviceable iOS app, and everything works reliably.

    I’d like to see the service improve, and I think the best way to show support was to get a paid account for $24 a year. I recommend giving it a shot.

    → 7:27 PM, Mar 22
  • Comparing Bolt Bus and Amtrak

    As I write this I’m currently aboard a bus headed from Portland Oregon to Seattle Washington. In the past I’ve always taken Amtrak for this trip, and have been generally pleased, but on a recommendation from a couple of different people have decided to try out Bolt Bus as an alternative. And so here I am.

    There were a few advantages I was told Bolt Bus had over Amtrak. Some of them are holding up, and some not so much.

    Price

    The first one is price, and and it holds up immediately. The same trip from Portland to Seattle on Amtrak would cost me $50 (add $18 for business class), and Bolt Bus was $20. They’re pricing scheme works something along the lines of it being cheaper when the bus is less full, so it could be a bit less or a bit more than what I paid, depending on when you book your trip.

    Wi-Fi & Power

    One thing Wi-Fi was more reliable than on Amtrak. This probably has to do with there being more cell towers closer to the freeway, but it doesn’t matter because Wi-Fi was out on this bus today. I don’t know how common this is, since I’ve only ridden once before. Since I have a tethering data plan on my iPhone I wasn’t too disappointed.

    If you want to use technology, they do at least have enough plugs for everyone — one per seat — which Amtrak does not always have. Getting off fully charged removes just a little bit of the stress of going to a city I don’t live in. I do think if you upgrade to business on Amtrak a plug is guaranteed, but at more than 3x the cost of Bolt Bus.

    Comfort

    The seats are a bit smaller — I’d describe them as marginally larger than an economy seat on an airplane. It’s okay, but not great. Speaking of leg room, not being able to walk around kind of sucks. I’m fidgety though, so maybe that wouldn’t bother someone else as much.

    No-matter what time I book these trips for, I always seem to be in a rush to get out the door and forget to eat or make coffee. Needless to say, when my blood sugar tanks and I contract a wicked caffeine headache halfway on this trip, I’m going to miss the dining car (even if the coffee is the worst I’ve ever had anywhere).

    Other Differences

    • The Amtrak gets in when it says it will, this is more approximate. The website said arrive at 5:30, the driver said 5:30-6:00.
    • The travel time is about the same for this trip.

    Conclusion

    If you have either available, Bolt Bus is a decent alternative when cost is a concern and you can remember to eat beforehand. If the $40 doesn’t matter to, I’d take Amtrak and pay for business seating.

    → 3:06 PM, Mar 14
  • My New iMac

    Since February 2010, I was waiting for Apple to release an update to the iMac, and on January 31 of this year my brand new 27” iMac arrived — with a broken screen. Thankfully AppleCare got me squared away within a day or so, sent me a free USB SuperDrive for my trouble, and I was in possession of a working one within a few days.

    On Hold

    While I was on the phone with AppleCare trying to get everything worked out, I had a few thoughts. First was that even the best phone support kind of sucks. It took more than a couple of hours on the phone and a couple of callbacks to get a DOA machine replaced, a lot of it on hold. To their credit, everyone there was genuinely helpful and understanding of my situation.

    The other thought was that there was no reason to be upset about anything since it wouldn’t make it go any faster, and really I had no choice. If they sent me five machines, each more defective than the last, I really have no vector of recourse beyond being a jerk to a customer service representative. I mean, realistically, what am I going to do, start learning C# and order a HP?

    These are the sort of thoughts listening to hold music while staring at a broken iMac can apparently spur in me.

    The Working Machine

    It’s wonderful. I upgraded to a 3.4GHz quad-core i7, 16GB of ram, and a 3TB Fusion Drive. It’s really, really, fast. The last non-portable computer I owned was a dual 1.6 Power Mac G5 I bought used that I’m pretty sure had faulty ram. Since then I’ve owned a white plastic MacBook, the first unibody MacBook Pro, and a 2011 MacBook Air.

    I’m excited to have a machine that can run Aperture respectably, and also has a drive large enough to keep my library on. Dropbox and iCloud make keeping everything else in sync easy (mostly Dropbox).

    The Two Best Things

    Fusion Drive has been completely invisible to me, and since nothing has been slower than on my Air with the SSD, I figure it’s doing what it’s supposed to. I don’t know when we’ll eventually have large, cheap SSD’s, but this feels like a great solution so far. Also, the kind of solution only Apple could easily provide, with their integrated hardware and software.

    The screen is noticeably nicer to look at than the 27” LCD Cinema Display I’d been using. Laminating the glass to the LCD improves it just as much as it did with the iPhone. I can’t even remember what I was giving up by them doing this, only that it sounded stupid when I heard it, and that this screen looks awesome.

    Thin

    Something that I think is cool, but that doesn’t really affect me that much is the thinness. When I mentioned ordering it, a couple of non-Mac using people I know had said they it was silly that Apple would bother with making a desktop machine thin (remind me to try and take a dump all over the next thing you drop thousands of dollars on and are excited about).

    My response is that they didn’t make the machine crappier in other ways that I can tell, I don’t seem to be paying more for it being thin, and it looks cool when you catch it from the side. Technology surrounds me everyday, and I see no reason why it should be any less designed or beautiful than the chair I sit in, the guitar I strum or the coffee maker on my counter.

    → 6:50 PM, Mar 8
  • Hiding Ads From Previously Paid Users in Closeby

    Although as a paid app Closeby didn’t have a ton of users, I wanted to do my best when taking it free with iAds to not show the ads to those to people who had paid for it. Luckily, I have a file I that I write out, so I can detect if the app has been run on the current device by checking if that file exists or not and saving something in NSUserDefaults. The problem is that if the user bought a new device, or is installing it on a second device that hadn’t run the app before, they’d be out of luck.

    What I wanted was a way to not show ads if the user had ever run the app on any of their devices, and to never show them ads later if they bought a new device. I think the solution I came up with is pretty clever, really easy, and solves the problem the way I wanted to. What I do is when I check if that file exists, I don’t just note it in user defaults, I save it using the iCloud key/value store. I can then check that whenever the app launches.

    As long as the user has run the previous version of the app, upgraded, and ran the Closeby again on any of their devices, ads will be hidden on all of their devices forever.

    → 5:48 PM, Feb 18
  • Taking Closeby Free

    A little less than a year ago, I put out a small app called “Closeby” for $2.99. What it does is really simple: it goes through everyone in your address book, geocodes their addresses and tells you how far away they are from your current location. The people I’ve talked to who bought it liked it, but the most common response I get is something like “That’s a cool idea. I have no idea why I’d want that, but it’s a cool idea.” And so it hasn’t sold very well. In the entire amount of time it’s been out, it’s sold about 170 copies, and lowering the price to 99¢ last summer sometime didn’t make much of a difference.

    I hated seeing something I worked on languish, so I decided to take the app free and include iAds. My realization recently was that Closeby is probably a better free than paid app, and if someone really likes it, I’ve included a 99¢ in app purchase. I also took extra special care to make sure that I avoid showing ads to people who previously purchased the app, and included a workaround incase it doesn’t work every time. The reason I say it’s probably a better free app is that, I think people will download a free app just because it sounds kind of cool, but won’t pay money for something they’re not sure they’ll ever use. I’m interested to see if I’m right about any of that.

    The new version of Closeby is available now for free on The App Store.

    → 6:20 PM, Feb 17
  • Mac App Store Review Time Down

    According to Shiny Developments “Average App Store Review Times” page, average review time for Mac apps is down to under eight days, and is still doing down. It peaked at twenty-seven days in October — which was completely unacceptable — and has gone down really quickly ever since. Good job Apple for fixing the problem.

    → 6:45 PM, Feb 1
  • Comparing Dancing Couriers

    The Candler Blog has a good post comparing different variations of Courier (and also Pitch), with an illustrative animated GIF included. I’d probably use Pitch pitch if I could justify the cost — since I like things that have some whimsy — and Courier Prime is the second best of the bunch.

    → 6:25 PM, Jan 29
  • Courier Prime

    I’m giving Courier Prime a shot as my new font for non-programming writing, replacing Anonymous Pro. My favorite feature is that — at least on my MacBook — it’s extremely not-fuzzy. Most monospaced fonts usually get disqualified when one or more critical characters get anti-aliased in an unfortunate way. Courier Prime seems really good in that way, and I’m loving it.

    → 2:36 AM, Jan 29
  • Pinboard Search Template for LaunchBar

    I don’t know why I never thought of this before today, but it’s really easy to set up a search template in LaunchBar (or Alfred) to search your own Pinboard bookmarks. If you’re using LaunchBar, just go to show index, go to the search templates item at the bottom of the window and add this for full text search:

    http://pinboard.in/search/?query=*&mine=Search+Mine&fulltext=on

    Or, if you don’t pay the $25/year for an upgraded account:

    http://pinboard.in/search/?query=*&mine=Search+Mine

    → 6:33 PM, Jan 22
  • The absolute bare minimum every programmer should know about regular expressions

    “The absolute bare minimum every programmer should know about regular expressions” is an older article there’s a good chance you’ve seen before, but if you haven’t, should read.

    → 7:29 PM, Jan 18
  • Mr. Reader And The Services Menu for iOS

    Federico Vittici at MacStories has an article up about a new feature of Mr. Reader (RSS reader for iPad) that lets users add custom sharing services. One of the examples he created is a sharing service that sends a bookmark and description from Mr. Reader to Pinbook.

    → 8:30 PM, Jan 17
  • Browser Bookmarklet For Pinbook

    Justin Clark has made a bookmarklet for Pinbook that takes the URL and title of a page and sends them to directly Pinbook for easy adding.

    If you’re on a Mac, you can drag the below link to your bookmarks bar and let it sync over iCloud to iOS:

    Send to Pinbook

    If you’re using Safari on iOS, add the bookmarklet by following these steps and using the code below.

    • Create a bookmark for any page (this one, for example).
    • Select and copy the code below.
    • Go to your bookmarks, tap edit, and then the bookmark you just added.
    • Replace the title with anything you like, and the URL with and the code you just copied.

    javascript:(function()%20%7Bwindow.location=‘pinbook:///add?url=‘+encodeURIComponent(location.href)+’&title=‘+encodeURIComponent(document.title)%7D)%20();

    → 4:30 PM, Jan 14
  • History of the Fisher Space Pen

    I keep my Fisher Space Pen in my pocket everywhere I go, and use it all the time for taking notes. The Smithsonian’s Design Decoded blog has an article that talks about the genesis of the pen, its creator, and dispels a couple of myths about it.

    (Via Put This On.)

    → 10:34 AM, Jan 14
  • The Unreasonable Effectiveness of C

    Damien Katz:

    That we have a hard time thinking of lower level languages we'd use instead of C isn't because C is low level. It's because C is so damn successful as an abstraction over the underlying machine and making that high level, it's made most low level languages irrelevant. C is that good at what it does.

    It seems obvious once I read it, but the point that gets made very well in this article is that C isn’t really a low level language. It’s just that C is so effective at what it does that there isn’t much reason to think of using a lower level language anymore, and so our perception of what a low level language is has changed.

    → 8:39 PM, Jan 11
  • How I Format Code

    Brent Simmons responded on his blog today to something said on the Debug podcast (recommended) about his coding style being crazy. I wondered if I’d missed something when I heard it, since I’ve seen Brent’s code in examples, and thought it was pretty normal looking at the time.

    The example he gave was of creating a new view controller:

    - (id)initWithAccount:(GBAccount *)account {
    
    <pre><code>self = [self initWithNibName:@"Settings_iPhone" bundle:nil];
    if (self == nil)
        return nil;
    
    _account = account;
    return self;
    </code></pre>
    
    }
    

    And noted:

    My formatting style is pretty much K&R style, plucked straight from the C Programming Book — with one modification: opening braces for methods and functions appear at the end of the line rather than on the next line.

    My style is similar to Brent’s, but with a couple of differences. I put the braces for methods and functions on the next line, I always using braces for loops and conditionals, and I only ever have one return. My version of the same method would look like this:

    - (id)initWithAccount:(GBAccount *)account { self = [self initWithNibName:@“Settings_iPhone” bundle:nil]; if (self != nil) { _account = account; } return self; }

    The biggest reason I chose this style is that it requires the least reformatting of Xcode’s template code. Where I used to work we used a very specific and very non-standard way of formatting, and after a while I got really tired of always having to reformat every piece of template or autocomplete code before I could actually do anything, so I tried to pick the style that would eliminate that as much as possible.

    → 4:40 PM, Jan 11
  • Essential Tools 2012

    Last January I wrote a post about what tools I thought were “essential” in 2011. A lot of my favorite tools from last year I still use all the time, a few have fallen away, and I’ve added a few that either didn’t exist or I didn’t know about a year ago. In the interest of keeping the list shorter I’ve also left off some things that would be repeats from last year if I didn’t have anything new to say about it.

    Hardware

    13” Macbook Air
    It’s the same one from 2011 that I was using last year. I’ve just ordered a thin new 27” iMac, so I’m considering moving to an 11” Air once the next time they’re updated. The 13” is a great size, but if I have a fast desktop to use when I’m at home, I’d like to be even more mobile when I’m not.

    iPad mini
    I still have my third generation iPad — and use it sometimes when it’s more nearby — but I’d estimate that I’m using the mini 90% of the time.

    Non-Tech

    Coffee Setup
    My primary coffee maker is still the Chemex, but this year I’ve also added an Aeropress that I sometimes when I’m just making coffee for myself. I upgraded how I heat my water this year with a Bonavita electric hot water kettle that lets me set a specific temperature. Something that hasn’t changed from last year is that I use a Baratza Virtuoso burr grinder.

    Public D8 Bicycle
    I bought a new bicycle last March and have ridden it everywhere. Portland is pretty great for getting around by bike, and I routinely go weeks or more without driving.

    Mac Apps

    Xcode
    It seems to be more stable now than it was a year ago.

    OmniFocus for Mac
    Still the best way to keep track of everything in my life and do GTD on a Mac or iOS. I’m extremely excited to see what’s changed in 2.0 this year.

    LaunchBar
    A year ago, I was going back and forth between using Alfred and LaunchBar for an app/script launcher, but I’ve since solidified on LaunchBar. Alfred is a really great app, but I finally got my head around using instant send in LaunchBar and that’s made it stick.

    NetNewsWire
    I can’t wait to see what this app eventually becomes, but it’s still as great as ever. I’ve been using various versions of NetNewsWire for 5 years now, and it’s still my favorite way to read news.

    Fluid
    I’ve been aware of Fluid for a long time, but never really got into it. Recently I paid the $5 upgrade price from the free version, find it the best way to deal with using Gmail on a Mac.

    Kaleidoscope
    Last year my only wish for Kaleidoscope (I wouldn’t call it a complaint) was that it would support merging as well as comparison. It now does and it’s awesome. Besides that one thing, Black Pixel has done a great job making every part of the app better and I use it more than ever now.

    Tower
    I don’t always use a client for Git, but when I do I use Tower. It’s a bit overwhelming in that it does so much, but so is Git, and it’s the only app that doesn’t require me jumping to the command line to perform basic tasks.

    MindNode Pro
    I use this app for mind mapping all sorts of things, development related and otherwise. One of my favorite uses this year was when I needed to diagram a complex data model for a web service I was working with.

    Slicy
    If you work in Photoshop ever and need to export images, you need Slicy. It makes it really easy to get export both 1x and 2x versions of app graphics without pulling your hair out.

    Tweetbot
    Much like the iOS version, I like it because it just works so great. An excellent way to use Twitter on a Mac.

    Moom
    A window management utility that makes it easy for me to put each thing in it’s own special place like a crazy person.

    Byword & Marked
    Still my two favorite apps for writing blog posts. Byword for the writing, and Marked for Markdown preview. I use Moom to put them side by side on my MacBook Air.

    Terminal.app
    The one app I use the most everyday.

    iOS Apps

    Pinbook for Pinboard
    I’m not mentioning it to pimp my own app, but because I really like my own app. I use it constantly.

    Reeder
    What I use to read RSS on my iPhone and iPad. I resent that’s it’s both not universal, and that the iPad app has been left to languish for so long, but it’s still the best I’ve found so far.

    Flickr
    They recently updated their iOS app and I’ve been using a lot since then. I hope to see the iOS and web site both continue to improve this year. It feels like the things I put here are a lot more permanent than with something like Instagram, and I like that.

    Instapaper
    An outstanding app and service, Instapaper is an app I use for saving longer articles I’d like to read later.

    Cleartune
    A good guitar tuner for iOS (universal) that is both updated for retina and taller iPhone screens.

    Fantastical
    A nicer way to add calendar items and view what’s coming up this week on your iPhone.

    Elements
    Still the only text editor on iOS I can stand using for an extended period of time.

    Online Services

    Pinboard
    I use it to save all kinds of links, and pay for the $10 a year archiving service. I like it so much I wrote an app for it.

    AppFigures
    Every night they download my sales reports from iTunes and send me an e-mail to let me know how things went. They also track where my apps have been featured and how they’re ranking in the store. I’ve never had any problems and think can’t imagine not using it.

    Tender
    A web app for dealing with customer support. At some point Tender started offering a $9/month plan that is perfect for a one man shop such as myself. It lets users communicate through e-mail, helps me manage a queue of support requests, and integrates with both GitHub Issues and Lighthouse.

    HockeyApp
    Last year I was using TestFlight for managing beta builds, and have since moved to using Hockey. They recently had a big update that improved the entire experience. I’ve done pretty well with not shipping any huge show stopping bugs in Pinbook, and most of that credit is due to thoroughly beta testing the app (as well as having great testers).

    Google Apps for Business
    Besides that Gmail and Mail.app don’t like each-other, this is the best, easiest to set up and most flexible way I’ve found to manage e-mail and calendars for my business.

    → 4:40 PM, Jan 10
  • Co-author of platinum coin law weighs in on trillion dollar coin

    There’s a very informative article on Daily Kos where the co-author of the law that makes it possible to mint a trillion dollar platinum coin explains what that actually means and what the results would be.

    → 6:23 PM, Jan 8
  • Pinbook 1.2.1 Development Notes

    Pinbook 1.2.1 is out now on the App Store, adds support for sending to Readability (if Readability’s app is installed), and fixes these issues:

    • Delete not working properly when searching.
    • Tags and date overlapping in bookmark rows.
    • The description screen appearing blank when editing or creating bookmarks.
    • A crash that could occur when editing certain bookmarks.
    • Media auto-playing when viewing a bookmark (like if you saved a link to a video).

    I also learned a couple of development related things during this update that I think are worth mentioning.

    Using URL Schemes for UIActivity Subclasses

    The one new feature I’ve added is sharing to Readability for people who have their app installed. Instead of trying to implement something using Readability’s API, I just wrote my UIActivity subclass to use their apps URL scheme to send whatever URL.

    I think it’s a pretty fair assumption that if someone really wants to send a URL to a service like this, they probably have the app installed. It also means that Readability users don’t need to go through the hassle of typing in a username and password for pretty much no benefit. The other advantage of doing things this way is that if in my UIActivity subclass I return NO from -[UIActivity prepareWithActivityItems], UIActivityViewController will automatically hide that option without me having to do anything different my view controller. This means that I can check -[UIApplication canOpenURL], and the option won’t show up for users without Readability installed. The code might look something like this:

    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
    NSURL *readabilityScheme = [NSURL URLWithString:@“readability://“]; return [[UIApplication sharedApplication] canOpenURL:readabilityScheme]; }

    Code Cleanup and Maintenance

    I did a lot of code cleanup during this release: trying to refactor things to be more orthogonal1, and remove code that wasn’t serving a purpose anymore. I’d classify the code in Pinbook as very clean, but I also know that it will only stay that way if I keep on top of it. It’s the kind of work the user doesn’t see, but if it let’s me continue to put out updates quickly and keep them bug free, they’ll benefit from it.

    One example is that I improved the way that Pinbook checks if it needs to update. The way that Pinbook knows that it needs to update is it asks Pinboard for the last modification date, and gets back some XML that looks like this:

    <?xml version=“1.0” encoding=“UTF-8” ?> <update time=“2011-03-24T19:02:07Z” />

    Instead of actually parsing the date out of this, what the app was doing was just checking if the entire thing had changed and comparing it to whatever we got back the last time. In the new version I’m pulling out the date and using actual date comparison methods to check it against the last seen update time. It’s a part of the app that I don’t know of causing any issues, but it made me uncomfortable because the approach was lazy, and I was afraid it might have caused an issue for someone I didn’t know about.

    I think the reason this didn’t get fixed earlier was that I probably wrote it quickly during development just to get something working, intended to clean it up later, and never did. It’s a lesson for me that if I know how something should be done, I should do it that way upfront instead of saying that I’ll clean it up later, and possibly get side tracked.


    1. Yes, I’m reading “The Pragmatic Programmer” right now. ↩
    → 5:40 PM, Jan 8
  • Send Safari Links to Pinboard From LaunchBar

    As someone who writes a client for Pinboard, it’s probably not surprising that I use it a lot. The most important aspect to keeping myself adding links to and using Pinboard has been lowering the friction for getting things into and out of it. On iOS, Pinbook has made both of these a lot easier, but on the Mac I still find the process of hitting ⌘+2 in Safari (to activate Pinboard’s bookmarklet) and then typing in the details of the link I want to save a bit cumbersome. And, once again, I’ve written an AppleScript to solve this problem for me.

    The script is based on this one by Tim Bueno for sending links from Chrome to Pinboard using Alfred. The code itself has changed from Tim’s script quite a bit, but the way they work is nearly identical:

    1. Bring the script up in LaunchBar (I type “STP”)
    2. Type out a list of tags separated by spaces
    3. Press Option+Return
    4. Get notified in Notification Center when it's finished

    The script itself looks like this:

    {% gist 4472918 %}

    One of the things that’s different in my script is that instead of keeping your password directly in the script, it uses your Pinboard API token. Your token can be gotten by going to Pinboard’s password settings page.

    → 10:51 PM, Jan 6
  • Create Octopress Posts From LaunchBar

    One of the things that’s a big kludgy when using a system like Octopress is the manner in which you create a new post and get it loaded into your favorite text editor. It sort of goes like this:

    1. Go to blog folder in Terminal
    2. Enter a command like rake new_post["post title"]
    3. Copy new path from pasteboard
    4. Type open and paste the path Octopress just gave you

    One way to deal with this (in Octopress, specifically) would be to edit your “Rakefile” and change the new_post command to open the file that was just created. But since I’m on a Mac and use LaunchBar already, a more appealing option was to create an AppleScript.

    {% gist 4472948 %}

    What the script does is ask for the post title you’d like to use, tell Terminal to run all of the right commands to create the post and then open the most recently added document from the posts folder in your default editor. So now the steps to create a new post and start editing it are:

    1. Run the script from LaunchBar
    2. Type the post title you'd like to use

    AppleScript itself is so weird and kind of crappy as a language, but I’m really glad to have it for what it can do when I want to scratch a small itch like this.

    → 7:12 PM, Jan 6
  • Obligatory Blog Post About Blogging

    I’m pretty sure there’s a rule against switching to a static blogging system without writing at least one blog post about it. I’ve been considering switching to a static system for a little while, and for all of the normal reasons: faster loading time, the feeling that Wordpress was just a bit more than I needed, having all of my posts stored automatically as plain text files and liking to try with new things. Looking at the available choices, it came down to three options for what I might switch to:

    • My own thing
    • Pelican
    • Octopress

    My Own Thing

    As someone who writes software, this option really appealed to me. If I wrote my own system it wouldn’t need to be as complicated as any others, because it wouldn’t have to be useable by anyone else. I could write it as a Mac app, and any issues I had I could just fix because I would understand every line of code. Carter Allen actually did exactly what I’m talking about, and the results look really good.

    The reasons I didn’t do this is the time it would take to do it, and that I’d be solving a problem that’s already been solved. There’s a pretty good chance I’ll come back to this option at some point.

    Pelican

    Pelican is written in Python, and was almost what I went with. In some ways it seems a bit simpler than Octopress, and Gabe wrote a great post about migrating to Pelican on MacDrifter that made it not seem too terrifying.

    The reasons I didn’t go with Pelican are because it was a bit more difficult to get set up the way I needed it, and I didn’t feel as comfortable with the tools I was using. I probably could have gone with this and been equally happy.

    Octopress

    The biggest reasons I ultimately went with Octopress over Pelican are that it was easy to set up and that once I made it through the initial setup, and that using it felt the most like using the tools I already know. Besides the commands which are specific to Octopress (create a new post, publish the site), the primary tool that I use to work with it is Git. Your sites folder is a Git repo, New themes are usually installed as submodules and upgrading it means pulling down the latest source from GitHub.

    Both pre-made static blog systems seem like they can produce pretty much the same results, and either I think either is a good choice. The biggest question — I think — that determines if someone will like Octopress or Pelican more is they’re more comfortable with using Python specific tools or Git.

    → 11:21 PM, Jan 5
  • Coalescing

    I found this this post by Doug Russell on coalescing messages (turning multiple message sends into one) using performSelector:withObject:afterDelay: to be a really simple and useful technique.

    (via Brent Simmons)

    → 9:57 AM, Jan 4
  • TextExpander NSLocalizedString Snippet

    TextExpander is one of those apps I use so much on my Mac that I only notice when it’s not there. One thing I’ve been using it for a lot the last few days is fixing places in my code where I forgot to use NSLocalizedString and should have. If you’re not familiar, NSLocalizedString is a macro that Cocoa developers use for making strings localizable, which means the ability to display in the correct language for the user in cases where the app has the text for that translation.

    So, if I see something like this in my code: self.title = @"Edit Bookmark", and I want to change it to this: self.title = NSLocalizedString(@"Edit Bookmark", @"Edit bookmark view title"), I cut the entire string and type ;lcl to trigger the snippet (you can make that whatever you want), which automatically pastes the corrected text back into the same location.

    The snippet itself looks like this: NSLocalizedString(%clipboard, @"%|"). What it does is paste the contents of the clipboard (my string) into the first parameter, and puts the cursor into between the quotes of the second parameter so I can type out my comment.

    → 9:32 PM, Jan 3
  • Left Questioning Myself

    I can’t think of anyone besides Brent Simmons who can publish two blog posts in a day that send me going through my code reexamining everything to I’ve committed no deadly sins. Thankfully it’s not too bad since most of what Brent mentions is now stored in the parts of memory which keep me breathing and walking upright. If you write any Objective-C code at all you should read both of these, and also the posts which they link to.

    • Coders in the Hands of an Angry God
    • UITableViewCell Is Not a Controller
    → 10:11 PM, Jan 1
  • The End of Netbooks

    The Guardian

    Sayonara, netbooks. The end of 2012 marks the end of the manufacture of the diddy machines that were - for a time - the Great White Hope of the PC market.

    What does this mean for Google’s Chrome OS? Wasn’t it being made explicitly for netbooks?

    (Via Daring Fireball)

    → 11:58 PM, Dec 31
  • Omni's Plans for 2013

    The Omni Group:

    With "iPad or Bust!" out of the way, we've been able to move some of our projects off the back burner and here are some highlights of what's coming: OmniFocus 2. OmniOutliner 4. Automatic document syncing. Sandboxing. Accessibility. Visio and Microsoft Project compatibility in our iPad apps. Upgrade pricing from Mac App Store apps.

    Holy cow that’s a lot.

    → 1:32 AM, Dec 24
  • Holiday Expense Tracking With Numbers

    This year as I buy presents for the people closest to me, I’ve decided that I need to keep track of what I’m buying, how much I’ve spent and for who. There’s a couple of tools I could have used for this, OmniOutliner is a great fit for this kind of thing, and even plain text files could have worked OK, but ultimately a Numbers spreadsheet is the perfect place for keeping track of this information.

    The columns I’m using to keep track of my purchases are: Purchased Date, Item, From, For, Confirmation #, Delivered and Price. One of the features I like best about Numbers is being able to right click any of the columns and select “Categorize by This Column”, which breaks the table up based on by any category I like such as who I’ve bought what for, or where I’ve purchased what from.

    I find myself gravitating towards using the iWork apps whenever I can due to iCloud working so well with them. It’s like entering an alternate dimension where everything we were promised with iCloud has mostly come true.

    → 1:36 AM, Dec 22
  • Dropping iOS 5

    One of the changes that I made in Pinbook 1.2 was to supporting iOS 5. I started working on Pinbook before iOS 6 was released, so I decided to try and support both. For example: on top of using UIActivityViewController for sharing, or UIRefreshControl for pull to refresh, I also implemented UI that people on iOS 5 would see. It seemed like a good idea at the time, but as I went forward I started to realize how much of my code was just there to support the older OS.

    I wanted to take it out support for three reasons. First, I knew I was going to be adding iPad support and that the first generation iPad could not run iOS 6. Anyone else running Pinbook on iOS 5 would be able to upgrade, but if I started supporting these other users and then dropped support in a future version there were going to be some people who got left out and couldn’t do anything about it. The second reason is that since I don’t run iOS 5 on any of my primary devices and I’m a one man shop, that version of the app was never going to be as well tested. Lastly, it was adding more code to the app than needed to be there and I didn’t like that.

    The potential negatives of dropping support were that I’d have a vocal group of pissed off iOS 5 users, or that sales would go down. Thankfully, neither of these happened. I’ve received no complaints, and sales have been better for this version. Dropping iOS 5 also let me lower the total amount of code in the app by about 8 percent.

    → 10:55 PM, Dec 19
  • The New Instagram

    If — like the rest of the web — you were shocked and appalled by the changes to Instagram’s terms of service yesterday, I’d like to point out that Flickr has recently released a pretty good new version of their iPhone app, and that if the push notifications to my phone any indication, a lot of people are trying it out right now. As a bonus they’ll even let you pay them — which is great if you’re sick of companies who ask for nothing and then take everything.

    Personally I wasn’t so worried by Instagram’s changes, but already wanted to try Flickr as a replacement when I saw their new app, so the timing just kind of works out.

    → 7:35 AM, Dec 18
  • Rate iTunes Tracks With Keyboard Maestro

    Gabe shows us how to rate iTunes tracks using Keyboard Maestro. I really need to check out Keyboard Maestro now.

    → 9:57 PM, Dec 16
  • The Pinboard Co-Prosperity Cloud

    Maciej Cegłowski is starting an incubator:

    How is this different from other incubators? Participants receive almost no money, and are expected to do everything themselves, making them vastly better prepared to succeed in business.

    → 8:46 PM, Dec 16
  • Great New OmniFocus Perspective Icons

    An awesome new set of OmniFocus perspective icons by Icons and Coffee that you can purchase for only $4.99. I’ve already bought a copy and will now spend the rest of the day avoiding actual work playing with these.

    → 1:29 PM, Dec 13
  • A Couple of Songs From Last Night

    Spencer and I recorded two songs last night, and I thought I'd share them. They were both recorded live using an Apogee Mic, so any difference in levels is just how far away we were each standing from the microphone. The first song is called When I Go by a band called Slow Club, and the other is titled When U Love Somebody and is by a band called Fruit Bats. I hope you like them.

    → 2:39 PM, Dec 5
  • Fantastical for iPhone

    I’ve just moved “Calendar” off of my home screen and replaced it with Fantastical for iPhone. It’s great. You can get it in the App Store for $2.

    → 2:32 PM, Nov 29
  • Realmac On Designing For Retina

    I found this post on Realmac Software's blog about designing graphics for retina extremely useful.

    → 6:59 PM, Nov 24
  • The Statement You Make Matters

    Jesse Thorn on why the clothing you wear matters:

    Clothing is a way we represent ourselves to others. This self-representation couldn't be more significant. When you dress, you are making a statement; not a fashion statement, but a statement of identity. If you put on a jacket and tie, for example, you are signifying to others that you take the occasion seriously, whatever that occasion may be. If someone looks at you and interprets how you dress, they are not being superficial. They are reading the message that you wrote. If that message says, "I am to be respected," then they will respect you. The language of clothing is as complex as the spoken word, but ignorance of it is no excuse. Can one earn respect in other ways? Certainly, and one should. But that's no reason to open a conversation with someone by saying, without words, "this is not important to me."

    Taking pride in how you present yourself and doing so appropriately for the situation you're in isn't silly or vain, it's a declaration to others of the respect you have for yourself and the occasion. That doesn't mean overdressing - that can be just as silly as underdressing - it means there's value in having a sense for what's appropriate and cultivating personal style.

    → 2:24 PM, Nov 23
  • Tokens for Mac

    Tokens is a new Mac app that makes it easy to generate, share and track tokens for your App Store apps. Looks awesome, I'll definitely be using this.

    → 2:28 PM, Nov 21
  • Black Pixel on The Next Web

    Daniel Pasco and Michael Jurewitz Interviewed on The Next Web:

    When it came to Kaleidoscope, the company has a long list of features that they’d love to see in the app eventually. But, Jurewitz says, at some point you just have to get something out in front of the world so that you can discover how they’re using it. “So that you can make sure that you’re actually building something for your users,” he adds.

    I couldn't agree more.

    Everyone at Black Pixel has done such an incredible job getting Kaleidoscope to this point, as well as launching a stellar new site for their company.

    → 2:24 AM, Nov 21
  • All You Need to Know to Get the Best Shave

    The Wirecutter on Shaving:

    To make my picks, I spoke with experts who have been through every razor fad and tried every setup, including beard-trimmers. I then personally tested widely available non-disposable razors on the market.

    I’ve been shaving with a double edge safety razor for the past two years, and would recommend it to anyone. For a small amount of initial effort, you get to save a ton of money of blades, and get a better shave.

    My recommendations for a good setup are:

    • A Merkur safety razor.
    • A pack of Derby razor blades.
    • Proraso shaving cream.
    • A good shaving brush (there's a large price range for these).

    If you’re looking for a good introduction to how to actually shave using a setup like this, check out episode 4 of Put This On, which is all about grooming.

    → 8:45 PM, Nov 18
  • Elements 2.6

    Second Gear have released version 2.6 of the best text editor for iOS: Elements. The new file browser interface is great and the reliability of Dropbox syncing seems to have improved considerably as well. I can't imagine why anyone wouldn't already have this app, but if you don't I emphatically recommend going to The App Store and buying a copy right now.

    → 4:59 PM, Nov 13
  • Poster - A Wordpress Blog Editor

    I saw Poster on The App Store a couple of days ago, but just bought it once I saw it linked to on The Loop, and it's excellent. The styling I great, it has Markdown support, and my favorite feature is that it allows you to grab a post you've been working on in a different editor from Dropbox. This is exactly the app that I've been looking for.

    → 2:57 PM, Nov 12
  • The Generational Podcast

    I'm proud to be sponsoring this weeks episode of Generational with Gabe Weatherhead, which is all about research and materials.

    Generational is a great podcast, and Gabe's blog is also one of my favorites. I would subscribe to both if you haven't already.

    → 3:46 PM, Nov 10
  • There Is No Secret

    Jim Dalrymple:

    Over the past few years I have been asked by many new and established bloggers what the secret is to blogging successfully. In fact, I’ve been asked so many times that I started thinking about it quite a bit and I’ve come up with the answer.

    → 2:41 AM, Nov 9
  • Pinbook 1.1: Polish and Speed

    Pinbook 1.1 is out on the App Store now, so I thought I’d take a moment and go over a couple of the things that have changed in the new version.

    Enhancements

    This release is more about polish and getting things working even better, but I also managed to add some new features I think you’ll really like. There’s also preferences for disabling the automatic refresh and having new bookmarks be private by default.

    Faster Sync

    One of the things people really liked about 1.0 is that it could handle large accounts pretty quickly. I’m really excited to say that 1.1 is several times faster for both initial loading and subsequent syncing. My 20,000 bookmark test account does its initial load in about 40 seconds or so, and subsequent syncing (picking up changes from the website) takes just a few seconds. It’s hard to even notice it happening on my personal account.

    Improvements When Adding

    I made a couple of improvements to the adding interface that I really like. The first one is tag autocompletion when adding, and the other is a URL scheme bar that lets you switch between available options when adding a new bookmark.

    Tag Autocomplete Bar

    I really like this feature. One of the things that made Pinbook 1.0 a little hard for me to use was that when adding new bookmarks, I had to guess what I had called my tags (was it, “election2012, or election-2012”). Now when you type in the tags field, a bar will appear above the keyboard and suggest tags you’ve already used. Just tap one and it will get added. If you want to add a new tag, just type in. You can even go back and edit previous words in the field and Pinbook will do the right thing.

    Tag autocomplete bar

    URL Scheme Bar

    When you add a URL to Pinboard, you need to give it a URL scheme (http://, ftp://, etc). When typing in the URL field you’ll get a list with all of the options Pinboard supports and you can switch between them. If you also just paste or type in a complete URL with the scheme, Pinboard will figure that out and show the right one as being selected.

    URL scheme bar

    Polish

    In Pinbook 1.1 I’ve switched to using custom navigation/toolbar button images. One of the major inspirations for the overall aesthetic and design of Pinbook is the font Futura, and the slightly less than standard corner radius of the new bar buttons is meant to help evoke some of the same feeling. It’s really interesting to me how subtle changes like this can really affect the feel of something without drawing too much attention to the change itself.

    Bar Button Background

    Bug Fixes

    If you submitted a bug report for Pinbook 1.0, it should be fixed now. The two biggest ones I took care of are:

    • Some people’s passwords were not working when logging in. I emailed with the developer of Pinboard, and it turns out to be an API bug. As a workround, I give you an option to enter in your Pinboard authentication token directly, which can be gotten from your Pinboard settings page. It’s pretty easy, and there’s a post about it on the Pinboard blog.
    • The save button would sometimes not become enabled when adding a bookmark from the clipboard or through Pinbook's URL scheme.

    The Future

    I’m really happy with how this release came out, and really proud of what I was able to get into this release. I feel like I’ve got a great foundation, and I’m really excited about 1.2.

    → 8:55 PM, Nov 7
  • Archival Clothing Marled Knit Caps

    Archival Clothing Release — Marled Knit Caps:

    For the Fall, we're releasing our knit caps in soft, itchless, 100% marled cotton. These cozy hats are made on a 1920s-era circular knitting machine.

    Besides looking really cool, the best part is that they’re only $18. If you need to keep your head warm this winter, these look like an excellent choice. Archival Clothing makes awesome things. I already ordered one.

    → 9:12 PM, Nov 6
  • The First Comment on Hipstamatic's Time Magazine Post

    The cover of Time Magazine was shot using Hipstamatic — this is the first comment on their post about it:

    Thank heavens we've abandoned the whole ridiculous folderol of artists painstakingly using exquisite optics and refined engineering to create images of profound light, depth, color, and shadow to compel joy, pity, terror, and wonder, thereby evoking mystery. It was all just a plot to make Ordinary People doubt their Specialness and make them "feel bad" about themselves. Now that a grainy, flat representation of what might as well be dishpan soapsuds can be lauded as art, everyone can be a photographer! Take that, Ansel Adams! (He was fat, you know. Think of all those stupid people, worshipping pictures taken by some fat guy. And really, how many magazines did he sell?) Now that a journalist is anyone who can use a keyboard to phonetically represent a belch and the twee product used to create a photograph is more import than the image itself, anything is possible. Ours is truly an age of wonders.

    Wonderful.

    → 1:37 AM, Nov 5
  • The Five Stages of Hosting

    Pinboard Blog:

    As a proud VPS survivor, I thought it might be fun to write up five common options for hosting a web business, ranked in decreasing order of 'cloudiness'. People who aren't interested in this kind of minutia would be wise to pull the rip cord right here.

    This is a very helpful article for those of us who might be thinking about developing a small web back end for our own apps at some point.

    → 2:35 PM, Nov 2
  • Pushing the Boundaries

    Justin Williams:

    Apple has fostered an environment where we can produce high quality games and applications that enhance the iPhone and iPad in so many ways. It is The Show where companies are focusing their design attention and pushing the boundaries of what is possible in this new medium of touch-based mobile devices. Third-party developers take their leads from Apple who has always been a company that sweats the details and ensures every pixel was placed with thought. Google and Microsoft just discovered design during the Obama administration.

    I really enjoyed this post. Insightful as always.

    → 12:30 AM, Oct 31
  • A Massive Speed Difference in iPhone Core Data

    Samuel Goodwin:

    It was brought to my attention last night by my good friend, Collin Donnell, that using a fetch request to grab objects based on their objectID’s was much slower than simply using a for loop and the NSManagedObjectContext method -existingObjectWithID:error: to grab each object one by one. My initial response was supreme disbelief. How could this be true? I needed a break today from my pile of work to do, so I thought I would investigate and see what’s up.

    → 2:55 PM, Oct 19
  • Send Links From Your App to Pinbook With ALBPinbookActivity

    If you're an iOS developer and want to easily add Pinboard support for users with Pinbook installed, you can now do that using an open source class I've created called ALBPinbookActivity. In one or two lines of code you can have “Send to Pinbook” appear in your UIActivityViewController (sharing sheet) and pre-fill any information you want (title, tags, etc). The Pinbook option will only appear for users who have Pinbook installed. You can get ALBPinbookActivity on GitHub. If you end up using it in your app, make sure to let me know.

    SendToPinbook

    → 2:44 PM, Oct 18
  • One or Two Primary Attributes

    John Gruber talking about a smaller iPad:

    When designing anything, you pick one or two primary attributes and you compromise on everything else.

    This pretty much echoes part of what I was trying to get across in my post yesterday in regard to picking features. For software it's about understanding what the nucleus of the idea is, what you need to do to get that across, and letting go of everything else that distracts from it.

    → 2:24 PM, Oct 18
  • Release and Creation of Pinbook 1.0

    I’m unbelievably excited to be officially announcing the release of an app I’ve been working on for a while now: Pinbook. Pinbook came out late last Thursday while I was at the Çingleton conference in Montreal, and has gotten some attention and great feedback already, so this post is a little delayed. If you haven’t heard about it, Pinbook is a client for one the services I use the most: Pinboard. If you’re not familiar, Pinboard’s self description is a “a fast, no-nonsense bookmarking site,” and that’s very apt. It lets you save bookmarks online, assign tags to them and find them later. It also has an interesting pricing model based on a one time fee that I find really appealing.

    I use Pinboard all the time for saving links, but I’ve had trouble using as much as I’d like, because there hasn’t been a great way to use it from my iPhone. I’m unbelievably proud to say that as it stands, Pinbook is an app that I use every day and that lives on my home screen. If you’ve heard enough and want to go buy it in the App Store right now, I’m fully supportive of that instinct. But Pinbook has also been an outstanding chance to challenge myself in ways I never have before — so if you’d also like to hear about what went into making it, continue on.

    The Making of Pinbook 1.0

    For Pinbook 1.0, there was a lot I wanted to do with it, but I knew that I’d be better off focusing on a core set of features that make the app useful and allow me to build on it later by updating quickly. I also knew that even if I did try to build in every feature I had in mind, my potential users were going to have a thousand others I never considered. I decided the things that were most important to get right for 1.0 were:

    • A great interface.
    • Fast syncing.
    • Fast search.
    • Sharing to multiple services.

    I also had to leave some features for a future update, like editing of existing bookmarks, tag browsing and supporting more read later services. Based on the people who’ve used it I think I made good choices, and now that it’s out I can start addressing the things I didn’t get to in 1.0. I’m really happy that I didn’t limit myself early on by making choices I can’t easily take back. Good design is about saying no, and it’s about focusing on doing less things better instead of more things worse.

    Design and Aesthetics

    I like to think of myself as pretty picky user when it comes to app aesthetics, and I wanted Pinbook to look like something I would be excited to use. My goal was to make an app that someone who had never heard of Pinboard before would see, and want to get both. I carry around a Field Notes book in my back pocket, and it’s what I use to store little pieces of information during the day. I had this idea that Pinbook could sort of be like a little notebook you keep in your pocket for links, and that thought helped guide the aesthetic of the app. With that aesthetic inspiration in mind, I tried to think of it as if were approaching making an iOS app with the same sense of style, instead of in a skeumorphic sort of way. My answer was: really simple, but a little bit funky (in a good way).

    Around the time that I started working on Pinbook, my girlfriend was thrown off of her bike avoiding a car, and broke her arm in five places. The first sketches of what would become Pinbook were done while sitting by her hospital bed keeping her company. These came out looking something like this:

    PinbookFirstSketch The first few iterations I worked on didn’t involve any custom graphics, just tweaking colors using standard controls. I figured out a lot about the flow of things during this phase, and also which features didn’t really feel important.

    PinbookEarlyScreenshot

    Early on it became clear to me that I was going to need to start thinking about enhancing the visuals with graphics. I’ve never done that part myself before, but I decided to accept the challenge: it was time to start learning Photoshop. I’ve never understood the idea that everyone can or should only do one thing, and as I keep learning I’m determined to prove it wrong. The final look of 1.0 has come a long way, and I’m very proud of it.

    Bookmarks Screenshot 640

    The app icon itself also went through several iterations to finally land at a place I’m proud of. You might call it obsession, but to me it’s taking the time to get it right.

    PinbookIcon-1.png PinbookIcon 2 PinbookIcon 3 PinbookIcon 4 PinbookIcon 4 PinbookIcon 6 PinbookIcon 7 PinbookIcon 8 PinbookIcon 10 PinbookIcon 10 PinbookIcon 11 PinbookIcon 12 PinbookIcon 13 PinbookIcon 14 PinbookIcon 14 PinbookIcon 15 PinbookIcon 16 PinbookIcon 17 PinbookIcon 20

    Making it Fast

    There’s three words anyone who’s been around developers has heard: sync is hard. I actually think that hard is where it starts, and if the API you’re working with wasn’t made exactly for your use case, it’s actually a lot worse than that. In my case, to get what I wanted I was going to need to pull down all of the users bookmark info and figure out what had changed, been added or deleted, and sync it with what I had cached. Initially this didn’t seem like such a big issue, since I figured most people probably had a couple hundred bookmarks and it wouldn’t matter much. Instead, what I found out when I started looking for testers is that a lot of people actually had thousands or more. The app just wasn’t going to work this way, and if I was going to do it I needed a better plan.

    I thought about a solution for a while, and eventually what ended up working was something I’d heard talked about by my friend Brent Simmons: use the libXML streaming SAX parser to download and simultaneously parse chunks of data. If you’re not familiar, libXML is a low level C API, and not too much like what a Cocoa developer is generally used to. I’m lucky, however, in that I’m a little bit crazy and love diving into new things I’ve never done before. It took a while to get everything working right with the downloading, and also a lot of tuning to not slow things down too much with how I use Core Data. I’ve spent a lot of time in Instruments and looking at code, and the results are great. I’m also really surprised how much people notice it being fast and comment on it.

    I could write long posts about what went into making syncing and live search work for users with lots of bookmarks, but ultimately the point is that engineering is part of design. Pinbook could be the best looking app in the world, but if it didn’t work very well people would hate it and it wouldn’t matter.

    Conclusion

    Creating Pinbook has taught me a lot, and there’s lot more I could say about pricing, testing and other things. But right now I’m just so excited to work on future versions and to make sure it remains the best at what it does. If you’d like to try Pinbook for yourself, it’s available in the App Store.

    → 4:29 PM, Oct 17
  • HTC's Record Profit Drop

    Businessweek:

    HTC Corp. (2498), Asia’s second-largest smartphone maker, posted a record 79 percent drop in quarterly profit as competition from Samsung Electronics Co. and Apple Inc. (AAPL) drove down sales of the Taiwanese company’s devices.

    I keep wondering why HTC hasn’t been more successful with Android, since their devices look at least as appealing — or more, I think — as the ones Samsung is making.

    → 1:43 PM, Oct 8
  • Committed

    Justin William's new app is the kind of simple — insanely useful — idea that all developers wish we had more of. It's called “Committed,” and what it does is notify you (using Notification Center in Mountain Lion) whenever someone pushes commits to a GitHub repo you share. If you work on a lot of different projects sort of simultaneously like I do, there’s no excuse for not spending the $4.99 to buy it right now.

    → 1:24 PM, Oct 8
  • They Actually Said “Maptastic”

    Onavao:

    Onavo’s team of data experts set out to compare the data consumed by Apple Maps on iOS 6 to that of the Google-based iOS 5 Maps app. We compared a number of scenarios and investigated how both apps use data over the cellular network. The data we evaluated proved: Apple Maps is up to five times more data efficient than Google Maps.

    This means less battery usage, too. I feel pretty lucky to live in a place that's covered well by Apple Maps (as well as having good transit apps available). I'm interested, however, to see how it works when I go to Montreal in two weeks. If usage data is what it takes for mapping services to get better, I really don't have any idea how better Apple could have handled this situation rather than tearing the band-aid off and hoping for the best.

    (Via The Loop.)

    → 4:02 PM, Oct 1
  • Shameless

    Google Passes Microsoft’s Market Value as PC Loses to Web

    Google Inc. (GOOG) has surpassed Microsoft Corp. (MSFT) to become the world’s second-largest technology company as computing over the Internet reduces demand for software installed on desktop machines.

    Just another shameless example of companies copying Apple.

    → 3:50 PM, Oct 1
  • Recreating a Photograph With Flyover

    I couldn't do it exactly, because the building she took the photo would get in the way, but I managed to create a pretty close approximation of this photograph:

    New York Flyover

    → 3:46 PM, Oct 1
  • Subtle UI Changes in iOS 6

    Subtle UI changes in iOS 6 and the case for the blue status bar:

    The final subtle change in iOS 6 in this post is a challenge for you to find out yourself. Notice anything different in the featured image?

    He’s talking about the Settings icon. The changes I noticed are that the gears aren’t pointed, the positioning of them is slightly higher and I think they made some shadows a bit stronger. Jumped out at me as soon as I saw iOS 6.

    → 5:38 PM, Sep 27
  • The History Of The Scroll Bar

    The history of the scroll bar:
    Scroll Bars Through History

    Interesting — possibly meaningless — side note: the most significant changes I can spot are whenever Steve Jobs launched a new platform:

    • Macintosh (1984): Nearly all of the scrollbars for the next fifteen years look like this one. [1]
    • NeXTstep (1989): Introduced the bar resizing to reflect the amount of content.
    • iOS (2007): Introduced dissapearing scroll indicators, a version of which we now have on the Mac as well.

    1. The Apple Lisa’s scroll bars to me look like an unfinished the proto-version of what showed up on Macintosh.  ↩
    → 5:06 PM, Sep 27
  • Meeting a Troll

    Meeting a Troll:

    I received a parcel at my home address. Nothing unusual there - I get a lots of post. I ripped it open and there was a tupperware lunchbox inside full of ashes. There was a note included ‘Say hello to your relatives from Auschwitz’ I was physically sick.

    The insane story of a guy who was abused both on Twitter and in real life and how he ended up meeting the person who was targetting him.

    → 4:34 PM, Sep 25
  • On Supporting Taller Screens

    I was a bit surprised to have a non-developer ask me if it’s going to be hard to get my apps to work well on the iPhone 5’s slightly taller screen, and for tech writers to talk about the fear of screen introducing Android-style “fragmentation” issues to iOS because of it. The answer to will this cause problems when developing iPhone apps is no.

    iOS developers have all the exact same tools at their disposal for dealing with different screen sizes as Mac developers, and we’ve been dealing with different window sizes forever. In fact, it’s easier, because on the Mac the user can resize the window to pretty much anything they want and on iOS we have a maximum of three sizes we really need to worry about[1], both of which are easily testable.

    A lot of iPhone apps already can deal with at least two sizes (portrait and landscape[2]), and that most apps I use primarily consist of table views (lists) which will stretch automatically. Generally speaking, even badly coded iPhone apps are going to tend to be more flexible vertically since they probably use table views, and the system will handle show extra rows for them.

    In all of my apps, the only change I needed to make to support iPhone 5 was to add a new launch image for the taller screen size and submit an update.


    1. If you count retina there’s five sizes, but that’s mostly invisible to developers.  ↩

    2. Or as I call them, hotdog and hamburger.  ↩

    → 4:00 PM, Sep 19
  • Jetpack Temptation

    Fuck Jet Packs:

    We’re conditioned to think that more features are better. That “innovation” means “no one has ever seen this idea before”. That new ideas always win in the marketplace.

    I think it’s hard to look back and understand how few — if any — great things were conceived in a bubble. Something doesn’t have to be earth shattering to be world changing.

    (via Daring Fireball)

    → 1:21 PM, Sep 18
  • Love Means Never Having to Delete a Plist

    Horace Dediu, in an interview on Microsoft Surface:

    In contrast Apple sees the iPad as a new type of device that is used for things not directly related to PC style computing. In that sense the iPad competes with PC non-consumption. It means people may own both a PC and an iPad and some will own only an iPad. The iPad will expand the market while taking share from the PC. Windows tablets will try to hold the Windows share steady.

    I think it’s a hard concept for people who are comfortable with technology to understand how much different the iPad is. If you’ve never seen someone who’s never been able to make use a computer grab an iPad and start making art, reading news and keeping up with friends for the first time, it’s sort of amazing. I don’t think my mom could ever make heads or tails of PCs, but I bought her an iPad 2 the day it came out, and she’s used it every day since. If you haven’t seen or experienced that, the idea of an iPad being anything different than a PC, or that there was ever anything wrong with PCs (I mean that in the “personal computer” way), just isn’t going to compute.

    The place it becomes most obvious to me is whenever something stops working on my Mac in such a way that I need to edit a configuration file, or do something using Terminal. I think, “What does someone who’s not extremely good with computers do under these circumstances?” Accept it as broken? Try to get someone to fix it for them (Mac users at least have the Genius Bar)? Assume it’s their fault? With an iPad that just isn’t a concern most of the time. I’m not saying its perfect – we’ve got a long way to go – but no one who uses an iPad should ever need to worry about it “breaking” in the same myriad ways that PCs do all the time.

    Microsoft doesn’t see it that way, or they’re scared to.

    → 8:29 PM, Sep 4
  • Stupid Facts

    Dan Savage in Blogtown PDX:

    Instead of telling us the truth in plain English—you’re being lied to—they tell us that facts took beatings, that “factual shortcuts” were taken, that a statement may have been “factually challenged.” They make it sound like facts did something wrong.

    If someone says something verifiably false, the person who said it either knew and lied, or didn’t bother to find out before they spoke, and thinks that’s OK. That should concern you. I mean, people were willing to get on stage at the Republican National Convention last week and say, to a room full of people, things they had to know weren’t true. And people believe them. Or they apologize for them. The whole thing really disturbs me. If Democrats do the same thing, it will concern me just as much.

    → 2:15 AM, Sep 3
  • This Almost Makes OpenGL Sound Approachable

    Jacob Eiting on OpenGL and the GPU:

    For many programmers the GPU is a part of the system shrouded in mystery. A realm best left to heavyset bearded types who toil away in the deep recesses of the gaming industry. With all the abstraction on top of the GPU, all but a few programmers can live out their daily lives without so much as a thought about how the things they make are actually rendered. Living behind these abstractions is fine, until you reach a limit, usually one of performance. When reaching these limits it can be really helpful to have a basic understanding of the GPU.

    Maybe the best and most concise intro I’ve heard to understanding the terms that get thrown around when talking about graphics programming, and why you might want to know more about it.

    → 2:28 AM, Aug 30
  • Come See Me Play Music in Portland This Friday

    If you haven’t known me for long you might know this about me, but before I ever bought my first book to teach myself how to write software for my Mac, the thing that I’ve always been obsessed with is music. Writing it, performing it (I sing and play guitar, primarily), recording it: the whole thing. While running an app making and consulting business keeps me extremely busy most of the time, over the past couple of months I’ve decided to not let music take a backseat and to start performing and recording a lot more.

    This Friday (August 31st, 2012), I’ll be performing my first show at The Waypost in Portland Oregon (NE Fargo and Williams) at 8pm. I’ll be backed up on a few songs by the lovely Spencer Clark[1]. Besides appreciating the support, it’s also a good opportunity to meet local folks I don’t normally get to, since I’m sure there’ll be time after the show to hang out.


    1. If Spencer ends up being in every song, I may switch from “Collin Donnell” to using an actual band name. I may do that anyway, I already have one picked out that I think is pretty good. Also, I might feel like a jerk selling shirts with my name on them.  ↩

    → 2:36 PM, Aug 28
  • Identical Simmons's

    My two favorite Simmons — Brent and Michael — have started a podcast called Identical Cousins. I’ve subscribed.

    → 1:36 PM, Aug 28
  • Implementing Areas of Focus Using OmniFocus

    Something I struggled with when first trying to implement GTD was how to organize tasks and projects around the different parts of my life. Right now I have several top-level folders in OmniFocus organized into different “Areas of Focus,” based roughly on priority and general urgency. I happen to be using OmniFocus to do this, but the idea is actually pretty app-agnostic.

    • Routine
      • With sub-single task lists for things I need to do on a repeating basis. For me, they’re called “Personal,” “Business” and “System.” The first two are for things that relate to those parts of my life (e.g. “Invoice clients”), and “System” is for things that relate to keeping my actual task system running, like “Perform Weekly Review,” and “Process OmniFocus inbox.”
    • Personal
      • Any projects that are non-work related and don’t fall into one of my other areas (e.g. “Make dentist appointment,” “Get things from storage.”)
    • Business
      • Administrative tasks related to running my business and client projects.
      • There’s a subfolder called “Clients,” which has subfolders for each client where I keep projects related specifically to them.
    • Apps
      • Anything to do with my own apps.
    • Music
      • Anything relating to booking, performing and recording.
    • Travel
      • Anything related to travel — booking flights and hotels, things to do while I’m there) - — business related or not. Mostly for conferences (e.g. “Cingleton 2012”).
    • Miscellaneous (single task list)
      • Single tasks, a lot of things to look up, one-step errands, etc. I try to not let this get too long. Sometimes these turn into — or become a part of — a full blown project in one of the above areas.

    One thing I don’t do is let any projects live outside of this hierarchy at all. I’ve kind of waffled on whether this is necessary or not, but everything should relate to something, so I’ve stuck with it. Something that’s changed is, instead of having one top level “Miscellaneous” list, I used to have a single-task list inside each folder called “Single Actions,” but I stopped doing this since I wanted to stay away from keeping two many items in single action lists, and there didn’t seem to be any major benefit to doing it the other way.

    → 7:50 PM, Aug 26
  • A Chair About Running Glassboard

    I spend a potentially unhealthy amount of time thinking about and tweaking things like how I have OmniFocus set up, how I manage notes, Automator services to prefix timestamps to file names and what text editor I should use. Unfortunately, I have no one to share these “tips and tricks” with most of the time other than a one year old wiener dog who seems less than interested. From the blogs I read, I’m told that the time I spend thinking of these things is called “productivity”, and that a lot of other people have the same compulsion.

    I was thinking it would be cool if there was a slightly less public way for all of the productivity nerds out there to share and discuss ideas than posting publicly on the Internet, so I’ve created a Glassboard for anyone who’s interested. Since the point is for people to share their different workflows, it doesn’t matter if you use OmniFocus, Things, Reminders or napkins[1], so don’t be intimidated to join.

    I’ve decided to call it A Chair About Running, and you can join by going to Glassboard and using the invite code lorqq.


    1. Also, Napkins is an awesome name for a notes app. I’m going to need to remember it if I ever make one.  ↩
    → 6:09 PM, Aug 24
  • Good for Samsung

    Review of the Samsung Galaxy Note 10.1 on Android Police, “An Embarrassing, Lazy, Arrogant Money Grab”:

    The build quality. Terrible even by Samsung’s low standards. The back is actually squishy, and you can feel it deform while holding it. It’s noisy too, the plastic creaks, groans, and grinds when you pick it up. Regular, strong plastic would still be unacceptable when everyone else uses aluminum, but this… this is insulting for a $500 tablet.

    Oh, sure, take their word for it if you want to believe what the Android fanboys say. I say good for Samsung: it sounds like they’ve finally stopped copying Apple.

    → 2:24 AM, Aug 22
  • Oregon Data Centers

    Facebook’s new Oregon data center:

    Facebook’s data center here is one of the most energy efficient in the world. The social network invested $210 million for just the first phase of the data center, which GigaOM got a chance to check out during a two-hour tour.

    I’ve heard that the future of Oregon’s economy is data centers due to our cheap land and abundance of clean power.

    (via The Loop)

    → 6:41 PM, Aug 20
  • Justin on Startup Life

    The Stages of Startup Life

    1. Realize that you’re not really busy and that there’s more to life than sitting in front of the keyboard trying to change the world one trendy mobile app at a time.

    I can’t say that I know the other side of it too well, but I can say that having a life is pretty sweet.

    → 5:39 PM, Aug 14
  • 360iDev 2012

    I’m pleased to say that I’ll be speaking at 360iDev 2012, September 9–12th in Denver. There’s a really good mix of returning and new speakers. 360iDev is one of the things I look forward to the most throughout the year, and I don’t think this one will be any different. I’ll opening up the second day with a general session talk I’m calling “How to Not Be a Programmer.” If you haven’t gotten tickets yet, they’re really inexpensive for the quality of conference you’ll get, so definitely check it out.

    → 4:07 PM, Aug 12
  • Dark Xcode Themes

    Every so often I try a dark theme in Xcode, and usually switch back to the default within a few days. But since I’ve been using the EGOv2, it actually seems to be sticking. There’s also an original version of EGO that v2 is based off of that’s alright as well, although a little too high contrast for me. The themes use 13pt Menlo Bold as their font — which is a different than what I’m used to. I’m actually liking the 13pt size, but turned off bold.

    → 10:53 AM, Aug 1
  • MacDrifter on Blog Portability

    MacDrifter “Things I Have Learned About Blog Portability”:

    In my continuing efforts to migrate off of WordPress, I now understand some of my biggest mistakes and flaws.

    Good list. I’m pretty sure I’ve made a bunch of these same mistakes.

    → 1:06 PM, Jul 31
  • Hulu Plus on Apple TV

    Hulu Plus is now available on Apple TV. I've never paid for cable service, and don't plan on starting, so I've hoped something like this would happen for a while. I've used a Roku exclusively for watching Hulu Plus for a while now, but it's buggy and the interface lags. Hulu on Apple TV looks about as good as Netflix is, which is to say really good.

    (via Daring Fireball)

    → 12:57 PM, Jul 31
  • Get Ready for Food Prices to Go Up

    Get Ready for Food Prices to Go Up:

    Sounds like vegans who eat local, unprocessed foods are going to be hurt the least by all this.

    (Via Portland Mercury)

    Good to know.

    → 1:01 AM, Jul 27
  • About Text Editors

    Macdrifter:

    I have a garage filled with amazing but different options. NVAlt is the Austin Mini Cooper. It’s fun and easy drive, but I don’t want to go on a long trip with it. Sublime Text 2 is the Tesla Roadster. It’s breathtaking and fast but tweak it too hard and you just screwed up your ride beyond all repair. BBEdit is the VW Westfalia. It has more amenities than I can comprehend, and it’s not the best looking ride out there but I could probably live in it if I wanted to.

    I use BBEdit primarily as well. I like it.

    → 3:07 PM, Jul 26
  • The Sweetest Thing I've Heard Today

    Manton Reece, talking about the impermanence of digital media:

    Some people say “good riddance” to the cheap printed book, but I don't agree. Recently in our house I found a paperback of an old favorite, Tigana, which I had bought while traveling in Europe. Inside the cover I had written “Oxford, 1999”. I flipped through the pages and out fell a wine label that I hadn't seen in 13 years. It was from a bottle of wine my wife and I had in Greece, sitting on the sand of an island beach the night I proposed.
    → 4:57 PM, Jul 20
  • The LA Times Tries to Capitalize on Aurora Tradgedy

    LA Times: How will Colorado shootings affect 'Dark Knight Rises' screenings?:

     As details emerge about a deadly rampage at a screening of "The Dark Knight Rises" in Aurora, Colo., there are also questions about how movie theaters and filmgoers around the world will react to the tragedy.

    How about fuck you, who gives a shit? The LA Times is disgusting and should be ashamed of themselves for trying to capitalize within hours on twelve people losing their lives by posting this link-bait garbage.

    → 7:23 AM, Jul 20
  • Trapit for iPad

    TUAW:

    Trapit for iPad was born out of an artificial intelligence project completed by DARPA and SRI, and has some of the same DNA as Siri.

    So anyway, that thing I was working on since the beginning of the year came out and seems to be doing alright.

    → 5:32 AM, Jul 20
  • Apple Does the Right Thing for 3GS Users

    The Verge: iPhone 3GS gets shared Photo Streams and VIP email with new iOS 6 beta release:

    With the developer release of iOS 6 Beta 3, both shared Photo Streams and VIP email features are now supported on the aging 3GS, and Apple has updated the iOS 6 information page to remove the previously listed restrictions.

    It never made any sense to me why 3GS users weren't getting these features. No one was going to buy a new phone to get VIP email, but if they knew they weren't getting it, they may have a bad taste for Apple over it. The cost/benefit was hard to understand. Flyover and turn by turn feel like the sorts of things the older hardware can't support, leaving out these other features though just felt like they were trying to get people to buy a new phone by screwing their customers — very un-Apple like.

    → 1:16 PM, Jul 17
  • Ordered Apogee MiC

    Ordered an Apogee MiC this morning. If you've never heard of it before, it's a USB microphone which can plug directly into an iPad, iPhone or Mac. Although I have lots of more substantial recording gear, lowering the barrier of entry to record something quick that sounds decent is something that I've been wanting to do for a long time. I expect it to be good for recording podcasts, live shows and doing quick demos of things at home.

    If it sounds decent it could mean I start doing a lot of my recording straight to Garageband on the iPad.

    → 3:34 PM, Jul 5
  • Piedmont OmniFocus Theme

    This weekend I discovered what I’m pretty sure is the most effective way to lose two days: tweaking OmniFocus’s theme settings. I went from trying out other peoples themes, to making it look like various Wes Anderson movies (using the color chart I posted a couple of weeks ago), and eventually landed on doing something a bit simpler. I decided to call it “Piedmont.” On top of prettier, I also tried to make it easier to glance at the window and see what’s going on, and make the sidebar less distracting so that I could leave it open more. Hopefully sharing it will save someone else from a weekend of tormenting over just the right shade of gray.

    Piedmont Theme Screenshot

    Download Link.

    → 5:34 PM, Jul 2
  • My NetNewsWire Window

    My NetNewsWire Window

    I love NetNewsWire1 — and have for years — because its interface isn't overdone, and because of how fast it lets me get through whatever's new. I have it set up a little bit different from the default to make things even more focused and minimal.

    Hidden Feeds List

    I primarily get through my news by repeatedly hitting ⌘ + / (next unread)2, so I have no reason to look at my list of feeds unless I'm removing, reorganizing or adding feeds.

    Tabs and Open Links in NetNewsWire

    Setting tabs to appear at the top of the window keeps it from resizing to show them on the right, and cuts down on visual clutter while reading. I have the app set to open links in NetNewsWire by default, so when I'm going through my articles list hit, I can hit return (open article) if I see an article I want to read in more detail, and click links that sound interesting, and they'll come up as tabs. I keep them open and use as a queue of things I want to read in more detail (or, ⌘-P to send to Instapaper if I realize I don't have time right now).

    Ballard 21st Century Theme

    A theme for NetNewsWire by Alex Knight, based on a theme by Pat Dryburgh, which was based on the original that Brent made. It's really nice. They share no actual CSS, but the theme of this blog is clearly heavily influenced by it. I honestly can't remember if that was on purpose or just came from staring at this theme every day. The point is I like it a lot3.


    1. Speaking of things I love, if you like these kinds of blogs and aren't reading MacDrifter, I recommend it. ↩

    2. This is my favorite feature of the app. I have no idea why others don't copy it. ↩

    3. I blame Brent for my infatuation with Myriad Pro and Myriad Web Pro. ↩

    → 1:03 PM, Jun 29
  • Apple's Podcasts App

    In this version it’s OK if you weren’t willing to pay money for another podcast app, but I can’t find any reason to use this instead of Instacast. I’m not in love with everything that Instacast does, but the iPhone version has gotten a lot better in recent versions. Podcasts 1.0 has a few problems that are going to keep me from switching, none of which I think are power user things:

    • iCloud Syncing: Instacast and Downcast both do this. I usually use my iPad to listen to podcasts when I'm at home, and my iPhone when I'm walking, so this is pretty important to me.
    • Kludgy Interface: Way too much tapping around to do simple things like marking an episode as played.
    • Reverse Playback Order: This one might be a little power user-ish; you can only playback automatically from newest to oldest. Either is fine as a default, but the one they chose isn't the one I use. I think anyone else who listens to 5by5 After Dark probably has the same preference.

    If Apple updated the app to fix these things I might give it a shot. iCloud support seems likely, changing playback order slightly less so. I think we’re probably stuck with the kludgy interface. iBooks, however, has gotten a lot better over time, so I guess there’s no reason to think this won’t as well.

    → 6:55 PM, Jun 27
  • Sales of Closeby and What I've Learned

    A few months ago I released a small app called Closeby. What Closeby does is finds which of your contacts are nearby by using the addresses you’ve stored in your address book. Think of it kind of like “Find My Friends Houses.” Although everyone who tried it seemed to think the app was well done, and many offered great suggestions — which I’ve recently gotten around to implementing a lot of — the app hasn’t sold very well.

    Since February the sales have looked something like this:

    ClosebySales

    The launch was decent, and the next several days weren’t too bad either, but after the initial wave of sales things fell off in a pretty serious way, with several days of zero sales. Now, honestly, I don’t think the app is really for everyone and I didn’t expect to get rich off of it. I thought of it more as a fun idea that I thought I could execute well, and an opportunity to get a nice looking app out there that I could be proud of. In those respects it’s done great. Still, I’d like to look at what I can do better in the future in order to get my next apps into more peoples hands.

    The Price Was Too High

    The first thing is that I think I priced the app too high. I started off at $2.99, and I think that was a mistake. As of today I’ve lowered the price to 99¢, where I plan on keeping it. I don’t think most apps should be 99¢ — most apps I buy aren’t — but I do think this app should be. The reason is that Closeby can be a fun app to have on your phone, and definitely has utility for certain people, but that for most people it’s more of a novelty. If I like it or not the state of the market for iOS apps is that novelty apps cost 99¢, and $2.99-$4.99 is seen as more of a premium price point.

    Has to Be Seen and Explained

    The second problem I think is that while everyone who’s seen Closeby have had nice things to say about it, it’s just not an app that sounds that cool unless you’ve seen it, or ideally I’ve shown it to you. It’s also not an app that I think anyone is searching for. Thinking about it now, I really am not sure how you’d accidentally run across Closeby due to an App Store search.

    With my future apps I want to focus on easily understandable solutions so that you know if you want it has soon as you see it. I think this is a big lesson that I haven’t really gotten until now.

    Bad Update Strategy (Initially)

    I don’t know what the direct impact on sales has been, but when I first released the app I got so many great suggestions from other developers and designers that I wanted to implement that I spent way too long trying to fit all of them into one release. This was a mistake, especially since I have a lot of other things I’m responsible for getting done. Since then I’ve started releasing smaller updates a lot more often. If I can spend a couple of hours and fix a bug, add a feature or make something nicer to look at, I just do it and submit. Even doing things that way, it’s unlikely that I’ll get my updates approved and in the store faster than every 10-14 days, so there’s really no risk of updating too often. I don’t know if there’s any relationship, but it does seem like I’ve had a small uptick at the end of the chart.

    Going Forward

    I think there’s a lot of lessons I can take from this. I’m still proud of the app, happy it’s out there and plan to keep updating it. To summarize the big things I think I can do better next time, they are:

    • Price what the market will bear for the kind of app you're releasing, not what you'd like to sell for.
    • Pick ideas that don't need to be explained and that solve a problem you know others are having.
    • Break up your ideas into smaller updates, rather than going a long time between updates.

    And of course if you’d like to check out Closeby, you can find it on the App Store.

    → 7:17 PM, Jun 23
  • Wes Anderson Color Palettes

    I’ve been thinking of creating a custom Keynote theme to use for all of the talks I do. This will be very helpful for that.

    → 6:35 PM, Jun 23
  • innessential.com: UIGestureRecognizer and nil-targeted Actions

    Brent Simmons:

    I like the Cocoa responder chain — I like being able to specify nil as target and have the action message follow the responder chain until it’s handled (or not).

    But this doesn’t work with UIGestureRecognizer. The documentation states that “nil is not a valid value” for the target in addTarget:action:.

    Neat — I learned something.

    → 6:30 PM, Jun 23
  • TextExpander 4

    Nice update to an app I use all the time. The multi-line fill-ins feature in particular is something I’ve really wanted. You can buy or upgrade via Smile’s website. If you previously bought it on the Mac App Store, all you need to do is download the demo and launch it, and you’ll be offered the upgrade price from within the app.

    → 8:09 PM, Jun 22
  • BeeList for iPhone

    My friend Matt just released a new shareable list app with one of my favorite names ever: BeeList. If you've been looking for an app like this, it looks like a good choice, and is available for the unbelievably low price of $1.99.

    → 4:55 PM, Jun 6
  • Best Coffee Roasters in Portland

    An Exploration of Portland Oregon Food and Drink:

    I was floored by these results. The relatively new Ristretto Roasters came out of nowhere to take first place, edging out Stumptown Coffee.

    A bunch of my favorites made the list (I've tried all of these), but I'm shocked to not see Heart Coffee Roasters on this list. The Red E Cafe has also started selling their own beans recently, and I wouldn't be surprised to see them on the list in the future.

    → 4:13 PM, Jun 5
  • WWDC Travel Checklist

    Whether or not you got a ticket this year — or are just going — WWDC is five days of being insanely busy and struggling to keep your electronics charged. I’ve created a quick checklist of things that I’ve picked up or wish I had for previous events. You don’t want to get to San Francisco and realize you forgot to bring something you really need, and you really don’t want to try and buy anything once you’re there.

    Tech Items

    Don’t plan on picking any of these up while you’re there. There’s going to be a rush on the local Apple Store and you won’t be able to find it.

    Mophie Juicepack (or similar)
    It seems like a full iPhone battery is enough for about two thirds of a day at WWDC. These generally claim to double your battery life (or better), so that should be just right. The worst thing is having to abandon your friends to go find a plug, or trying to charge off of your laptop the entire day. You will not regret this purchase.

    Apple USB Ethernet Adapter for MacBook Air
    If you have a MacBook Air you’re going to want one of these in order to plug in and download whatever Apple has for you.

    iPad and iPhone Wall Chargers
    Don’t plan on charging anything off of a laptop at night. You’ll forget one time and it will be a nightmare. Bring a wall charger for each separate device you bring.

    Extra Dock Connector Cables
    Bring at least one more than the number of devices you have that use it.

    Personal Items

    Travel Toothbrush and Toothpaste
    I usually count on the hotel I’m staying at to provide these. Last year they didn’t and it was a total pain in the ass.

    Lightweight Jacket
    It gets cold in San Francisco at night, not frigid, but cold enough to need something. Don’t get stuck wearing your WWDC jacket the entire time.

    Backpack Travel Bag
    I recently upgraded my travel bag to an Archival Clothing Rucksack and it’s a great improvement over the roller bag I’d been using before. I can fit everything, it’s not a pain if I need to carry it around part of a day and I won’t be asked to check it at the gate if the plane is full.

    Extra Clothes
    Bring two more than you think you need of the following: socks, underwear, shirts and pants.

    Miscellaneous

    Data Plan for Your iPad (if 3G or LTE)
    If you can offload some of the mapping and messaging you’ll be doing during the day to your iPad you’ll have a much better chance of your iPhone battery making it through the day. I did this at Macworld and it was a great decision; completely worth the twenty or thirty dollars.

    → 5:21 PM, Jun 1
  • HockeyApp is Awesome

    I switched from TestFlight to HockeyApp recently and couldn't be happier. It's not that I was ever unhappy with TestFlight — each is probably better in different ways, and you should use TestFlight if you prefer it — but for me HockeyApp just fits better. I thought I'd take some time and explain why I like it so much.

    HockeyApp Is a Payed Service

    This is the feature that made me want to check out HockeyApp in the first place: they make me pay them. I have no confusion what my relationship with the company is. Because of this I feel they'll stick around, are more likely to always treat me like a valued customer and I that can expect to not be surprised by radical changes as a result of developing new business models.

    Crash Reporting

    Once I started my trial, it became clear that crash reporting is the standout feature of HockeyApp. The library they've created is called QuincyKit, and the server component can either be self hosted, or with HockeyApp (you get a couple of extra features this way).

    All you have to do is enter the details for this version of your app and the dsym file to get fully symbolicated crash reports. You can also upload the xcarchive file Xcode generates when you archive using their uploader app for Mac, and it's everything's handled automatically.

    It's already helped track down some crash-bugs that I never would have found otherwise, and I've heard the same from other developers.

    Issue Tracker Integration

    On top of just showing crash reports, they can be also be easily integrated with just about every bug tracker I've ever heard of. I use GitHub Issues, and have HockeyApp set to automatically generate a new ticket whenever a crash report comes in.

    HockeyKit

    I don't currently include analytics in the release versions of my apps, mostly because I don't want to have other peoples code in my apps any more than necessary1. But during testing I'd like to see things like who's downloaded the app, how long it's been ran for and what devices it's been ran on. The HockeyKit library gives me all of that as well as over the air updates for testers.


    1. I don't have any issue with apps that use analytics, but tracking users (non-identifiably) wasn't helping me sell more copies, wasn't helping me improve my apps and gave me another way to distract myself. ↩

    → 6:49 PM, May 28
  • Coding Guidelines For Cocoa

    There's one document I spend an unreasonable amount of time referring back to when coding that I think is worth others looking at too — Apple's “Coding Guidelines For Cocoa.” It's important to have a consistent style — especially when working with others — and Apple has made explicit a few that are used pretty inconsistently in the real world.

    For example, from the “Naming Methods” section:

    Don’t use “and” to link keywords that are attributes of the receiver.

    So, for example:

    - (void)doSomething:(id)foo andSomething:(id)bar

    Is only correct when the second argument is an optional parameter for the method, not when it's an attribute of something.

    There's a lot of other goodies, like what the very few acronyms it's OK to use in your code are are. Read it and refer back to it, and I promise the people you work with will thank you.

    → 3:04 PM, May 20
  • Glassboard 2.0

    My friends at Sepia Labs have just released the version 2 of Glassboard, their app for sharing privately and securely with people you know on iOS, Android and now the web. Also it's gorgeous. The app is free, so you should check it out. Brent has a lot more to say about it.

    → 3:08 PM, May 15
  • A Glitch or Two

    This Is What Developing For Android Looks Like | TechCrunch:

    Siu is nonplussed though. He’s told me in the past that thorough QA testing makes Animoca’s apps retain users better because so many other Android developers do a bad job at it. Unlike iOS users who throw up their hands in frustration, write bad reviews and just leave, Android users tend to be delighted when they find apps that work even if they have a glitch or two.

    So Android users are more tolerant than iOS users of crappy apps because more apps are crappy? Sounds great.

    → 9:31 PM, May 12
  • Building a Desk

    The past couple of weeks I've been considering the possibility of buying a new desk. The problem I've had is that while there's some that I love the look of, they all come about 29" high, which is really not ideal for typing. The ideal position when is to have your elbows at at least a 90° angle and your feet flat on the ground. Maybe someone a few inches taller (I'm 5'8) wouldn't have this problem, but for me I either have to get a chair which puts me so high off the ground my feet dangle, put my keyboard on a tray or get a shorter desk. Up until now I've been using a laptop table under the desk as a keyboard stand, but it gets in the way of my feet and I'm sick of it. Since I can't find a desk that I'm in love with which also is at the right height, I'm building my own.

    The idea — which I found on a blog — is to use hairpin legs with any piece of wood you like. I ordered the legs in the 24" height, which when paired with a 1" top will lower my desk height by around 4". It doesn't sound too hard to do, and the result will hopefully be a gorgeous looking desk at exactly the right height for about $150. If my monitor sits too low I can always build a little table top stand for it the same way using 2" legs or so.

    → 9:58 PM, May 5
  • Motivations for Decorating Instance Variables

    Mark Dalyrymple on the Big Nerd Ranch Blog:

    These synthesizes tell the compiler that each property should be backed by an instance variable whose name is prefixed by an underscore. The compiler names the backing instance variable after the property if you don’t provide an alternative.

    OK, so why do programmers do this? Seems like it’s just extra busywork. I see two main reasons: one involves style, and one involves safety.

    I'm amazed at the number of bugs I see in people's code that's due to not using properties consistently. Please do this.

    I sort of disagree with this part though:

    Some people use a trailing underscore (that’s Google’s style), and folks also prefix or suffix with “m” for “member”. It’s all fine. One nice thing about the leading underscore is that it automatically participates in Key-Value Coding.

    Just use an underscore — Apple says to.

    → 4:00 PM, Apr 23
  • MarsEdit 3.5

    MarsEdit is the final destination for almost everything I post here, and version 3.5 is a really nice update. The improved full screen mode is something I've wanted since Lion came out.

    → 3:15 PM, Apr 23
  • Going With Xcode's Code Style Flow

    If there's one thing I've spent way too much time thinking about, it's the way I format code (bracing and spacing). I know eventually I could get used to any reasonable style, so the time I spend reformatting Xcode's generated code is useless busy work. All I really want is Apple to tell me “this is the way we want you to do it.” While Apple's example projects don't really have a consistent style, the code that Xcode generates for file templates and autocompletion does — the one true brace style.

    So my style has evolved from something like this when I started working for myself last September:

    - (void) myMethod: (id) sender
    {
        for( int i; i < 10; 1++ )
        {
            printf( @"%d", i );
        }
    }
    

    To something more like Allman style:

    - (void)myMethod:(id)sender
    {
        for (int i; i < 10; i++)
        {
            printf(@"%d", i);
        }
    }
    

    And finally to K&R / 1TBS

    - (void)myMethod:(id)sender
    {
        for (int i; i < 10; i++) {
            printf(@"%d", i);
        }
    }
    

    So braces for method and function definitions go on the next line, everything else goes on on the same line. Are there practical reasons this style is better or worse than others? I'm sure. The style I was using before going independent spaces everything out a lot, so whatever reason to like it or not, there's a lot of reformatting that's going to occur, so moving to the second style was mostly to avoid that.

    Always putting braces on the next line didn't always work well either though, particularly with blocks. I just couldn't find a way to make blocks look passably decent or work with Xcode's auto-indenting while putting their opening brace on the next line.

    Xcode's autoindenting turns what would be this:

    dispatch_async(dispatch_get_main_queue(), ^{
        // do something here
    });
    

    Into this:

    dispatch_async(dispatch_get_main_queue(),
                   ^{
                       // do something here
                   });
    

    But the biggest reason for making this switch is that's the closest thing to a supported-style Xcode has — all of the file templates lay method definitions out this way, and so does autocomplete. I'm not working against my tools anymore, I don't need to waste time reformatting, and that becomes time I can spend getting real work done.

    → 4:47 PM, Apr 15
  • Prioritizing Active Transportation in the United States

    I live in Portland Oregon, a place that’s often referred to as the Cycling Mecca of the United States. Indeed, it is relatively easy to get around by bike here compared to other cities I’ve lived in, but even here there seems to be a feeling by some that good enough is good enough, and it’s not. The fact that we have gotten as far as we have in Portland has more to do with the demand of the people who live here than anything else. You only need to compare pictures of bike roads in Amsterdam and compare it to a street heavily trafficked by bikes in Portland to see that. In one bikes are treated as equal and separated from cars, in the other we’re expected to take back streets, usually ride in traffic, and in all cases end up very close to cars. In the best cycling city in America, cyclists are second class citizens. Where does that put everywhere else in the country?

    I do not believe there is anything inherently different about cities in the United States that mean we can’t do as good as countries in Europe — I think we lack political will. Prioritizing more motor vehicle infrastructure over cycling (and public transit) is short term thinking: we are running out of fossil fuels, we do have an obesity epidemic and we are destroying the environment. If you prioritize building infrastructure to encourage active transportation in the United States — and de-prioritize single occupant motor vehicle traffic — it helps all these things. There’s no reason to believe Americans inherently hate biking or walking — I think it’s just that only the very motivated one’s will to do it if it means riding next to cars in traffic.

    What got me thinking about this was an article on the Bike Portland website about a woman who was hit by a car on her bike and could have easily died:

    Indeed, I was lucky. Others, like Hank Bersani, have not been. And what is our government doing to prevent these tragedies? What has been done to protect our health and safety? A sharrow here or there, bike lanes that end randomly and traverse road debris and metal sewer grates, a few bike lights and yield signs… nothing of substance. Nothing that actually treats people, not vehicles, as a vested interest.

    All of what she said is true. In the best bike city in the country we don’t have bike lanes on most major streets, and where they do exist they’re rarely — if ever — physically separated from motor vehicle traffic. How is that supposed to encourage anyone but the bravest and most confident cycles to get on a bike as a main form of transportation?

    The author goes on quote a study which laid out the relative economic cost to society — through lowering costs of health care, infrastructure and road maintenance — of motor vehicle traffic vs bicycle traffic.

    Bike infrastructure costs less to build and less to maintain than car infrastructure. There is a reduction in healthcare costs associated with regular cycling, and a recently reported study showed an equivalent $0.42 economic gain for every mile biked compared to a $0.20 economic loss for every mile driven. Supporting and encouraging citizens to bike is an investment that pays off, all while leaving extra funds for education and other basic services.

    Who wouldn’t want to fight obesity (the Surgeon General estimates 300,000 people who die each year may be attributable to obesity), help the environment and save money that can be used elsewhere?

    The article ends by calling out who’ve called building bike infrastructure frivolous, by bringing up the death of a local cyclist:

    And even in these tight times, the funding is there. We just choose to do nothing. We choose to treat the loss of Hank Bersani, the devastation of his family and friends, and preventing the torment of the next family who will receive a similar solemn phone call as a “waste” of taxpayer resources.

    The idea that doing things which can save lives, and also pays off economically, would be called frivolous or a waste by anyone is hard for me to get my head around.

    I’m not a hippie, I’m not an environmental activist and I know that motor vehicles cannot be entirely replaced by biking and public transit. I’m a realist, and the more I think about this the more I see treating alternative forms as equal — and preferable when possible — is the kind of investment we’d all like to make, and that as a society we should make: low risk and high payout. We can do better.

    → 5:11 PM, Apr 12
  • A 2008 Ad From Portland Mayor Sam Adams

    Sam Adams is the person who isn’t running for mayor again due to having a consensual relationship with an adult. He was nice enough to once let me hang out with him and his colleagues without knowing me when I first moved here, and has responded to me directly on Twitter before to answer questions about the city.

    Watching this ad from 2008, I can’t help but feel he still represents what Portland is about, and that we’re better for having him. Sad to see him go so soon.

    http://blip.tv/play/Aar6HAI.html?p=1

    http://a.blip.tv/api.swf#Aar6HAI

    → 9:11 PM, Apr 11
  • The Verge: "Next iPhone to Be Weirdly Proportioned"

    The 4 inch iPhone 5:

    Colin's idea was to keep the shorter side of the iPhones screen the same, i.e. 640 pixels at 1.94 inches. With that in mind how much would the longer side need to increase so the that diagonal measurement was 4 inches. The answer, derived using simple algebraic rearrangement of Pythagorus's theorem, 1152 pixels and 3.49 inches. That leaves the the diagonal length measuring a little over 3.99 inches, I'm sure Apple PR could round this 4.

    An iPhone proportioned this way would be weirdly tall — and Apple is not known for making things that are badly proportioned. This Colin person pulled this out of his ass, and I don’t know why The Verge would bother publishing an article about it.

    → 8:27 PM, Apr 11
  • Boosh. Called It.

    Simpsons creator explains Springfield reference:

    Simpsons creator Matt Groening revealed to Smithsonian magazine which Springfield the Simpsons’ Springfield is named after.

    (Via The Loop)

    It was Springfield Oregon all along. Suck it every other state. Another interesting fact is that pretty much everything you know from The Simpsons is named after something in Portland — Matt Groening grew up here with his father Homer, mother Margaret, and sisters Lisa and Maggie.

    → 8:05 PM, Apr 10
  • Awesome Icons for OmniFocus

    Read a great article last night by someone named Tim Stringer on how he uses OmniFocus (via MacSparky). One of the things he mentions in the article are these great icons by Dry Icons, which are are free (for personal use) and work perfectly as custom perspective icons in OmniFocus.

    → 6:08 PM, Apr 8
  • Just Bought QuickCursor

    A bit behind the curve on this, but just bought a copy of QuickCursor, and I don't know why I waited so long. What it does is let you set up global key commands for your favorite text editors on your Mac, send whatever's in the current text field to them, and then when you close the document window the original text is replaced with your edited version. It's awesome if you want to avoid having to type into a text box on a web page, or find yourself switching between text editors frequently.

    → 12:46 AM, Apr 4
  • Share With Dropbox AppleScript

    Something that comes up pretty often for me is copying a file to my Dropbox public folder and then sharing the URL with someone. To make my life a little easier, I created an AppleScript to copy the selected Finder items to the public folder and then add the shared URL's to the clipboard.

    I created a GitHub gist for it. Should work well with any script launcher.

    https://gist.github.com/2278990.js

    → 2:51 PM, Apr 1
  • Mike Daisey's New Column in the Portland Mercury

    Mike Daisey has a new column in the Portland Mercury:

    For me, the pyramids door Egypt symbolize one of mankind's most spectacular achievements. But at the same time, it's hard to reconcile the notion that these gorgeous monuments to the human spirit were built... using slave labor.

    I love this town.

    → 5:23 PM, Mar 24
  • A Ride in the Rain

    Just went on an extended ride through the east side of Portland in the rain, on the bike I received yesterday. The combination of weather, and my old bike being slightly out of commission for a few weeks means I haven't ridden as many places I was before. Winter can sort of make you forget how great going outside and doing something — even a little — physical makes you feel. Your body feels better, and your brain works better.

    Anyone serious about development should be serious about how they treat their body. Both with what they eat, and what they do.

    Rainy Bike Ride

    → 3:26 PM, Mar 21
  • Nothing is More Fundamental

    Jeff Atwood on the new iPad and it’s display

    iPad 3 reviews that complain “all they did was improve the display” are clueless bordering on stupidity. Tablets are pretty much by definition all display; nothing is more fundamental to the tablet experience than the quality of the display.

    Jeff’s thoughts on why Apple — and not Microsoft — is leading the post-PC revolution are another highlight.

    → 8:17 PM, Mar 20
  • Photos From the Portland Farmers Market

    One of my favorite times in Portland is the several months out of the year when the PSU Farmers Market is open. During this time I spend a couple hours every Saturday morning getting local vegetables, wine and baked things. Spencer went the opening weekend this year and has a post with some nice photographs of it.

    → 10:39 AM, Mar 20
  • Investing in Customer Service

    There's good article in The New Yorker this week about how Uniqlo and other companies have become more financially successful by investing in staff in numbers, training and compensation, and how other companies have failed or faltered by doing the opposite.

    I've shopped at Uniqlo before and it's about as close to an Apple Store experience as you're going to find from a non-luxury clothing retailer. And although their not mentioned, clearly Apple is another company which has taken this to heart.

    One who hasn't is Home Depot. I was in one of their stores last week, and this quote from the article is a perfect description of the experience:

    When Bob Nardelli took over Home Depot, in 2000, he reduced the number of salespeople on the floor and turned many full-time jobs into part-time ones. In the process, he turned Home Depot stores into cavernous wastelands, with customers wandering around dejectedly trying to find an aproned employee, only to discover that he had no useful advice to offer.

    I think that anytime a company can invest in improving their customers experience, it's going to pay off whether it's by having support staff, or hiring more retail employees. It's sad that the model of making things as hard for customers as they can be to try and cut costs has become something, we're so accustomed to. Even worse is that it doesn't even seem to work.

    → 10:11 PM, Mar 19
  • Making Instapaper Folders Useful

    I haven't ever known exactly what to do with folders in Instapaper. But I'm a sucker for systems and organization, so I've really tried. In the past I've used folders to turn Instapaper into sort of a pseudo-bookmarking service, but not having other organizational features (e.g. tags) makes it a pretty bad choice for that, and I want to use the right tools for the right jobs. I've decided that Instapaper works best when I treat it like an inbox I need to clear out — purely as a “... Later” service. The idea is that everything saved to Instapaper should be consumed and then archived, leaving no stale items.

    Instead of having folders like “Recipes” and “Development” to store articles indefinitely, my folders are:

    • Read Later
      • News articles and blog posts.
    • Watch Later
      • Videos people send me mostly.
    • Cook Later
      • Recipes I'd like to try soon.
    • Buy Later
      • Things I intend to buy online (apps, Amazon).

    What makes this work is a feature in Instapaper that was a bit hidden to me until now. From the Instapaper website you can save a bookmarklet for any folder and have it work just like the “Read Later” bookmarklet. I have one for each of my folders as the first four items in my bookmarks bar, so anything I save off the web can get stored in the right place automatically1. Once I'm finished with an item I archive it, and things I'm pretty sure I'll want to look at again I send to Pinboard, where they can be organized in greater detail.


    1. Since items that get saved from apps will always go to my “Read Later” folder, I just organize those when I'm in the app. ↩

    → 1:01 PM, Mar 19
  • iPad 3, iPad 2 and iPhone 4S Cellular Speed Tests

    I wanted to see what the real differences were between Verizon's LTE, and the AT&T 3G connections I've been using, so I ran some tests and decided to post the numbers. The devices I used were a new iPad, an iPad 2 and an iPhone 4S. I tested all of them from my home in Portland Oregon using the “Speedtest.net Mobile Speed Test” app with their cellular (3G/4G/LTE) connections, plus the new iPad on my home Comcast connection.

    • iPad 3: Home Comcast via Wi-Fi
      • Download: 31.05Mbps
      • Upload: 5.03Mbps
      • Ping: 14ms
    • iPad 3: Verizon LTE
      • Download: 14.20Mbps
      • Upload: 3.42Mbps
      • Ping: 44ms
    • iPad 2: AT&T 3G
      • Download: 5.57Mbps
      • Upload: 1.23Mbps
      • Ping: 99ms
    • iPhone 4S: AT&T “4G” (HSPA+)
      • Download: 7.16Mbps
      • Upload: 1.26Mbps
      • Ping: 99ms

    The LTE numbers were way better than I expected — 14.2 down is probably better than most home (or any coffee shop) Internet connections. It also looks like AT&T's HSPA+ “4G” is a little faster where I live than regular AT&T 3G for downloading, but only a little. My overall impression is that AT&T 3G is pretty fast where I live, and that Verizon LTE is holy shit fast.

    → 2:00 AM, Mar 17
  • Addendum to Previous Post

    In the previous post I talked about my reservations regarding the way that iCloud syncing is handled in an app like Byword, but forgot to mention that Byword for iOS includes Dropbox support for syncing as well as iCloud.

    I tested it a bit, and iCloud definitely works more seamlessly in this version — changes tend to get picked up faster on both ends — so you're still compromising (for now) one way or another with or without iCloud. It is possible, however, to use Byword on iOS without changing your entire workflow.

    → 10:22 PM, Mar 15
  • Shawn Blanc's Review of Byword

    Shawn Blanc on iCloud Syncing:

    The iCloud integration is, as with most other apps, painless and quick. I’ve found that apps which sync their documents through iCloud are quicker and more reliable. However, what I don’t like about using iCloud syncing is that it is application-specific. And so, in a way, an app becomes a silo of my work.

    I'm trying out Byword for writing blog posts, and so far this is my main sticking point. Keeping all of my drafts in Byword means apps like BBEdit (on OS X), or Elements and Writing Kit (App Store) (on iOS) into a secondary position. Each of these apps does some — or many — things better than Byword, but if I choose to use iCloud, a multi-app workflow will be a lot harder to maintain.

    I have more to say about this, so I'll save the rest of my thoughts for a more thoughtful review in the next day or two. I will say that I think the Metaclassy folks did a great job on both versions of Byword and most of my reservations have been about iCloud syncing as a concept, rather than Byword itself.

    → 4:03 PM, Mar 15
  • Desk Reorganization With Snapshots

    I did a little reorganization in my office today and took some snapshots. I've been trying to find a more ergonomic place to put my keyboard and mouse since my desk is a bit high for my chair, and doesn't have a keyboard tray. Instead of trying to install one, I got a “Dave” laptop table from IKEA for $20 and am using that instead. I actually like this better since the table is adjustable, and while I'm planning to phase out the desk soon, the table will still be useful around the house. I'm also pretty stoked on how much desk space I freed up.

    DeskDesk and ChairDesk 2

    → 10:19 PM, Mar 13
  • The CueCat

    Brent Simmons — “Each Generation is Doomed to Reinvent the CueCat”:

    Here’s the thing about the CueCat: it wasn’t that the hardware sucked, it’s that people aren’t going to scan things to go to a web page.

    I've never heard of the Cue Cat, but the Wikipedia article is fascinating to me in that I'm pretty sure you could actually replace every instance of “Cue Cat” with “QR Code”, and it would still be pretty accurate. I'm yet to see any person in real life scanning a QR code even though I see them everywhere.

    → 4:18 PM, Mar 13
  • Putting Duck Duck Go in the Safari Search Bar

    Ever since Google started prioritizing Google+ in search results, I've been courting new search engines. I tried Bing, which was fine, but the aesthetics of it really weren't pleasing to me. More recently I've been using Duck Duck Go, and I like it pretty well. It has a more minimal look that I prefer, and the search results have so far been pretty good. I can access Duck Duck Go easily from within Alfred1, but I also use the search box in Safari a lot, which only has options for Google, Yahoo! and Bing. The suggestion I heard the most was to edit your hosts file in order to replace Yahoo! with Duck Duck Go, but that wasn't super appealing to me.

    The solution I liked a lot more was to install an app called Glims, which adds all sorts of functionality to your search bar as well as add other search engines. I'm running the latest version of Safari and it works great. I actually found out about it on Duck Duck Go's Safari support page, so I was surprised I hadn't seen it mentioned elsewhere.


    1. I made my Alfred shortcut ddg since it's easier to type than duck. ↩

    → 4:21 PM, Mar 12
  • Got My Tactile Pro

    UPS just dropped off the Matias Tactile Pro I ordered from OWC. I'm going to write a full post about it in a couple of days, but my initial impressions are:

    • Bigger and feels more solid than I thought imagined.
    • Not nearly as reminiscent of the Apple Pro Keyboard as I was afraid it would be.
    • It's going to take a day or two to get used to the different layout after using the Apple Wireless Keyboard for so long.
    • Even louder than I thought it would be.

    If nothing else — it seems fun. It really is kind of satisfying to get some tactile feedback when you hit a key.

    → 2:26 PM, Mar 12
  • Dyson DC35 Digital Slim Review

    I'm terrible at cleaning my house, especially vacuuming. I came to a realization that the only way for me to stay on top of this is to lower the friction as much as possible. Up until now I've had a a big bulky thing that I bought a while back. It has a filter that must be replaced and re-purchased every so often, is heavy enough to make me not want to bring it up or down stairs, loud enough I don't want to run it at night (I have attached neighbors) and dirty to clean. So the friction has been pretty high. My solution yesterday afternoon was to purchase a Dyson DC35 Digital Slim. I like it so much I decided to do something I normally wouldn't: write a review of a vacuum cleaner.

    Dyson DC35 Digital Slim

    The Digital Slim is a lightweight cordless vacuum by Dyson that can be held in one hand and can be used either as a handheld or floor vacuum (by removing or using the included aluminum tube) It doesn't seem to pick up any less (more, actually) than my old vacuum, and being cordless is means I can use it for the car as well. I also enjoy that it sort of looks like something from Doctor Who.

    The battery lasts for about 15 minutes (which is a lot longer than it sounds), and can be recharged in about three hours. One of the things I really wanted in a new vacuum was for it to not have a filter that had to be re-purchased occasionally; the filter in the DC35 pulls out easily, only needs to be rinsed once every four weeks, and never needs to be replaced. I was able to vacuum my entire house (about 1200 ft²) in that amount of time. I was also able to get into places I never could before, due to its size, the floor attachment being able to turn 90˚ and because it's easy bend down and extend the tube under things (e.g., the bed or couch).

    It might seem a bit expensive at $329, but I was tired of friction, dirt and things that didn't work well. I consider my time to valuable to waste on cheap appliances. It's light and easy enough to move around, so I feel no obstacle to taking 5 minutes to clean up, and my floors are cleaner for it. If you live in an apartment or moderate sized house it can definitely be used as your only vacuum and I recommend it for that. Buy it using one of the links in this article and I'll get a small referral fee from Amazon.

    → 7:27 PM, Mar 11
  • Mechanical Keyboard Decision Making

    Over the past couple of weeks I've been obsessing over getting a mechanical keyboard. Mechanical keyboards are "clickier," provide more tactile feedback and don't need to be fully pressed down to register a key. Most modern keyboards use rubber domes instead of mechanical key switches, which are cheaper and quieter, but pretty much worse in every other way. Because you don’t need to depress the keys as far to register a press, mechanical keyboards should theoretically cause less hand strain, and since most of what I do all day is type, anything that could make for a more enjoyable, less RSI inducing experience is worth looking into.

    Although I've been aware of mechanical keyboards for about four years, I never bought one because I'm not really old enough to have fond memories of the best mechanical keyboards from the past, like the Apple Extended and IBM Model M. Also they're not cheap.

    The two mechanical keyboards I've been considering are the Matias Tactile Pro, and the new Das Keyboard model with a Mac layout. I've considered the Tactile Pro before, but the second version didn't get the greatest reviews and had a really ugly sticker across the top of it. Version three has been out for a while, gotten good reviews, and did away with the branding on the keyboard. The Das Keyboard model I'm looking at is just now becoming available with a Mac layout, but has gotten good reviews in the past.

    The primary difference I've looked at between these two is the use of different key switches. The Matias uses a version of Alps simple white key switches (similar to the Apple Extended), where the Das uses MX Cherry Blue key switches (common in mechanical keyboards on the market today). Both types work differently, and so they give each keyboard a different feel when pressing keys.

    If you want to get a sense for what the Das Keyboard might be like, you can maybe find another keyboard that uses the same key switches at your local Best Buy, or other big box electronics retailer, branded as a gaming keyboard. The one that I found was the ridiculously named “Razer BlackWidow Ultimate,” which wasn’t on display but had a cut out where the arrow keys are to let you tap on. If you've never used a mechanical keyboard, it's worth doing just to get a feel for how much different they really are.

    In the end, I decided to order the Tactile Pro mostly because it was hard to find a keyboard I could try that used the same Alps key switches, so if I got the Das I'd still wonder about it and end up ordering both1). I've also heard good things about the Apple Extended keyboards, and it was on sale at OWC. I should get it soon, so I'll post my impressions once I've spent some time getting used to it.


    1. I'll still end up ordering both. ↩

    → 1:45 AM, Mar 10
  • Take Control of BBEdit

    The people at TidBITS have released the latest in their Take Control series of books — “Take Control of BBEdit,” and it's only $5. I haven't gotten into the content yet, but I skimmed over the chapter list and it looks good. BBEdit has become an essential part of my development and writing workflows. BBEdit is my primary writing environment, what I mostly used for creating this sites theme (and the Albina Development site), how I manage project documents, write scripts and probably some other stuff I'm forgetting. If you don't have BBEdit, I recommend grabbing the demo, and then getting this book.

    → 12:04 AM, Mar 10
  • Photos Edited Using iPhoto for iPad

    I edited a few pictures from the last few days using iPhoto for iPad and posted them to my Flickr. I took them using a Panasonic GF2, with a 20mm Panasonic lens. All of them looked slightly underexposed, especially the one of my guinea pig, and needed the white balance adjusted. The auto white balance feature using skin tones, or white points works great. This is one of the most impressive, and genuinely useful apps I've seen on the iPad yet.

    photo Mooby in Her Cage Coffee Cup

    → 8:22 PM, Mar 8
  • Immodest Predictions

    Gruber asks, “What would it take for the iPad 3 to be deemed an immodest update?”:

    But if a faster processor, more RAM, a double-the-resolution retina display, a better camera, and maybe even LTE networking make for a “modest” update, then what would it take for the iPad 3 to be deemed an immodest update? A fusion energy source? Teleportation? A camera that sees into the future?

    So with that, in mind my predictions are as follows:

    • Double as a multi-dimensional gateway, ala Sliders. I expect this feature to be released in beta, so like Sliders, it will lack the ability to choose your destination.
    • In the maybe category, a quantum leap accelerator. The part of Ziggy will be played by Siri.
    → 11:18 PM, Mar 6
  • Ownership

    Over the past week I've moved away completely from the template-based hosting service I was using, to creating by hand both a new site for my company, and a custom Wordpress theme for this blog. I created both in Coda and BBEdit using nothing but HTML and CSS1, which I needed to learn a lot more about to do what I wanted2. Neither site is the most sophisticated example of web site creation imaginable, but I'm very pleased with how far I've gotten in the amount of time I've spent.

    Previously I'd been using Squarespace for both sites. I would recommend Squarespace for anyone looking for that kind of template based system and isn't very comfortable mucking around in a text editor. I thought I might be that way when it comes to web sites for a while, but I'm really not. I love the opportunity to feel unencumbered in my creativity, and to learn new things, to much. The only technical problems I really had is that I wanted it to work better with MarsEdit and Markdown than it did.

    The real reason I switched was to own more of my sites, create them using the tools I want and understand what went into them.

    I think there's value in owning the things you make and not being afraid to get your hands dirty with something you're not yet comfortable with. You'll probably find out it's less intimidating than you imagined once you scratch the surface — creating a Wordpress theme, for example, was much easier than I thought it would be.

    I don't mean that everyone needs to literally create from scratch every part of what they make. When I say own, I mean taking responsibility for the things you put into the world and making them the best they can be. Every person should pick the level of dirty they need to get to feel ownership.

    I thought I wanted to be as hands off as possible when it came to my websites — and I was wrong — but for a lot of people using something like a Squarespace or Wordpress.com site is perfect and empowers them in a different way. I also could have rolled my own static blogging engine3, but didn't feel a strong enough desire to take things that direction. The thing that no one should be is afraid to challenge themselves or settle for a level of ownership below what makes them satisfied. After all, learning and creating new things is a lot of fun.


    1. I edited some PHP too, which was mostly just tweaking what was there already. ↩

    2. I wasn't starting from zero, but I did have to really grow my understanding of CSS. ↩

    3. Played a bit with creating a blog system using Python — and I still might go that direction eventually — but felt that Wordpress had some desirable benefits, and also allowed me to get off the ground quicker. ↩

    → 12:47 AM, Mar 6
  • Omni Sync Server Out of Beta

    The Omni Group:

    Today, I get to do something we’ve been looking forward to for a while now: announce that the Omni Sync Server is coming out of beta.

    I use OmniFocus every day to manage my personal and professional tasks. It's the only task management app I've been able to stick with and get more out of than I put into it.

    → 8:28 PM, Mar 5
  • New Blog Home

    I've moved this blog to a new host — so sorry if you saw repeats in the RSS feed.

    → 1:31 AM, Mar 5
  • On Creative Work Spaces

    Looking at this gallery of beautiful work spaces (via The Loop), my initial thought is actually — how much does this matter to anyone? I don’t mean to say that I don’t think some of them aren’t gorgeous, what I mean is that all of them look like places where people sit in chairs and stare at computer screens.

    The kinds of things that are appealing to me are having a private office, having enough room to move and having good snacks and coffee. I’m not sure a slide is one that even rates for me.

    → 11:41 AM, Mar 3
  • New Albina Development Site

    This week I finally decided to put together a new site for my company using just HTML, CSS and Photoshop. I’d been hosting it using Squarespace, but it felt like a really heavy solution for a static site. I also never felt as though I could get far enough away from it looking like a template — although I’m sure someone with more CSS skills could. Mostly though, the biggest reason is that I was never totally comfortable not owning every part of my site, and wanted the entire thing on my Mac.

    Since I haven’t made any web sites by hand in a long time, I learned a lot — I’m also sure I got some things wrong and will need to tweak it over time. I found that using Coda and BBEdit helped the whole thing come together pretty easily.

    Coda is great because the auto-complete works so well, and the CSS editor was really helpful. It’s also nice having everything in one app. The BBEdit features that helped the most were letting me keep all of my related files in a project and search globally across them.

    The one thing that really struck me with doing it this way was how much it’s similar to, but not like programming.

    → 11:42 PM, Mar 1
  • Preview Current BBEdit Document Using Marked

    I’m a big fan of Brett Terptra’s app Marked for showing Markdown previews while writing in another app. Since I’ve been using BBEdit more for writing Markdown, I’ve wanted a way to preview the current document without leaving the app, so I took a few minutes to write an AppleScript which does that. If you haven’t previously saved the document, you’ll be prompted to. Once the document’s on disk it’ll open up in Marked.

    Add it your [!~/Library or ~/Dropbox]/Application Support/BBEdit/Scripts/ to launch it from the scripts menu in BBedit, or using script launching app like Alfred or Launchbar.

    https://gist.github.com/1938323.js?file=BBedit-Preview-in-Marked.scpt

    → 11:14 PM, Feb 28
  • Closeby 1.0

    A new app I created called Closeby is now available on the App Store. It uses your address book to tell you how far you are from people you've saved addresses for. Closeby is great if you're visiting a town you don't live in, are stumbling home from a bar and need the closest couch to crash on (I take no responsibility for the damage this does to your personal relationships), or just want to see all your friends addresses on a map.

    → 4:19 PM, Feb 27
  • Logging NSData Containing String in the Debugger

    I'm trying to eliminate ever using log messages in my code for debugging. I'm sure a a lot of people already know this, but if you ever need to log an NSData you know contains a string in the debugger the command is:

    po (char *)[data bytes]

    → 4:02 PM, Feb 27
  • Other Developer Tools Location in Xcode 4.3

    Incase anyone else was wondering Instruments, FileMerge and the rest went in Xcode 4.3:

    Other developer tools

    → 2:39 PM, Feb 27
  • Archival Clothing Snapshots From Portland

    Archival Clothing:

    Snap views from last month's field trip up to PDX.

    The Archival Clothing folks took a trip to Portland and snapped some great photos while they were here. They even stopped by the coffee shop I used to live near.

    → 2:18 PM, Feb 27
  • 12 Million. Ever.

    parislemon:

    Across all the various OEMs that make Android tablets, 12 million have been sold in total. Ever. For context, Apple sold 15 million iPads last quarter.
    → 2:10 PM, Feb 27
  • Manton's Follow-Up on Sandboxing

    Manton Reece, on sandboxing for Mac apps:

    I'll admit I have some regret leaving the Mac App Store. It's just so convenient for purchasing and installation. If I'm going to make this work, I'll have to redesign my own rather clunky purchase and activation experience. And I'll have to do a much better job of marketing, something that has not been easy with Clipstart.

    I don't envy anyone who's facing this problem. I feel like Apple needs to rethink what they're trying to do with Sandboxing; giving developers more time is not the answer. The problem is that to many useful apps just aren't going to work with sandboxing, and others are going to need to compromise their users experience in order to accommodate it. I think of Apple has a company who puts the experience of their users first. Forcing apps to fit into a mold this restrictive is forcing them to implement work arounds for things that were never a design problem to begin with, or be left out of the biggest venue to get their app in front of the majority of users.

    → 4:08 AM, Feb 26
  • Xcode Build Script for Automatically Updating CFBundleVersion

    Since Git doesn’t create numeric build numbers, I haven’t known exactly what to do with my app’s bundle version (CFBundleVersion) since switching to it. According to Apple CFBundleVersion needs to be “a monotonically increased string, comprised of one or more period-separated integers.” My previous (bad) solution was to sort of ignore this and just update when I release a new version. Now that I’ve started using Hockey for beta relases, it requires a unique number for every build, so I need to start paying more attention to it. It’s for the best since it’s better to give this number some significance.

    I didn’t want to have to update this manually every time I send a beta build, so I started looking for an Xcode build script that could generate something like this for my ad hoc and App Store builds. Since I didn’t really like any of the code I saw, I decided to write my own using Python, and while I was at it set it to also commit and tag the build in Git.

    You can add this as a “Run Script” build phase in Xcode (make sure you set the shell to /usr/bin/python). The only line you should need to update is configurations_list = [‘Beta’, ‘App Store’] to be the names of the configurations you want this to run under. You’ll also need to set your CFBundleVersion to a start point that’s a whole number (0 for example). If you want this to work with a different SCM, just update the os.system lines to run the right commands for your system (or take them out all together if you don’t want that feature at all). For a configuration called App Store, I have the commit message set to be “Automated Commit For Build 25. Configuration: App Store.”, and the tag to be “AppStore_25”. You can change that if you like.

    Of course, I take no responsibility if anything bad happens to your project, but it seems to be working great for mine.

    Update: There’s a bug where this will cause simulator builds to fail if you don’t set your “Mac OS X Deployment Target” to 10.7 in your build settings.

    https://gist.github.com/1867148.js?file=ALBUpdateBundleVersion.py

    → 8:46 PM, Feb 20
  • Christa on Designing Piezo

    This post by Christa Mrgan on the evolution of Rogue Amoeba’s Piezo is awesome. Also love that it started life out as “Simple Audio Hijack”.

    → 6:14 PM, Feb 16
  • MacDrifter on Switching to BBEdit

    MacDrifter:

    It was worth the investment. I don’t mean just monetarily. I invested many hours into BBEdit and I’m sure there are many more to come. But it was worth it. I have an environment that I feel productive in.

    It’s been my default editor for a couple of months now, and I thought this was a really good in-depth post about the pros and cons of BBEdit.

    → 7:26 PM, Jan 30
  • Still Using Siri

    Marco Arment responding to Boris at The Next Web on Siri

    But I still use Siri. My wife still uses Siri. Last night at dinner, my friend used Siri. I don’t think Boris and his friends are a representative sample.

    Count me in as well. I use Siri all the time for setting timers, sending text messages and looking things up. A lot of times it’s just faster for me to talk than type. I’ve also seen nowhere near the 50% failure rate Marco reported. If I did, I’d probably use it a lot less.

    → 10:47 PM, Jan 28
  • Thunderbolt Audio Interfaces From Apogee and Universal Audio

    Apogee Symphony 64 Thunderbolt:

    The latest addition to the Symphony I/O module line-up, the 16x16 Analog I/O Module allows you to pack 32 channels of premium Apogee conversion into one Symphony I/O (two module spaces per chassis). No other audio interface delivers this much quality input and output or value in a single 2U rack space interface.

    Apogee is well known in audio recording, so this is really exciting if you’re into that. Universal Audio also announced a new Thunderbolt audio interface called Apollo that looks awesome for project studios. Even if you have no interest in high-end audio gear, if you’re a Mac user, it’s exciting to see device makers of this caliber start using Thunderbolt.

    (via The Loop)

    → 7:44 PM, Jan 20
  • xScope 3

    I’ve used xScope whenever I’ve done user interface work for the past couple of years, and it’s indispensable. My favorite new part of xScope 3 is that it shows more of the info I want for iOS and Mac development (colors especially), without any conversion. The new iOS-centric templates in the Screens view look really useful also. If buy now you can get xScope on the Mac App Store for only $19.99.

    → 7:16 PM, Jan 20
  • Slender for Mac and iOS Developers

    My friend Kyle Richter has released his new app, Slender. It’s a simple and attractive way for iOS and Mac developers to figure out things like which images in your app are unused, or are missing their 1x or 2x sized counterpart. It’s only $4.99 on the Mac App Store, and I can already tell I’m going to use it on every app I write in the future.

    → 6:37 PM, Jan 17
  • 360|MacDev 2012

    360|MacDev is in a few weeks, and if you write — or want to write — Mac software, you should be going. You may be more familiar with John’s other conference, 360iDev. These conferences are at the top of a short list of ones I never miss. John and Nicole work hard to get great speakers, make sure everything goes smoothly and create an amazing environment. I’m pretty sure they’re they’re the hardest working people in the conference business.

    I’ll be giving a talk on making apps work better and be faster by using Core Data, GCD and using good app design. I’m also looking forward to the other talks: Brent Simmons is going to teach the secrets of creating successful Mac apps, Dave Wiskus will bring us inside the brain of a good designer, Kyle Richter will get all of the iOS developers up to speed and Mike Lee will once again do something amazing that I can never predict until it happens.

    So join us in beautiful Denver Colorado, February 3rd & 4th — it’s a crazy amount of content for only $300. Register now if you haven’t already.

    → 7:31 PM, Jan 15
  • Why Brent is Trying Bing

    It wasn’t the crap, it was losing trust:

    Running a search at Google was starting to feel like walking through a minefield. I’ve trained myself to be careful where I click, because I might step on a +1 explosive or get blown to bits by surprise double-chevrons.

    But I still used Google search, because I trusted the search. Now I don’t.

    For any company, users trust is a hard thing to gain, and once lost nearly impossible to get back. I think if you’re a company who has it, you should do everything you can to keep it, and never assume your users have nowhere else to go.

    → 12:32 PM, Jan 13
  • Five Years Ago in San Francisco

    Five years ago today, Apple announced the iPhone. I was living with my girlfriend at the time in Sacramento, and I was home from work before her. When she walked in, I already had the video ready on the Mac Mini I’d just bought her for Christmas.

    I remember exactly what I said when she walked in the door:

    “Do you want to see the most amazing fucking thing you’ve ever seen in your life?”

    → 11:42 PM, Jan 10
  • Learn and Work Hard

    The Mac App Store turned one a couple of days ago, and it’s gotten me thinking about the past few years, where I am now, and where I want to be next. I’ve also been thinking about the path that led me to obsession with the Mac, later iOS, and eventually getting to make things for both.

    The announcement of the iPhone SDK was, for me, what I imagine the original Macintosh was for people a generation older — huge. For me everything changed, because it let me start a career doing something I love. But before I could get a job making iOS apps — before there were iOS apps — I’d already been absorbing and obsessing over everything I could about Mac development. By 2008 I wanted nothing more than to be a Mac developer.

    In high school (and a while after), I was more interested in practicing with my band than teaching myself C[1]. When the band broke up a few years later, I ended up the same place as many early twenties wannabe rockstars before me: Guitar Center. Even though I quickly learned to dislike the job[2], it’s lucky I was there, because it spurred my interest in Apple and the Mac. As part of the “Pro Audio” department, my work days were spent around other recording nerds — a generally Mac-oriented group. I started meeting people who loved their Macs, recorded using Logic, and were eager to talk about both. Within a few months I’d saved up and bought a used G5 tower.

    Always a nerd, I started looking at what software was out there for my new Mac. I became enamored of apps like NetNewsWire, Delicious Library and Transmit. Maybe I’m coloring the past, but I feel like the sense came early of these not being just made, but crafted — the same way a great song or album was. Small groups of people — maybe one — had put time into thinking things through to make something great. It was the first time I knew software could be that way, that it could be made by one person who really cared — and that if I worked really hard, I could probably do it too.

    As I got into learning Mac development, I found things like Late Night Cocoa (also just getting started), and got to hear indie developers talk about what they do. It didn’t seem to matter where someone came from if they could make cool things, and that was hugely inspiring to me. I didn’t know exactly what it would take, but I became progressively more driven to keep learning and eventually become an indie developer myself. No one could tell me “no,” I just had to learn and work hard.

    The iPhone SDK was the opportunity I needed. I got a job shortly after it was announced, and became focused on iPhone apps. I still wanted to write for the Mac too, but since the places I was working were mostly interested in iOS apps, I didn’t know when that would happen. That interest came with the release of the Mac App Store, and this year I’ve gotten to work on awesome Mac apps in addition to ones for iOS. It makes me happy that the thing I got so excited about in the first place has continued to grow and thrive, and even more that I’ve had a chance to be a small part of it.


    1. I was still a pretty big nerd, and played around with programming on and off since I was young.  ↩

    2. At one Guitar Center staff meeting, our store manager told us about how he always wanted to be an artist or musician, but chose the less-risky life of retail management instead. He was very clear in saying that it’s better to not take chances, and that it was a lesson we should all remember. I’ve tried my best to remember to follow the exact opposite of that advice.  ↩

    → 5:18 AM, Jan 9
  • Coding Isn't Necessary, But It's Good to Know

    I’ve been talking with friends and reading blog posts in the past few days over the idea of more people learning to code. The discussion was inspired by Code Year, a new online course created to help people learn programming. At the time of writing this, nearly a hundred and fifty-thousand people have signed up. Daniel Jalkut equated learning to code to literacy, as a basic skill that people will need in the future. Guy English disagreed with that, saying that coding is not the new literacy, but instead the new “tinkering with the engine, the new re-wiring the house.”

    I agree and disagree with both for different reasons, I disagree primarily in that I think both positions are more extreme than I see it. On one side there’s an implication that everyone should learn to code, and that anyone who doesn’t may be left behind by society. On the other it seems that creating software is only for extreme tweakers, and that most people will find nothing of value. Both posts are well written and insightful, so please read both incase I’ve misrepresented either point of view in any way.

    I think there’s a value in learning to code that does not equate to creating something as complex as web sites or apps. I also don’t think it’s as basic a skill as reading and writing, one that if you don’t learn will cripple your opportunities in life. Learning to write small scripts to automate tasks and control your computer can bring value — and possibly enjoyment – to a lot of peoples who are never going to write anything bigger than that.

    So, instead, maybe learning to code is the new sewing your own buttons back on, or changing a tire on your car. Or, maybe it’s the new learning a musical instrument – there’s a lot of people who get a lot of enjoyment out of playing an instrument who are not artists, and will never develop mastery level skills. It still improves their lives.

    In fact – maybe coding isn’t the new anything — maybe it’s just a good thing to know if you have time and interest to learn it.

    → 7:18 PM, Jan 6
  • Article On Portland Coffee Culture And Home Brewing

    Willamette Weekly:

    Why is Portland, of all places, the capital of American coffee culture? There’s no overt explanation why a city celebrated for its slacker attitude also devotes so much energy to the roasting and consumption of high-grade joe.

    A pretty good article from last April that I just read. Talks a lot about coffee culture in Portland, and why the pour-over has taken over in good coffee shops where $10,000 machines that were the standard a few years ago. Towards the end it gets into a few methods for home brewing, although notably leaves out describing the Chemex, or any of the single-cup pour-over methods it spends the first part of the article talking about.

    → 5:25 AM, Jan 6
  • Essential Tools 2011

    After reading Justin’s list of his favorite tools for power users and developers, I started to think about some of my own. Of course since Justin has great taste, and we use a lot of the same things, it’s going to make ripping him off directly and playing dumb later much easier[1].

    Non-Software

    • 13" MacBook Air
      I was using a late 2008 MacBook Pro, and as soon as the current generation came out I bought one. It immediately became my main development machine. It feels crazy fast, light enough to take places and small enough to open on an airplane. It’s my favorite Mac I’ve had so far.
    • Archival Clothing Flap Musette (Laptop / iPad Bag)
      I don’t care if you call it a man purse[2], I take this thing everywhere. I use it as an iPad or laptop bag and it’s been perfect for that. It’s small and rugged, but big enough to stuff a power cable, Field Notes book, and a copy of the New Yorker in. Plus it’s made locally.
    • Chemex Coffee Maker
      Most developers I know enjoy coffee, and I think if you’re going to do anything you should do it the best you can. The Chemex is my daily driver for coffee making. It’s a pourover type that easily makes enough for two people, is extremely easy to clean and makes great tasting coffee.

    Mac Apps

    • OmniFocus for Mac
      I live in OmniFocus, and keep as much of my life in it as I can. The reason I think it works for me where other apps haven’t, is that it doesn’t enforce a specific workflow so much as provide a foundation to create your own. I’m not sure everyone needs that much flexibility, but I choose to use it because I know it’ll scale to whatever my needs are.
    • NetNewsWire
      I’ve gone back and forth with RSS readers this year, but came back to NetNewsWire on the Mac because it shows me what I want to see so I can get through a backlog of feeds quickly.
    • Byword
      A simple and attractive text editor which makes writing in Markdown even easier by being aware of Markdown syntax, and providing key commands for the most common Markdown functions.
    • Marked
      The primary use of Marked is as a Markdown preview app to compliment whatever text editor you’re writing in. It didn’t sound like something I needed, until I started using it. Now I keep it open next to Byword or BBEdit whenever I’m writing anything of length.
    • 1Password for Mac
      Because I let 1Password generate and store all of my passwords, I never worry about password related security on the web. It’s the only app I feel like I need to have set up before I can start using a new Mac.
    • BBEdit
      I use it as a scratchpad for Objective-C, writing longer things in other languages, and for reformatting things like JSON to be more readable using text filters. I also use BBDiff a lot of the time when I have a complex merge of two source files to do.
    • Kaleidoscope
      It turns out that I do have a use for a really good file comparison app that doesn’t do merging (although I’d love to see that feature). It’s my favorite tool for checking what I’ve changed before making a commit.
    • Acorn
      I’ve been using it since 1.0 and it’s still the most Mac-like image editor.
    • GitHub for Mac
      The only Git client I’ve found to have any use for me, because it doesn’t try to replace the command line. Instead it just makes the things that suck the most on the command line easier.
    • Alfred I just started using this, after using Launchbar. The script launching and search filters are the two best features for me. I use search filters for things like only searching source code and related files.

    iOS Apps

    • OmniFocus for iOS
      Having these apps is a really big part of what makes my whole task management system work. They give me the ability to review and capture tasks wherever I am.
    • Elements
      I use it to make all of the notes I take on my Mac accessible on the go. One cool use for me has been creating a big travel document using Markdown on my Mac that gets synced automatically to Elements. By doing it this way I have the document backed up in at least three (Mac, Dropbox, Elements) places, so it’s unlikely I’ll end up stranded.
    • 1Password for iOS
      Another great Mac app that would be useless to me without a mobile companion that works.

    Services

    • Squarespace
      I host my company site, and this blog on Squarespace. I haven’t run into any show stopping drawbacks, and they make hosting a nice looking site really easy. It costs a little more than some other options, but I don’t worry about reliability and have to do a lot less tweaking to get things acceptable.
    • Dropbox
      Anything that I don’t want to lose goes in Dropbox. It also makes getting things done on the iPad feasable for me.
    • TestFlight
      Managing a beta for an iOS app before TestFlight was a nightmare. Now it’s easy.
    • Instapaper
      Using Instapaper lets me manage my time attention better than I could without it. I’m able to read a lot more longform articles than I was before by scheduling time for it.

    1. That was a joke.  ↩

    2. That’s a lie, I get crazy touchy about it.  ↩

    → 6:30 AM, Jan 4
  • Woody Guthrie's New Years Rulin's

    Thirty-three “New Years Rulin’s” from Woody Guthrie’s journal on January 31st 1942. It’s hard to pick my favorites (the entire list is great). I really like number one: “Work More And Better”, and number three: “Wash Teeth If Any.”

    → 4:32 PM, Jan 3
  • Brewing Coffee With Zero Electricity

    Marco Arment had a post earlier about making coffee when your house’s electricity is out. I wholeheartedly agree with his instructions for what a normal person should do in this situation (drive to to the nearest Starbucks and enjoy).

    The other set of instructions were for what an “impatient, geeky, coffee snob” should do:

    1. Light the gas stove with a match.
    2. Boil water in the Helvetica Kettle.
    3. Plug the coffee grinder into the APC UPS that still has some power left, turn it on, grind the coffee, then turn it off to conserve its power.
    4. Realize you had the wrong grind size, dump those grounds, fix the grind setting, turn the UPS on again, and grind the coffee properly.
    5. Brew with AeroPress.

    That’s fine for a normal coffee snob, but what if you’re a real asshole with more coffee equipment than sense? I’ve added my own instructions for just this use case:

    1. See Marco’s instructions.
    2. Boil water in your Hario Coffee Drip Kettle
    3. Get a work out while grinding coffee using your hand grinder. This implies you’ve considered the possibility of needing to grind coffee if the power goes out, and bought one of these for emergencies. But that’s just common sense.
    4. Brew coffee with Chemex.

    → 1:39 AM, Dec 29
  • GTD Wagons and Dirty Dishes

    Part of using GTD is falling off the wagon. Everyone gets overwhelmed and lets their system linger a bit sometimes. If you keep up on some of the regular maintenance though, it’ll happen less often and when it does getting back on won’t be so hard. Just like a sink of dirty dishes tends to stay full, too many inbox items, or stalled projects, and you don’t even want to look at it. Unfortunately, just like the dishes it only gets worse if you ignore it.

    As soon as you start letting items sit for days or weeks in your inbox, you’re doing more harm than good. By capturing items into a system you’re letting rot, you might trick yourself into thinking you’re staying on top of things when you’re really just letting them fester in inbox purgatory. It’s like if you let the dishes sit until they molded. You already know the solution, and you’ve probably even made attempts to do in the past: process everyday.

    I have a potentially unnatural love of coffee, and I never forget to make it, regardless of what’s going on. Processing my inbox, however, happens all the time. Force yourself to turn processing your inbox is as much a habit as morning coffee, and there’s no way for it to get out of hand so much you’re scared to look at it. That doesn’t mean it’s easy, but I think with work it can become easy.

    The other time I get panic attacks when opening OmniFocus is when I’ve got stalled projects. Your GTD system is an evolving one, and it needs constant care and feeding. Letting projects sit with no path or intention for completion adds a lot of friction when looking for something to do. Reviewing your projects often (OmniFocus for iPad is great for this), getting rid of dead projects and redefining ones that are important to you is important for friction-free productivity, and I think one of the things people neglect doing the most.

    Sometimes figuring out why a project has stalled can be pretty hard. There’s probably a lot of things I think I’d like to do that realistically I either don’t care enough about, or don’t have the time for. I think it takes honesty with yourself, practice to recognize what you will and won’t do, and ruthlessness to kill anything that’s just cluttering things up. I think deconstructing projects with no action steps to the point where you can work on it also takes a lot of progress. And – like most things worth doing – I think it takes doing it a lot to master.

    The one thing your system needs to be is trustworthy. It’s okay to fall off the wagon, but you need to do your part to try and hold on if you’re going to build trust.

    → 7:23 PM, Dec 28
  • Hope You Got a Good One

    The Verge:

    Samsung has just distributed the worst news of this Ice Cream Sandwich upgrade cycle: the popular Galaxy S smartphone that sold 10 million units last year and the 7-inch Galaxy Tab tablet won't be upgraded to Android 4.0.

    The Galaxy S is a premier Android device that was released less than a year and a half ago, is still on sale and won’t even get an upgrade to the next major OS release because of the “experience enhancing” crapware that Samsung installs on their devices. This reminds me of the post that went around that detailed the terrible track record of Android upgrades.

    One of the reasons I prefer iOS – and Apple products in general – is because Apple is the only device maker who doesn’t consider their relationship with you to be over once they have your money. I see no evidence from carriers, or from Android device makers to contradict that, and plenty that supports it.

    I tell people who ask me about buying an Android device that if they do, they better hope the OS version they got was a good one because they’re probably never going to see another. I don’t know if Android is winning, but I’m certain that the people who buy these things are not.

    → 6:28 PM, Dec 24
  • Kindle Fire First Impressions

    I finally got to put my hands on a Kindle Fire today. I only used it in a store for a few minutes, but my immediate impression was that it wasn’t as awful as I’d expected, but that I couldn’t imagine buying one to use.

    Immediate takeaways:

    • I’ve seen 7” tablets before, but it still seems crazy small. Why is the tendency in the non-iOS world towards huge phones and tiny tablets? Is this something consumers want or is it something they’re being given?
    • It took 2-4 touches for most things on the home screen to register correctly.
    • The carousel is a terrible UI metaphor for finding anything. I can’t imagine it being the main way I interact with the device and not being frustrated.
    • It would be better to have not shipped magazine reading as a feature than to have it the way it is.
    • Miscellaneous visual glitches were frequent.

    I also noticed some positive things:

    • It seemed totally acceptable for playing the preloaded games. Cut The Rope seemed about the same as on iOS.
    • Although tapping on the home screen was pretty non-responsive, swiping around the carousel was OK lagginess-wise. Better than I expected for sure.
    • From a purely visual standpoint, the software and the device both weren’t as ugly as other Android based things I’ve tried. That has nothing, however, to do with actually using it.

    → 2:34 AM, Dec 23
  • Justin William's Developer and Power User Tool List

    Justin Williams:

    This is the third installment of my must have must have list of tools and utilities as a Mac and iOS developer. A lot can change in twelve months when you work in the technology space. The biggest change for developers in the past twelve months is the completed transition from Xcode 3 to 4 and from iOS 4 to 5. Oh, there may have been a new version of Mac OS X thrown in there for good measure too.

    Great list. I own and use almost all of the apps that Justin mentions.

    → 3:37 PM, Dec 20
  • RSS Folders Followup

    I posted a couple of weeks ago about getting rid of my somewhat arbitrary RSS folder setup in favor of using no folders at all. As it turns out – for my needs – using no folders vs. organizing everything has made no difference all. I'm not missing anything I was getting to before, or annoyed by any difference in the order I read things in.

    It makes me wonder what other systems I may have built up for myself that are really just me creating arbitrary labels instead of providing value. GTD contexts seem like low hanging fruit to look at next. For example, I'm starting to doubt the wisdom of dividing to-do items into categories like what app I'd be using, and tying them a bit more closely to physical opportunities and limitations.

    → 4:09 PM, Dec 15
  • Microsoft's iOS Apps

    Microsoft releasing what looks like a pretty cool game, as well as the other stuff they've been releasing for iOS makes me wonder what they could do if they put a really great product person in charge.

    → 4:12 PM, Dec 14
  • CocoaConf Address Book Slides

    Here's the slides from my address book talk at CocoaConf two weeks ago. Hopefully you'll find something helpful if you're working with this.

    → 3:55 PM, Dec 14
  • Goodbye, RSS Folders

    Although I'd add or subtract every once in a while, I've had my folders in Google Reader pretty much the same for the last couple of years (Tech, Developer Blogs, News, etc). It's worked pretty well on the whole. I've often had the problem when adding new feeds, however, that if they don't easily fit into one of my existing folders I don't usually really want to further complicate the existing taxonomy with more folders.

    I started wondering if it was improving anything at all. As an experiment I went into NetNewsWire and blew them all away, moving all of my existing feeds into the same place. Turns out it doesn't make anything any slower and now I don't worry about where to put things. The lesson for me is that, once again: less is more and simple usually wins.

    I may end up experimenting with something based more on how I read than content categories in the future (e.g. Favorites), but I want to live with this for a while first.

    → 12:00 PM, Nov 23
  • Simple Is the Greatest Kind of Empowerment

    My mom is not technical. When someone makes reference to normal people not understanding things like the filesystem, they’re talking about my mom. She also loves the iPad I bought her last year and uses it constantly. It’s the first time I’ve seen her excited about technology at all. It’s even empowered her to speak intelligently about things like Apple, Steve Jobs and the significance of what they’ve done with technology, which I never would have expected.

    Richard Stallman considers the iPad a jail and the people who would use such a product fools:

    Steve Jobs, the pioneer of the computer as a jail made cool, designed to sever fools from their freedom, has died.

    This statement is a bit old, but since I read it a few weeks ago I’ve been thinking about it a lot. Besides being callous, insensitive and demonstrating Stallman’s clear lack of social graces, it’s just flat wrong. My mom doesn’t consider the iPad a jail, she considers it empowering. So do a lot of other people.

    Not having to be a computer expert to derive value has always been the spirit of the Macintosh, and the iPad is the culmination of the philosophy of a volks-computer. Simple is the greatest kind of empowerment.

    → 7:40 PM, Nov 16
  • Stumptown Brewing Guide

    <

    p>

    <

    p>If you’re interested in making better coffee at home, the Stumptown Brewing Guide is a great place to start. My two most used brewing methods – Chemex and Beehouse – are both there.

    → 11:38 PM, Nov 13
  • Five Thousand Things

    Fortune quoting Steve Jobs from the lost Cringely interview:

    Designing a product is keeping five thousand things in your brain and fitting them all together in new and different ways to get what you want. And every day you discover something new that is a new problem or a new opportunity to fit these things together a little differently.

    Anyone looking to contract out software development should read this article. Not having a clear vision of what done will look like, and thinking that having the kernel of an idea is enough is delusional. Smart people know that implementation is 99% of what makes anything great.

    → 9:19 PM, Nov 13
  • 360|MacDev 2012

    I’m very excited to be speaking at 360|MacDev this year Feb 3rd & 4th. This is going to be my first 360|MacDev, but I’ve spoken at 360|iDev every time and it’s become my favorite conference.

    I’m right after Brent’s keynote, so no pressure or anything.

    → 3:19 PM, Nov 8
  • Delayed Execution of Blocks

    If you want to delay execution of block for a set number of seconds, you can use dispatch_after() in the following way to perform delayed actions in any queue you like. In the example below 3 is the number of seconds we want to delay by.

    dispatch_after( dispatch_time( DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC ),
    dispatch_get_current_queue(),^{ /* Your code goes here. */ } );
    

    The dispatch_time() function takes dispatch_time_t as it's first argument (typedef of uint64_t) which represents from when the delay is, and the number of nanoseconds past then until the block should be executed as it's second argument.

    You can use this a more flexible version of -[NSObject performSelector:withObject:afterDelay:] by passing dispatch_get_current_queue(), or if you want to use it across threads, by passing a different queue such as the main (dispatch_get_main_queue()) or a global queue( dispatch_get_global_queue()).

    → 4:32 PM, Oct 18
  • Procrastination Contexts

    If you’re using GTD, you know what a context is; and if you’re a human being you probably know about procrastination. One of the goals of GTD is to develop a system in which if we don’t let ourselves procrastinate, or if we do we’re honest with ourselves about why. Whenver you’re staring at a todo item with no clue where to start, GTD can give you you the tools to analyze why you’re not doing it. If a task isn’t actionable it’s usually going to fall into one of three categories: needs to be broken down further, there’s not enough time or attention available right now, or the context you need to complete it isn’t available.

    Of these three, context is the slipperiest and gives the most opportunity to trick ourselves into thinking we can’t do something when just don’t want to. If you’re someone who works on a computer and maybe fills a lot of roles (like a developer or designer), the context you need to get a lot of your work done might at first glance be “Computer.” Shit. This is a problem. Everything is in one context now and you’re trying to force yourself to hop between multiple mental states as you work through your todo items. I mean – you’re still @computer, right?. But you live in the digital age and your work has as much to do with mental state as any external factors – so obviously the solution is to create contexts based mental states instead of ones based on a person, place, or thing. Now you’re ready to start working.

    Instead of unlocking the power of stress free productivity, however, you find yourself still not getting as much done as you’d like and falling behind on important tasks. You’re still procrastinating. What the fuck?

    To understand why this happens, there are two things to consider. The first one is, “What about basing contexts on mental state creates opportunity for procrastination?” The second is how else we can solve the problem of the catch all context.

    Why and How We Procrastinate

    If I’ve narrowed down a project into atomic actionable tasks, defined realistic time barriers to complete that project, and I’m still not doing much, what’s the holdup? For me the holdup is that I rarely procrastinate on something based on physical restrictions, and I never procrastinate on doing something I want to do. I procrastinate because I don’t want to work on a specific thing, and I am inherently lazy.

    This isn’t anything to be ashamed of, humans are all lazy. We’d all rather be playing than working, and most of us work so that we can play. But everyone still has things they need to get done, and some of them aren’t going to feel like play. So if one reason why we procrastinate is that we don’t want to do something, basing GTD conxexts on mental state gives us opportunity to fuel how we procrastinate – with excuses. I’m never going to feel like doing something I hate, and if I leave everything up to my current state of mind I’ll always have the excuse of not being in the right one. If you hate doing bookkeeping, you’re never going to be in that state of mind. You have to force yourself.

    The primitive part of our brain is great at tricking us into avoiding work and doing things that are bad for us. If it were up to that part of our brain we’d eat nothing but candy and pizza for every meal. But not all tasks are junk food, and finding time for the ones that aren’t is important. We’ve got need to eliminate the opportunity for that part of our brain to do our thinking. A context needs to be a person, place, or thing. Almost anything else is a procrastination context.

    The problem we have now is the same one we started with: having one context which holds most of what we need to get done. The reason something like @computer is a procrastination context to begin with is that it’s not really a context, it’s a super context. Nothing should be added to it directly, and it should have a lot of children to choose from. Switching between one kind task and another on a computer are really different things. Rather than mental state a better way to solve the problem is to break down the same way you’d break down a project. Break down until it make senses sense and you’re left with no reason not start doing things.

    For someone who’s a software developer like me, it might be something like this:

    • Computer
      • Apps
        • OmniFocus
        • OmniGraffle
        • Xcode
        • Keynote
      • Online
        • Email
        • Basecamp
        • Freshbooks

    I try to break down this list as much as possible whenever I can. Mines actually a lot more extensive than this. the point is to assign tasks to the atomic context which contains the bare minimum to make it happen. There may be some Xcode tasks that I want to do and some I don’t, but the tool to do them is the same. Once I’ve started one Xcode task I can do all of them while at that context before moving on. Even the ones I don’t want to. The point of this for me is that most of my mental states are still mappable to a person, place, or thing. By breaking down contexts to this level I’m able to help the procrastination problem by eliminating any context which can potentially become an excuse.

    At least until I come up with more creative excuses.

    → 6:32 PM, Oct 12
  • Steve Jobs, Fear, and Trying

    I’m scared to write. I’m often scared to write, anyway, but about Steve Jobs dying I’m terrified. I’ve had this feeling since it happened that there was no way anything I could say will not be good enough to capture the weight of things, or even just my feelings about it. I also knew as I found out that if I let that fear control me and said nothing, I’d be upset with myself. So I’ve waited. I’ve waited now to the point where everyone else who had something to say about it probably has. And now I’m going to say the same things that a lot of other people who feel the same way as me have, because I need to say something before I’ve waited entirely too long and let a new fear take over.

    Steve is someone who directly changed my life by deciding to change the world and following through with it. No one was counting on me to do much, and by the time I decided to teach myself to write Mac software I hadn’t done a lot to prove anyone wrong. I can’t even really give a specific reason why it stuck and I kept trying, but it did. I put as much of myself into learning this one thing as I could, and eventually turned it into a job. I’ve been doing it as my only job since 2008 and have been a part of making things that I’m insanely proud of. As of a month ago I’m running my own business, and proud of that. This is really a long winded way to say that Steve’s contributions the world gave me a platform to – and I hope continue to – make my own contributions that I can be proud of.

    I don’t know what I’d be doing right now if there had been no Steve, but I don’t think it would be this, and I can’t imagine it being something that’s allowed to meet people who I feel like I belong with and who are equally passionate about something I’m obsessed with. Steve was right when he talked about understanding mortality in the Stanford address everyone quoted last week. It’s something I think a lot about, although I’d forgotten that he had said it until people started quoting him.

    My own crude version of the same idea – which I’ve repeated several times before – is this: We’re all going to be dead someday soon, and we have a very limited timeframe before to do something amazing – so you need to kick as much ass as possible while you can.

    My friend Mike had the perfect addition:

    "And once you're gone the only thing left behind will be the asses you kicked."
    

    Steve Jobs kicked a lot of asses, and was a personal hero to me. I worry a lot about not being good enough, smart enough, talented enough – even to write on my own blog. Steve is one of the people who inspired me to stop being scared and to try my best by doing amazing things and never accepting good enough as that. It’s that inspiration that has made me think – sometimes – that I might actually be good enough.

    I’m sad I’ll never get to tell that him in person.

    → 1:04 AM, Oct 10
  • RSS
  • JSON Feed
  • Micro.blog