By: Comments Off

Film vs. Digital

I read a really interesting essay on film vs. digital last night. It reflected my own views that there is no winner, they're just different. They have different qualities, a different process for making a photo.

However, I just feel more alive when I'm shooting film.

/Ash Furrow /Comments Off
By: Comments Off

Bad News

I heard the news recently that my grandmother is sick in the hospital, and the news isn't good. It's got me thinking a lot. My paternal grandmother passed away when I was a kid. It was hard on me.

I've been thinking about growing up with my grandmothers and how important a role that they both played in my life. They inspired my love of literature, the importance I place on social justice, and my scientific intrigue. I can honestly say I wouldn't be the person I am today without their guiding help.

The prospect of losing my grandmother is terrifying to me, especially as I'm so far away from home. I still remember the last time we spoke on the telephone. Everything is happening so fast.

I'm hoping for the best, but I don't know how to prepare for the worst.

/Ash Furrow /Comments Off
By: Comments Off

Amsterdam First Impressions

My wife and I landed in Amsterdam last Monday, so we've been here about a week. I thought it would be nice to do a "first impressions" of the city, the atmosphere, and the work environment.


The city is gorgeous, even the shitty parts. We live outside the core of Amsterdam in a quiet neighbourhood called Transvaalbuurt. Buildings here are old, but not that old, and there are lots of shops and cafes and restaurants.


Closer to the center of the city, we've explored neighbourhoods where the tall residential buildings lean toward the street, tourist areas where everyone was speaking English, Dam Square where the palace was located, and of course walked along some canals at night. Such a beautiful city.



One of my primary concerns about moving to Europe was language. We've always wanted to try living in Europe but our options are limited because we only speak English. OK, I can get by in French, but that's it. Amsterdam is great because everyone here speaks English which spoken in English to, and there is a large expat community. All software development here is done in English, so I didn't have a hard time finding a job. Ashley's still looking, but we're hopeful it won't be a problem.


The first thing I have to say is that, especially for its size, Amsterdam has the transit thing figured out. Trams run reguarly on a schedule and I haven't seen one be late yet. The subway also runs very regularly and is easy to figure out. My only complaint has been the nachtbus, or night bus, which I had to take home after a night of drinking. It was expensive and difficult to figure out (and the bus driver was very rude). That's been, however, my only negative experience at all so far, so I'll count myself lucky.

Amsterdam is a small city, so it's easy and fast to get around. I've been doing a lot of walking, and I mean a lot. Let's compare and constrast. Here's my pedometer readings from the last week I was in Toronto.


And here's my first week in Amsterdam.


I've taken the intercity train a few times now, once to Sloterdijk and once to Utrecht, and it was really easy and cheap. Additionally, my new employer is going to be reimbursing me for transit costs, which is super-cool.

Bikes are everywhere. I'm planning on buying one next month. The only real downside to biking is that it may be difficult to find a place to park.


Ashley and I haven't been eating out a whole lot, but what we have eaten at restaurants has been fantastic. Food in restaurants seems to be a bit more pricey than in Toronto, probably because they pay their workers a decent wage. You also don't tip here, which is taking some getting used to.

We've got a large (for Amsterdam) grocery store a five minute walk away, and a smaller one five minutes in the other direction. We've been eating great, going to the grocery store about once a day to get just what we need for that day. Between the healthy eating and the walking, I'm looking forward to becoming healthier than we were in our last year in Toronto.

Food at the grocery store is cheap. Like, really cheap. Not the pre-packaged stuff, but real food. Cheese is cheap, too, and plentiful. Oh, and I found one of my favourite beers for about a Euro per bottle. Amazing.


I've heard that the Dutch people are direct, which is true. What I hadn't heard, but I've certainly observed, is that they're polite when spoken to politely. Besides my bus driver incident, everyone has been curteous, though sometimes curt. Even the meany at the immigration office was polite.

iOS Community

Part of the reason I moved here was for the iOS community. Mike Lee, over the Summer, convinced me that there was no other place like Amsterdam to develop software. He was correct.

On my second day here, I attended the largest CocoaHeads meeting I've ever attended in a nearby city. It was amazing. People are interested in learning and attending community events. Companies seem to be on the constant lookout for developers. It's a great combination.

/Ash Furrow /Comments Off
By: Comments Off

Fuji X100S Review

So I bought a new camera the other day.


I've read a lot about the Fujifilm X100S, including Ken Rockwell's review of the X100 precursor. My friend Eric also swears by it. I'm planning on doing quite a bit of travelling in the future, and my 5D is quite bulky. Here's my miniature review of the camera.

First Impressions

