← Home Subscribe Replies Archive Reading Also on Micro.blog
  • Updating an iOS 6 App

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

    A few thoughts about the process:

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

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

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

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

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

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

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

    The Jefferies Project

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

    [youtube www.youtube.com/watch

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

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

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

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

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

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

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

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

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

    And here’s a screenshot:

    move_apps_from_downloads

    → 11:33 AM, Sep 4
  • Ninety Days

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

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

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

    → 5:34 PM, Aug 4
  • Alamofire

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

    → 5:14 PM, Aug 4
  • Swift Optionals

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

    Matt Bridges:

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

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

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

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

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

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

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

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

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

    The main points are that he:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    That method could then talk to the context object however it needs to in order to get stuff done. Is this a terrible idea? I’d probably go for calling the context class something else, except I think it’d be a good place to store stuff that is actual contextual to how I’m talking to the service (maybe a currentUser property).

    → 4:05 PM, May 5
  • WWDC 2014

    I will be at WWDC this year. I’ll also be in SF before and after. If you’re going to be in town and want to get together, get in touch.

    → 10:29 PM, May 4
  • Web Hosting for Developers

    Marco thinks we should all suck it up and learn basic Linux server administration, and that a lot of people are going to get burned by highly abstracted solutions like Heroku and Azure:

    There’s a learning curve and necessary integration work for every back-end option, from iCloud and Dropbox to your own colocated servers. AWS, Azure, Heroku, App Engine, Parse, and similar services aren’t free, easy, or automatic. (Neither is “scaling” with them, regardless of what you’ve heard.) Hosted infrastructure is like sync: it has a minimum, unavoidable level of complexity to accommodate. You can’t just check a box or set a BOOL and have it all taken care of for you.

    We definitely had the experience at my old company of – even at our pretty small scale – not being able to get what we needed out of it and it getting prohibitively expensive. Marco would definitely know, so I’m inclined to listen to his advice. I’ve been leaning towards hosting my band app on WebFaction with Django instead of Azure, although not due to costs or because I think it’ll be a problem for me to scale, but because Django seems like a better fit for the specific thing I want to do. Maybe I should go all the way and put it on Linode?

    Read Marco’s original post.

    → 3:16 PM, Apr 29
  • WorldWideWeb Source

    It’s less nuts to me how much different the source code for Tim Berner Lee’s WorldWideWeb than modern Objective-C than it is how little has actually changed in the past thirteen years. I don’t think it would be any issue for me if I was asked to start fixing bugs in this today.

    → 4:06 PM, Apr 28
  • The Record Season 1

    On Saturday I used the ten hour drive from Portland to San Francisco to listen to all of the first season of The Record by Brent Simmons and Chris Parrish. This seasons topic was “Seattle Before the iPhone.” Since I started learning Cocoa about a year before the iPhone SDK became a thing a lot of the people that they interview are people who I looked up to, and later became friends with, and read the blogs of before I actually knew how I was going to make this into a career, so I think I’m what you’d call the core demographic.

    You should check it out. The whole thing is fantastic.

    → 3:56 PM, Apr 28
  • Band App Diary #3: More Thoughts on the Feed

    Continued from this post.

    My first thought is that it seems like I should be able to generate an RSS feed pretty easily. Maybe I should be looking to what gets RSS feeds contain as guidance for what I return from the feed endpoint.

    My second thought is that a completely different approach would be to – instead of returning an array with a bunch of feed item dictionaries created on the server – return a JSON dictionary containing arrays for each item type (songs, shows, videos) and have the logic to display and sort them in the client. That would certainly make the server code simpler. The client could have a sync object that posts a notification when it starts and stops, and then I’d just do a Core Data fetch of all the different types and mash them together into an NSArray in the feed controller.

    I’ll still keep it as one API endpoint (instead of calling shows, then songs, etc) since Azure charges me something per API call, it’s the same number of database calls, and it’s easier for dealing with when sync starts and ends on the client.

    The reason this appeals to me is that I fear each of the different item types will end up being different enough that I won’t really save that much code on the client by trying to normalize feed items on the server. It feels like it could become kind of restrictive later. It should also make caching easier since it means I can have a one to one match between my server and client data model instead of needing the sort of imaginary “feed item” objects. The last benefit I can think of is that it saves me from having to make another API call every time I want to show a detail item.

    The downside is that the RSS feed now would be extra code if I wanted to do that. Not much extra code though, and I was only really thinking of doing it because it seemed like kind of a freebie.

    I think I’ll do this unless someone gives me a good reason why I shouldn’t.

    → 7:34 PM, Apr 22
  • Band App Diary #2: Database to Feed List

    Since I’ve decided on going with a single feed list that’s going to represent all of the different kinds of band content that might get produced, I’ve been thinking about how to represent that in a database and how I’m going to generate the JSON the iOS app needs. I’m using a database instead of something like MongoDB because I understand databases fairly well, and because I’ve decided to use Azure Mobile Services for the server, and using MSSQL is the most straight forward option for that. I think I could probably get by deploying and hosting the app myself somewhere else, and for a future project I might do that, but the way I’m viewing Mobile Services is as a really nice front end for creating a Node app where I don’t have to think about server stuff at all. At this point it’s better if I can just focus on writing code.

    So, getting back to the database, some of the things I need to represent are:

    • Shows
    • Songs
    • Videos
    • Social
      • Instagram
      • Twitter
      • Facebook

    There’s probably more I’m forgetting, but that’s a pretty good start. The first way that I thought to represent all of the different feed item types was to have a big items table that would have the information for a feed item with an type ID, but that doesn’t work, because each of these things could actually be significantly different (a show song won’t have a lat/lon or venue name, but a show will).

    The shows and songs tables might be have some columns like this:

    • Shows
      • unique_id
      • venue_name
      • lat
      • lon
      • date_time
      • duration
      • city
      • description
    • Songs
      • unique_id
      • media_url
      • title
      • description
      • post_date

    I’m leaving some things out, but they aren’t really critical right now for what I’m trying to get at. What I want to do is get all of the different feed item types and serve them up as JSON via one API endpoint to my iOS app. In order to keep things simple, I think the best way to do that is to when the endpoint is called fetch each of my feed item types, loop through each and create an object for each with the information that’s needed to display them in the feed, add them all to an array and return that. The properties could be things like:

    • unique_id
    • title
    • description
    • thumbnail
    • type (integer value to differentiate each item type)

    I could then use the type and unique ID to do things like call a “show with ID” endpoint to display a detail item. I’m almost certain that this is not the most efficient way to do this, but also that if I need to optimize it later, I should be able to do so in a way that doesn’t change anything for the client. The reason I’d like to represent each type as being the same in the feed JSON is that it makes it possible to keep the client code a lot simpler. I’m not sure if that’s the right call or not. Maybe someone with more experience can tell me if I’m way out in the weeds here.

    Update 7:39 pm: I had more thoughts about this approach being a good idea or not.

    → 4:23 PM, Apr 22
  • Band App Diary #1: Initial Design Thoughts

    If you read this blog lately, you know that I have (am) a band called Fisherman’s Porch, and that I’ve been making music for a long time. One idea I’ve had for a while has been to somehow combine my app making and music skills in an interesting way. I’ve also wanted a reason to do something with development that would give me some real world experience writing server side code. I’m going to follow Brent’s footsteps and put all of my design and code thoughts out there, so that hopefully I can learn something from the feedback I get.

    The other day when I posted on Twitter that I was trying to think of a side project I could use Microsoft’s Azure Mobile Services to write a backend for and Nick Harris responded with this:

    @collindonnell write an app for your music with a blog like feature talking about the songs.

    This seems like the perfect project to try this out on for a few reasons:

    • There aren't thousands of Fisherman's Porch fans out there (yet!), and it's not going to be storing a bunch of peoples important personal data, so I can experiment as much as I like with the design and backend architecture.
    • It's not an idea anyone can “steal,” so I don’t have to be secretive at all about creating it and blog about the whole process.

    An App Worth Downloading

    I don’t want to make an app that’s just a static advertisement for my music, because no one will download it, and if they do, they won’t keep it. Plus, designing an app like that just isn’t as interesting to me. I want to use this to stretch my design muscles and see what I’m capable of. Ultimately, the hope is that the app could somehow get people who would have otherwise never ever heard of Fisherman’s Porch to become interested, and people who are interested to stay that way. If you think about how stupid most apps that are created to advertise different brands and whatnot actually are, it’s a pretty big goal.

    So, I think it’s got to do a few of things to have a chance at achieving that. First, the content can’t suck. If my music and other things I put into it are lame, it doesn’t matter what I do. I’m going to take it as read that my content can’t suck. Good content alone is going to be enough though. There’s tons of bands with good songs no one cares about.

    The second thing is that it’s got to be fun to touch and look at. The UI has to be great. It can’t look like a list of songs in the Music app. For the kind of apps I’ve created in the past (productivity mostly), I’ve gotten a lot of mileage out of “what would Mail/Contacts/Music do?” as a starting place. If I were a famous rockstar, that might fly, but I’m not at all. It has to feel like something special.

    The design also needs to look full with the amount of content one person (me) can put out. If I had a table view of six songs, another separate photos view with a few photos, and a videos list with two videos on day one, that’s going to look empty. Instead of a tab bar app with a separate tab for each of those things, or some kind of table view based navigation hierarchy, I’m thinking a single feed that has everything in it. If you want to just listen to my music, you can do that in this app, but the main purpose of this app is to find out what Fisherman’s Porch is up to right now. The types of content I can think of right now are:

    • Music.
    • Videos.
    • Photos.
    • Content from social networks like Twitter, Instagram, etc.
    • Other links to things like blog posts.
    • Shows.

    On the technical side whatever I do should also accommodate the possibility of me coming up with new types of content in the future. I don’t know what those are yet, but I guess that’s kind of the point. Out of all of those types of content, shows are the one that I think deserve their own special view. Giving shows their own view gives me a nice place to put things like getting a push notification if I’m playing a show nearby or requesting a show in your area. Requesting a show could be as simple as a single button. I’d store the location on my server and if I see a bunch in one general area, I can find out about booking a show there at some point.

    Inside of the feed list, I think it would also be nice if people could comment on items that show up there. Review a show, give feedback on a song, that sort of thing. Of course this is the perfect place for trolls to tell me that I “totally suck, lol,” so I think before someone can leave a comment I’d ask them to authenticate with either Twitter or Facebook to remove some of the anonymity. If there’s a way to do it without being a total tool, it might be cool if I could use that as a chance to ask them to like/follow Fisherman’s Porch. I’m thinking more like a checkbox which is default off instead of an alert view that pops up in their face after they log in.

    Other random things the app could maybe do that might be cool:

    • Notifications for new content. If this is annoying people will just delete the app though, so I might have it somewhere that people have to turn on instead of just on for everything by default.
    • Passbook passes for shows. Maybe.
    • Have some basic analytics so I know which songs get listened to the most or the general geographic region people who listen to my music are in. Nothing creepy, but it would be useful to know if I have a big cluster of fans in one area when I go to book a show there.

    I don’t know if all of this will make it into the first version, but I’m kind of excited about this app as a place I can try new things. Since I’m already over a thousand words into this post, I think I’ll take a break and collect my thoughts on what’s all going to need to happen technically.

    → 6:22 PM, Apr 19
  • The Best Guitar Stands

    Until I was about fifteen or sixteen, it seems like the only kind of guitar stand I ever saw looked like this:

    standard-guitar-stand.png

    Generic, and prone to falling over when bumped. These are no good. A trip to LA with my dad when I was in high school was the first time I ever saw an A-frame stand, that are now even more ubiquitous.

    a-frame-stand.png

    So, I’ve been using some variation of that for about fifteen years. This type is better because the guitar leans back slightly and the weight of the stand is distributed more evenly on the base, giving it a lower center of gravity. A lot of them tend to be kind of heavy, however, and they don’t fold up as nicely for carrying as you imagine they do.

    After a show recently where I had to carry one of these along with some other gear, I decided to try something a little different. I purchased a couple of these Hercules stands for home:

    hercules-gs415b.png

    What’s nice about these stands is that they fold up surprisingly small (Hercules also sells a carrying bag for them), are very stable and have these cool little grippers that fold in over the head stock when you’ve set the guitar on the stand:

    IMG 2024

    They’re a little more expensive ($40-50), but not much. I also bought one of their small floor stands which are like the regular heavy A-stands, but are much more light weight, at least as stable, and fold up extremely small:

    hercules-floor-stand.png

    Spending $40 or $50 on a guitar stand seems like a lot of money. But when you consider that your guitars probably cost at least several hundred or thousands of dollars, it’s silly not to spend an extra $20 or $30 for a better stand.

    → 3:44 PM, Apr 11
  • The Revival of the Manual Typewriter

    I enjoyed this article on Medium about one mans infatuation with manual typewriters.

    Using a typewriter has challenged me to think, and write, in an entirely new way. Over time, I’ve learned that the defining trait of a typewriter lies in its sole use as a writing tool and that its most valuable qualities are what it lacks.

    Since I grew up in the nineties I’ve never had to use a typewriter as a serious tool. As long as I ever had to turn in a type written report, it was done on a computer. Logically, a typewriter seems antiquated, inefficient, and the idea of only having one copy of something is terrifying.

    Something is kind of indefinably cool about them though that makes me maybe want to give it a shot. I sort of feel the same way about record players. There’s got to be a German word for nostalgia over something you never really experienced first hand.

    → 11:06 PM, Apr 8
  • The Kindle Is Flawed But Worth It

    A couple of weeks ago I bought a Kindle Paperwhite. I like it a lot. The backlight isn’t so intense I can’t read in bed without keeping myself up all night, it doesn’t get uncomfortable to hold, and it doesn’t give me the option to get distracted and open Twitter.

    The typography does indeed suck. None of the typefaces look all great at the size I want to read them at. I keep flipping between Baskerville and Caecilia. I’m gravitating more towards Caecilia because it looks decent at smaller sizes on the lower resolution screen (probably Amazon chose it originally). Anyway, it’s not that bad – I can live with it.

    GoodReads integration is cool, although I have no idea why it’s so manual. The Kindle shows me what percentage of the book I’ve read on every page, but for some reason, even after adding the book to GoodReads from the Kindle (why can’t it have an option to sync my books automatically?), I have to go to the GoodReads website to update how far into the book I am there (which I won’t ever do).

    This is actually not the first Kindle I’ve owned. I had a second generation Kindle in 2009 (which I stopped using at some point). It’s quite an upgrade in a bunch of ways, although you can tell that the main focus has been making the Kindle cheaper and that making the reading experience better was secondary. The screen is better, but not iPhone 3GS to iPhone 4 better. Not refreshing between every page flip is nice, although I don’t remember that bothering me too much.

    One thing that really stinks and hasn’t changed at all is that reading books which aren’t just prose is awful. I’m currently reading The Practice of Programming, and just finished a book called The Next America. The Practice of Programming has lots of code samples, which get formatted badly between pages. The Next America also had a lot of problems. There were a lot of charts in it which rendered at a size I think would be illegible for a lot of people. Still, I’m sick of having to move books around from place to place and the space they take up, so it’s worth it. It’s just surprising that in 5 years they couldn’t make this better.

    I guess what I really think is that the Kindle is flawed in a lot of ways, but that it’s the positives – e-ink screen, having every book with me always, not having to own and move a bunch of large heavy books – are so appealing that for less than $200, it’s worth it to own one.

    → 6:45 PM, Mar 21
  • New Tracks to Check Out

    I posted a couple of new tracks I’ve been working on that you can check out on my band site if you’re into that sort of thing. I sort of had the realization that at this point, my issue isn’t that too many people might hear my music, and that instead of sharing what I’m working on privately, I should post everything – demo versions, works in progress, etc – for free and see how people react.

    → 11:19 PM, Mar 17
  • NxMW Episode 6: Post Industrial Hellscape

    Bob and I are back on a regular for recording North by Midwest. The next episode will be out Friday, but a couple people have told me that last weeks was their favorite so far, so that may be a good place to start listening if you aren’t already.

    → 4:53 PM, Mar 11
  • Picking Up My Dolphin Yesterday

    I’m now the proud owner of a 1988 Dolphin motorhome. I had to fly to Bend, Oregon, and then drive four hours back through central Oregon and over Mount Hood (where it was snowing). Anyway, it was a pretty crazy trip, and I took some photos.

    taking_off_pdx.JPGrv_in_bend.JPGrv_in_snow.JPG

    → 2:44 PM, Mar 11
  • Beta Test My Album

    Over the past while I’ve been working with a stronger dedication to finish something I’ve had in mind for a long time: record and release an album of original music. Since I was fifteen I’ve been writing songs, during and after high school I had a band, and I’ve performed solo with varying frequency since then. Recording and releasing music is part of a much larger goal to alongside making apps (which I love and would never stop doing), to make music a large and essential part of what I do. I also decided to give it a name; I’m calling the project Fisherman’s Porch.

    The reason I’m posting this now is that a couple of weeks ago I started thinking, “what if I beta tested my album the same way I do apps?” The idea is to put the music I’m working on in front of a group of people and see which songs and see how people react. The music is my own and personal, so I’m not saying I want to design an album by committee (that sounds like a way to make really crappy music), but maybe putting something out there now to a group of interested folks and seeing how people react to everything would be useful.

    If you like folky, indie, acoustic music, maybe you can help. If you like musicians along the lines of Death Cab for Cutie, The Avett Brothers, Rock Votolato, David Bazan, etc, this might be something you’d enjoy. You can check out this short video of me performing to get a fairly good idea.

    Technically the way I plan on doing this is to set up a Glassboard group and put up links to new tracks as I record them. They could be anything from a fairly produced album-ready version of a song, to live tracks, to something I recorded live into my iPhone.

    I’m going to be honest and say that while I’m not looking to just be told me how great I am, I want this to be a positive experience that encourages me to finish the album, I’m really not looking for any negativity or to be told that I suck. If that’s how you feel, that’s fine, but please just keep it to yourself.

    So if you’d like to be hear what I’m working on, it’s really easy. All you have to do is use this link to join the Glassboard and check out the tracks that I’m going to start posting. Really excited to see how this turns out.

    → 8:43 PM, Mar 6
  • Dancing With weakSelf

    There was a really good post on the Black Pixel blog by Rich Wardwell about the implications of capturing self in Objective-C blocks which Brent Simmon’s posted a response to on his blog. If you’re lost, I’m talking about doing this sort of thing to avoid retain cycles:

    __weak MyClass *weakSelf = self;
    self.someObject.blockProperty = ^{
        weakSelf.someProperty = something;
    };
    

    Brent’s thoughts/rules for blocks partially mimic my own1. I never use -[NSNotificationCenter addObserverForName:​queue:​usingBlock:]; I just don’t see the benefit. Unlike Brent, it’s not uncommon for me to copy a block and assign it to a property, but usually if I start having more than one or two somethingHandler blocks, creating a delegate protocol is a better fit most of the time (this code also tends to be easier to debug). I also agree that thinking about if self really needs to be used in the block at all is a good practice (Rich also mentions this).

    I can’t say why exactly, but whenever I have to the whole weakSelf thing, it feels like I’m doing something wrong – it seems like kind of a code smell. That’s not to say I never do it (I do it all the time), but my general feeling is that if I need to, I should probably think about if I’m approaching this from the right angle.


    1. One difference. At some point recently I realized I'd memorized the crazy block syntax: BOOL(^someBlock)(NSString *string). I'm not too proud of this, since I'm pretty sure it points to some kind of underlying psychological disorder ↩
    → 6:08 PM, Mar 4
  • Make Spotlight Searches Less Annoying With This One Weird Trick

    I pretty much never never want to “Search This Mac” if I’m starting from a Finder window.

    2014 02 27 213035 search this mac

    → 10:36 PM, Feb 27
  • January 26th Video of Me Performing Music

    I have a new music thing I’m trying to get started called Fisherman’s Porch. Here’s a video of me performing some songs a couple of weeks ago at an open mic in Portland.

    Post by Fisherman's Porch.
    → 5:03 PM, Feb 6
  • Thoughts on the Verge Review of Pebble Steel

    Nilay Patel’s review of the Pebble Steel is pretty good, but I did have two thoughts after reading it.

    • If the Pebble Steel was rated an 8.5, does that mean that the best a smartwatch released with current technology could have only possibly been 15% better?
    • It's worth considering that you're potentially taking fashion advice from someone who, in the featured image for the article, is also wearing a weird studded bracelet of the type a teenage girl might buy at Hot Topic circa 2005.
    → 4:45 PM, Jan 28
  • How to String a Guitar

    Stringing your guitar this way will help it stay in tune by preventing slipping. Worth knowing how to do right.

    HowToStringAGuitar

    Diagram found here.

    → 9:57 PM, Jan 25
  • Why Can't Everyone Grow Up and Treat Women Like People?

    This ad for Infinity Augmented Reality is super creepy and awkward. It plays to someone with the fantasies of a junior high school age boy: put on your smart glasses, hop in your Ferrari, do a little day drinking, hit on a random woman at her job, and then drive to your next appointment. Are men really so bad that this works on them?

    The part that bothers me the most is at 1:34 when he starts using his glasses to hit on the bartender. Take the creepy glasses out of the equation: why do companies in 2014 think it’s okay to portray women as sex objects? Was the extended shots of the woman licking her lips really demonstrating the unique benefits of the software? It’s gross.

    I don’t know how many women would be excited for the kind of future where a guy they never gave their name to adds them on Facebook and invites them over for some Sauvignon Blanc and casual sex the same day, but I feel like not many. Women all ready have to deal with guys pulling creepy and inappropriate shit in the real world. Garbage like this, booth babes at conferences, and everything else that tells men it’s okay to look at women like a subspecies isn’t helping.

    Stuff like should be offensive to women and men. For women, it portrays you not as an individual taking equal part in an exciting future, but as sex objects and exploitation targets. For men the message is clear: if you’re interested in technology it’s because you’re a sex crazed loser who never learned to see women as people, and who can’t get laid without magic glasses.

    If you’re a man and this appeals to you: grow the fuck up.

    → 2:04 PM, Jan 17
  • Don't Store Static Content in Code

    Sticking large blocks of static content directly in code is a bad idea, but I see it all the time. You keep your image data separate, so why have a 2000 word privacy policy stuck in the code directly? Loading content like this from static text files, as an HTML string into a web view, or keeping configuration data in a property list is a much better choice, and what I do pretty much anytime I can.

    If you have code like this in your app, you’re doing it wrong:

    self.titleLabel.text = @"Privacy Policy";
    self.lineTwoLabel.text = @"Really private. So policy.";
    self.paragraphOneLabel.text = @"<600 words of body text>";
    self.paragraphTwoLabel.text. = etc...
    

    Instead, if you’re just talking about static text with some styling, you could keep all of that in an HTML document and do something like this:

    NSString *privacyPath = [[NSBundle mainBundle] pathForResource:@"lovely_terms_of_use" ofType:@"html"];
    NSString *privacyHTML = [NSString stringWithContentsOfFile:privacyPath encoding:NSUTF8StringEncoding error:nil];
    [self.webView loadHTMLString:privacyHTML]
    

    Let’s say you had a list of documents like this you needed to display, like terms and conditions and about, which were all listed as rows in a table view. Instead of coding what each row is, you could save a lot of code by putting that information into a property list. If you store the info for each document as an item in array – with keys like title and documentName – you can load that array in your view controller and then pretty much automate this whole process with two classes and a few lines of code.

    On top of getting clutter out of your code and saving the amount of code you write, there’s other nice things you can do now too. For example, maybe you want to be able to update any of these documents remotely. All you need to do is check a URL, download a copy of the files into your cache directory, and check for if there’s a match there before you display the one you bundled with the app.

    Getting a feel for where you can get static content of out of code and into external resource files lets you not only write better code, but less of it.

    → 5:33 PM, Jan 15
  • Misconceptions About Sound Proofing Versus Treatment

    A friend who wanted to sound proof the garage at her new house, so that her band could use it as a practice space, was asking for advice for how to do that cheaply via Facebook. The recommendations she got were to put up acoustic foam or egg crate material on the walls, and that’s totally wrong. The misconception people have is they don’t understand the difference between sound proofing versus treatment.

    When you see a picture of a recording studio with acoustic foam on the walls, what that’s there to do is to cut down on uneven reflections and make the room sound better when you’re in it1. What foam or other acoustic treatment does not do is keep the sound in the room from escaping to the outside. In order to sound proof a space, you need to add a lot of mass – as in concrete or brick walls. Anyone who tells you something different doesn’t know what they’re talking about.


    1. Foam is pretty bad for treating rooms too, because it's too low density to stop bass reflections. Bass frequencies cause just as many problems as higher ones, so if you only treat high frequencies you end up with a room that just sounds kind of dead. Good studios use higher density material, like rigid fiberglass, and also diffusors to scatter the reflections and stop what's called nodes. ↩
    → 3:15 AM, Jan 11
  • Push Notification Distractions and Anxiety

    Everyone knows that distractions are productivity killers. But I’ve also started to become aware that all of the vibrations and dings going off in my pocket and on my desktop all day aren’t just distracting, but that every time they go off, I also feel just a little anxious. There’s a tiny bit of stress every time I hear or feel a notification that takes me away from what I’m doing.

    I have no idea if I’m the only person to ever feel this way, but I don’t feel like it can be that uncommon. We just aren’t built to have our concentration broken in that way so often. So, in order to be more productive, less anxious, person I’ve decided to do a few things about it.

    Deleting Noisy and Useless Apps

    I had a bunch of different social apps on my phone I didn’t need: Facebook, Facebook Messenger, Path, Foursquare and Tumblr. Of those, I use Facebook to keep up with people who I don’t have a better way to track, and Tumblr for browsing and time wasting. Nothing has ever happened on any of these that needed my immediate attention, so I deleted all of them from my phone.

    The social apps I kept were for Twitter, App.net and Instagram. For Twitter and App.net, I deleted the desktop clients I had and decided to only use them from my phone. I kept Instagram because I like some of the pictures I take with it, but I may change my mind on it too.

    Any apps that I don’t use on at least a near-daily basis, I also deleted. If they’re that important, why do I have them buried in a folder on my third home screen? For any apps I use, but that send notifications for things that aren’t time sensitive (e.g., Instacast for new podcast episodes), I turned off notifications all together.

    Dealing with Mail

    Mail is one case where sometimes I might get something kind of urgent, but that most of the time is just buzzing away annoying me for no reason. I moved it to my second home screen, and turned off notifications and badges for everything except VIP. I also removed a few people from VIP that didn’t need to be there.

    Using Do Not Disturb

    The last thing I’ve started doing is keep “do not disturb” active on both my phone and computer whenever I don’t want to be bothered (which is a lot). On your phone, you can set it to always let certain people and repeated calls through, but I turned those off too. If I need to focus, nothing is so urgent that it can’t wait for a little bit.

    → 9:53 PM, Jan 6
  • iA Drops Syntax Control Patent, Internet Silent

    Last week, the Internet exploded when the website for Information Architects new app, Writer Pro, mentioned the company filing a patent on a feature called “Syntax Control.” What the feature does is use Apple’s NSLinguisticTagger class to highlight syntactic components of your document (adjectives, nouns, etc), to help while editing. I’m not a patent expert, but based on what understand, I don’t believe in them. I’m willing to be flexible, but the point is I wouldn’t have filed for a patent if I were them, and I understand what everyone was so upset over: patents can be used for extorting other companies, and we all hate patent trolls.

    One part of the reaction I don’t understand is those who say their patent is more invalid because it’s based on an Apple class. The building blocks for anything you want to do exist. What’s patentable is the specific way in which you took those building blocks and made something with them. Whether those building blocks got you 10% or 90% of the way there is immaterial. How you execute is all that counts. Since I don’t like any patents, it’s bad either way, but the idea that the technical difficulty to implement something matters doesn’t make sense to me.

    The other thing I don’t get is why I saw no one commending acknowledging iA for this1:

    We will drop our patents pending. Thank you @dhh for clearing our minds.

    — iA Inc. (@iA) December 27, 2013

    //platform.twitter.com/widgets.js

    So, what happened is:

    1. A company did something a lot of people didn't like.
    2. Those people voiced their opinion.
    3. The company listened and corrected what everyone was upset about.

    If a company does something you don’t like, you speak out, and they correct it, that means what you did worked. It means you got what you wanted. Isn’t the right thing to acknowledge them for it? If you don’t, why would anyone listen to you the next time?


    1. Except for all the people who retweeted and favorited their tweet. ↩
    → 6:25 PM, Jan 3
  • Money Doesn't Mean They Don't Have to Respect You

    Most developers I know do work for other people, either as a contractor or an employee. Two things that have taken me a long time to understand when working for others – but that I’m becoming more certain of – are that you shouldn’t work for anyone who doesn’t treat you with respect, and it’s up to you to make those you work for understand that they need to.

    The software industry is full of young overworked, overstressed people. Often they also hate confrontation, and have limited skill or comfort expressing themselves. That applies to both the people signing and cashing the checks.

    Because of this, if the person who’s hired you has something that’s bothering them, they’re likely to keep it to themselves until they feel it’s reached a head, and explode with emotion. If you’re not comfortable dealing with people like that – even if you know you’ve done everything right – you’re going to defer, apologize and back down. And you have good reason to be that way; they’re paying you and you want that money.

    The problem you’ve created for yourself is this: you’ve now demonstrated to this person that they don’t need to talk to you in a business-like way if they’re feeling frustrated. And once someone loses respect for you, you never get it back. There’s no amount of money that’s worth working for someone who doesn’t respect you, and really, I don’t think most people are going to fire you because you showed that you have dignity.

    One way to deal with situations like that would be to explain the first time it happens that you understand they’re feeling frustrated, but that your business relationship doesn’t make talking to you anyway they like all right. A better way would be to set things up from the beginning so that you the situation. Usually the problem is that people weren’t communicating, so make it as easy as possible to communicate with you.

    If the people you’re working for don’t have an issue tracker – bring your own and have them use it. Explain how you want to receive feedback on your work at the start, and avoid getting it through email, because it’s really easy for others to abuse. Also, if you’re remote, avoid it being team chat if you don’t want to work the same hours they do. You want to pick something everything about the status of the project can go into it, and everyone can check at anytime.

    You’re not going to fix anyone, and in software you’ll always have stressful situations. But you can do better than letting your work become a place you’re constantly disrespected.

    → 5:21 PM, Jan 1
  • RSS
  • JSON Feed
  • Micro.blog