← Home Subscribe Replies Archive Reading Also on Micro.blog
  • 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
  • RSS
  • JSON Feed
  • Micro.blog