Let's start from the top. I'm at the camera store and I pick up the camera. At this point, the only thing I have to shoot is my incredulous-but-beautiful wife.


The first thing I'm struck by is how easy it is to operate the camera. I've read some things about the menu system being hard to navigate, and having used the camera for a week now, I find that it's not the most intuitive. However, at first glance, a lot of what I need to use is available through knobs or buttons.

I get the focusing system immediately. I'm used to the focus-center and recompose method of shooting, which is good since the X100S' parallax compensation only kicks in once focus is locked. That's OK.

I'm a little annoyed by one thing, which is that every time I take a photo, the hybrid viewfinder pops into EVF mode to show me the photo I just took. As someone familiar with film rangefinders, this is a break in my existing workflow. I'd rather review the image on the back of the camera, but I can't disable auto-review in the viewfinder without also disabling it on the main screen. Oh well.

Build Quality

I'm not going to insert the obligatory "nothing holds a candle to my Leica" schtick here. I'm paying a moderate price for a camera and I expect good build quality. The X100S doesn't disappoint. It feels sturdy, like it could handle an accidental tumble. Good knob-feel. Buttons feel good to press. I like it.

Image Quality

I'm really impressed with the image quality so far.


Distortion from the lens is low-to-nonexistent. I'm really happy with that, since I'm used to wide-angle lenses I use either being zooms or ultra-wides, so distortion has historically been a thorn in my side.



Performance is good, really good. Good dynamic range, average high-ISO noise. Not nearly as good as my 5D, but it's also a lot less expensive.

Night time, high-ISO performance. Not bad, but not great. 

Night time, high-ISO performance. Not bad, but not great. 

Autofocus is a bit finicky. I've lost a couple of shots to it. Oh, well. It seems to do a lot better in daylight than at nighttime, as you'd expect.

At f/2, bokeh is nice. Not as creamy as my Sigma 50mm f/1.4, but good for f/2 on a crop sensor.



Overall I'm really happy with the camera. A few quirks but otherwise a real performer. I bought this partially so I could stick it in my coat pocket while going about Amsterdam, and I'm really satisfied with it so far.


I'm still going to shoot on my M6 – I love that camera. However, the future of my 5D is in question. It's always been more camera than I strictly need, but I love to shoot with it. It's just so damn big. At this point, I'm going to see how my habits develop. If I'm not using my 5D at all, then I'll likely sell it. It would be a compromise on flexibility of a zoom lens and quality of bokey I can get from shots, but life is about compromises I suppose.

Obligatory elevator self-portrait. 

Obligatory elevator self-portrait. 

/Ash Furrow /Comments Off
By: Comments Off

Replacing Objective-C and Cocoa

Steve Streza has a follow up post to my post yesterday about replacing Objective-C. It's a great read and goes into a lot of depth about what we should look for in a replacement.

In the years that have followed, the demands of modern Internet apps have exploded, and we are back at a stage of competitive complexity. A new developer platform could once again level the playing field and inspire a new generation of developers to aim high.


/Ash Furrow /Comments Off
By: Comments Off

Depressive Funk

I've been under considerable stress lately. The move has certainly been the key factor, but I've also bitten off a bit more than I can chew in personal projects (and I've got a "hard out" at work – a deadline of Friday that is unmovable due to the fact that I'm leaving T+L).

I've felt myself slipping back into a depressive funk, and I don't like it.

To make matters worse, yesterday I forgot to take my medication. Funny how everything was fine until late yesterday afternoon, when I realized my mistake, I started to feel jittery, dizzy, and unable to focus. I almost wish that it had gone unnoticed. Instead, I'm dealing with the fallout of that today. It's hard to describe what it's like to be on antidepressants, and to forget to take them. It's not fun.

This time, however, I have something to help me besides medication. I've been reading a book called Mind Over Mood that discusses strategies for self-talk and cognitive-behavioural therapy-style thought modification that's been really helpful. If you've been struggling with depression, I highly recommend it.

In any case, I'm trying to stay positive. Only a few more days until I'm in freaking Amsterdam! It's hard, but I'm trying to be more excited than nervous.

/Ash Furrow /Comments Off
By: Comments Off

We Need to Replace Objective-C

I thought that, in 2014, it was just taken for granted that Objective-C needs to be replaced. I thought that we were all on the same page.

That's what I thought, but I was wrong.

So here we go again.

This all started, for me, when I first listened to Hypercritical episode 14: A Dark Age of Objective-C. Not everyone has time to listen to a podcast, so I'm going to do my best to do justice to John Siracusa's argument here.

The premise is that programming language abstraction increases over time. This isn't a hard pill to swallow; after all, we can see the progression pretty easily:

  1. Machine Code
  2. Assembly
  3. Procedural languages (C)
  4. Objective-oriented languages (C++)
  5. Virtual machines (Java, .Net, Ruby, etc)

If you accept the premise that programming language abstraction increases over time, then consider where Objective-C is on our progression. Pointers. C-based APIs. No virtual machine. Ugh.

So Objective-C is a little behind, so what? It has benefits, after all. Being close to the metal has made performance better on resource-constrained iOS devices.

Sure, but that's not the point. The point isn't that Objective-C needs to be replaced today, but rather that eventually, progress in programming languages is going to leave it behind. Someday, someday soon, writing Objective-C as we know it today will seem as antiquated as writing assembly. That's going to hurt Apple.

If writing iOS and OS X apps is as cumbersome as writing assembly, by comparison to modern programming languages, then what will Apple do?

Now, the counter-argument is that Apple has been making strides in Objective-C development. They deprecated GCC in favour of LLVM. They added blocks. They added collections literals. Yeah, and that's all great, but those are all incremental improvements. At some point, there's going to be a gulf that can only be bridged by a radical change in the language. Christ, look at how we're still arguing about dot-notation. Incremental changes aren't the way to get to the language of the future.

So why do we need to replace Objective-C today, then, if it will probably be fine for a while? Well, look at Microsoft. They transitioned from Win32 APIs to .Net and the CLR VM and it took over a decade. Apple needs to stat work on replacing Objective-C as its main language now if it wants it to be ready for, optimistically speaking, 2020.

My friend Jason nails it:

A new old thing is not really what we need. It seems absurd that 30 years after the Mac we still build the same applications the same ways. It seems absurd we still haven’t really caught up to Smalltalk.


So what do I want in a language? Well, here are some things that Siracusa points out, augmented with some of my own suggestions:

  1. It shouldn't use pointers, structs, header files, anything C-based
  2. It should be a memory-managed language (No ARC, not retain/release, no Core Foundation)
  3. It should have native, unicode strings and native collections
  4. It should be concise
  5. It should have named parameters

As long as, as iOS developers, we're one NULL pointer dereference away from a crash, we're a long way away from using a modern language.

Update: It's been pointed out that I don't actually state why Objective-C needs to be replaced. I'll be concise: eventually, if things continue without radical changes to Objective-C, writing apps in the language will seem as outdated as writing assembler does to us today. That will be a competitive disadvantage to Apple, which I don't want to see happen.

/Ash Furrow /Comments Off
By: Comments Off

Core Data Duplicate Relations

I tweeted yesterday that I was having a problem with Core Data. A pretty serious problem. I have two entities, A and B, and A has a to-many relationship with B. Ever since I implemented a background managed object context, We've been seeing very intermittent bugs with duplicate entries in the A->B relationship.

What does that mean?

Well, it means that an instance of A, called a, has a set of instances of B. That set would have duplicates, and when I say "duplicate", I mean the same god damned object. Same pointer. Same managed object ID. Same. Object.

In the UI, I turn the set into an array, which allows duplicate entries.

How is that even possible? Sets are supposed to disallow duplicates, but I had them.

I wasn't overriding hash or isEqual on B, so it was definitely a Core Data issue. Finally, after digging around for an hour or two, I found the problem.

One of the models, an ancillary one to A and B, was depending on the fact that it would be configured from the main thread. It would access a shared instance of A (the logged in user) and make a relationship to an instance of B. When performed on the background thread, that instance of B belonged to the background context. I don't know how the pointers became the same, but somehow Core Data was inferring something and making magic changes for me (I was using the generated accessors).

The lesson here is complicated. First, your models should never rely on being configured on a specific thread. Ever. Second, migrating from a single-context to multi-context Core Data stack is hard; it's better if you architect something mutli-context from the get-go, or use something like MagicalRecord to do it for you. Finally, even experienced Core Data practioners can make beginner mistakes. Always test your assumptions.

/Ash Furrow /Comments Off
By: Comments Off

ReactiveCocoa Example

The Big Nerd Ranch blog has a great post detailing an example of how to use ReactiveCocoa in a non-trivial way (that is, real-world use). They do so by using a project to explain the motivation behind ReactiveCocoa. Really great stuff.

(Full disclosure: I helped them proof the article.)

/Ash Furrow /Comments Off
By: Comments Off

Krush iOS Architecture

For the past five months, I've been working with my colleagues at Teehan+Lax on an app called Krush. I learnt a lot while helping to write the app, and I wanted to share some of those lessons with you.

To that end, I've written a blog post on the T+L blog featuring four case studies about decisions we made. Take a read and let me know what you think.

/Ash Furrow /Comments Off