I’m sure bad at this blogging thing. Since I first set out in — technically, July 2013, but let’s say August — I’ve only gotten one week into my journey before hanging up. I’d like to see if I can try again, perhaps this time with a little more success.
Right now, I’m writing this from Dublin, Ireland. In the interim, since my last entry from an actual city, I’ve visited Vancouver, Toronto, Montreal, Quebec City, New York, Boston, Philadelphia, Chicago, New Orleans, Austin, Los Angeles, Barcelona, Paris, London, Cornwall, Bath, Oxford, Cambridge, York, Newcastle, Edinburgh, Amsterdam, Luxembourg, Prague, Berlin, Vienna, Ljubljana, Zagreb, Split, Bologna, Modena, Milan, Florence, Rome, and Turin — plus a number of smaller towns along the way. That’s more than a dozen different countries over the course of the past two years. To the person first setting out on this trip — the person who expected to arrive in London and cautiously venture to other countries only on rare occasion — this list would have been unimaginable. I was nervous. I’d never been alone in a place where the primary language wasn’t English. I wasn’t sure about the logistics. I didn’t even know if I’d be able to tinker with my projects in peace.Continue Reading...
When Apple replaced its Google-powered maps app with a complete in-house rewrite for iOS 6, most users had little good to say about it. It was inaccurate. It lacked public transit directions. The search was paltry, as was the iconography. At best, it could be described as slick, with the pixellated pop-in of previous generations replaced by crisp, swiftly scaling vector lines. But this was not enough to offset the lack of functionality compared to Google’s definitive mapping solution, and so Tim Cook apologized and we all went on with our lives.Continue Reading...
I recently released my first commercial project: Translit Keyboard, a 3rd party keyboard for iPhone that lets you transliterate Latin characters into Cyrillic and some other alphabets. When I was first investigating this problem, around the time that iOS 7 came out, I discovered that I could implement an elegant solution in OSX using the lesser-known Input Method Kit. My program sat between the keyboard and text field; the framework provided me with each raw character as it was entered, and I could either pass it along with the default behavior, or instead take control of the output and send off whatever I pleased. Sadly, iOS was off-limits: since 3rd party extensions weren’t even on the radar at the time, there was nothing anyone could do to enable this sort of behavior system-wide. The only solution was to make a nice app with a special text field that you could copy and paste from — too clunky for rapid-pace tasks like messaging.Continue Reading...
This is the time of year when a lot of people are upgrading their phones. If you are, don’t chuck your old phone just yet!
Here’s a thing you might not know about your iPhone: the GPS unit works even without a data connection. I was confused for a long time about what “assisted GPS” actually meant. My understanding was that it was impossible for an AGPS phone (which the iPhone is) to acquire a GPS signal without a data connection. Turns out it works fine — you just have to wait a bit longer for the phone to find a satellite.Continue Reading...
I recently ran into the following issue in my Objective-C code. Let’s say you have a model class that has (among other things) an
NSMutableArrayof other model classes. How do you let outside objects modify this collection? One obvious solution is to add your own custom accessors:
removeObject:, and so forth. But that’s a little sad, since it’s essentially a simplified, non-standard duplicate of the
NSMutableArrayinterface. The other obvious choice is to expose the array directly. But oh boy! If you do any pre- or post-processing on add or delete, there’s a world of pain waiting for you. It’s just not wise to let users mess around with the internals of your model like that. Maybe if
NSMutableArrayhad a delegate, we could expose the array and then let the model object (as the delegate) have the final say on any changes, but sadly, to my knowledge, it does not. (
NSArrayControlleron OSX and
CFArraymight have that functionality, but that’s just too much work for too little gain.) Finally, there’s the issue of key-value observation. How do we observe changes to the array? If we simply observe the array property, we’ll only get notifications when it’s set. Do we observe the array’s
countproperty? (Doesn’t work, and wouldn’t handle replacement even if it did.) Do we add manual KVO calls to our custom accessors? Do we set a property somewhere whenever the array is modified?
It turns out there’s a solution to all these problems, and it involves something called key-value coding of collections.Continue Reading...
So how’s programming on a cruise ship, anyway?
First of all, you can’t count on the internet out at sea. That’s not to say it’s unusable: I saw speeds as high as 15Mbit/sec down, though they usually hovered around 1Mbit/sec or less. (Ping was atrocious, of course.) However, at almost a dollar per minute during regular hours, it was hard to justify. One deal that my particular cruise offered was half-price internet from 11pm to 5am, giving me a rate of $0.37/minute. (This was actually better than most of the package deals and allowed me pay à la carte.) Having mentally allotted $50 for internet use, this meant that I could only use about 10 minutes per day, or 20 if I went once every 2 days. For the most part, I spent these periods rapidly opening a bunch of tabs to Gmail, Feedbin, and Hacker News, loading any new articles I needed since the last internet checkpoint, disconnecting to write any replies, and reconnecting one final time to send them out. It was basic, but it kept me content. (All logging in and logging out was done through an atrocious web interface, while the charges could be verified through an equally despicable account navigator on the cabin television.)Continue Reading...
My first run at a packing list was suprisingly solid: everything worked pretty much as intended and there wasn’t anything I desparately missed or needed during my US trip. However, I misjudged the needs of my travel bag:
- I very rarely used my Silver Streak bag as a backpack, and when I did, it was just too heavy for prolonged use. (The total weight of all my equipment was almost 50 pounds.) As a result, I mostly ended up detatching the backpack and carrying the main bag on a shoulder strap, which was very uncomfortable.
- All my important equipment rarely left my backpack. I hardly ever used the expanded compartment in the main bag for anything other than a few spare parts, souvenirs, and my Wacom tablet.
- I gathered a lot of food ingredients during my travels, and to avoid a mess, I carried them in a separate cloth bag. There was never any need to store perishables in the main bag.
As a result, I have replaced my Silver Streak with an Eagle Creek Switchback 22 (on sale). The Switchback does almost everything the Silver Streak does, but adds one vital feature for city use: wheels! Contrary to most of the advice I found on travel blogs, I desparately wished for wheels many times during my trip. (Maybe this would be different if I were spending long miles walking on unpaved roads, but the fact is that most of my traveling happens in modern cities and not the countryside.) The backpack half of the bag now serves as the store for all my tech equipment, while the main bag keeps all my clothes and accessories. Among other things, this consolidation means that I no longer have to move things from bag to bag when I’m leaving the main bag in a locker or on a bus/train/plane. Space is more tight than in the Silver Streak, but everything still fits. (At the moment, I’ve decided to roll up my jacket and clip it onto the handle, since cramming it in takes a bit too much effort.) The Switchback offers great flexibility in regards to transport: backpack zipped onto the main bag, backpack threaded onto the carrying handle, or backpack and main bag separate. (So far, I’ve found the most convenient option to be zipping the backpack onto the main bag and using the wheels. You can walk many miles like this without a problem.) There are many other details that make the Switchback feel like a high quality product, from the multipurpose outside straps to the secondary handle position all the way down to the stitching. It’s clear that a lot of thought was put into the design. One minor annoynace is that the backpack straps have to be taken off the backpack to be used with the main bag, but since I’m mostly set on using the wheels, this isn’t a big deal for me. Before I settled on the Switchback, I also tried the Osprey Meridian, but I was simply not able cram all my stuff in!Continue Reading...
I’ve come to the conclusion that if you’re doing the work-travel thing, you always need to have a reliable, quiet place nearby to retreat to. Most hostels just don’t offer that level of privacy, while hotels are too expensive. Coworking spaces would be great, except they cost an extra $10-$30 per day. (Except the gratis Wix Lounge in New York, but there’s no privacy there to speak of.)
Aside from finding rooms to rent or sublet (which can be tricky in a foreign country), the best solution I’ve been able to find so far is Airbnb. (Sign up with my referral link to earn us both credit, I think!) Per day, Airbnb listings tend to be roughly on par with hostels in terms of price; per month, they’re more expensive than the local rental rate, but not astronomically. And for the extra cost, you get your own room (often with a window and desk), one or more locals to chat with, a fantastic communication and creditibility channel, and a neat little paper trail of all the places you’ve been to. Plus, you get to experience life in a foregin city as a local! If you’ve ever been to Europe, tell me you’ve never walked down the twisted cobblestone streets and wondered what life was like in those arborial, patchwork buildings…Continue Reading...
Hello! I don’t know what happened. Sorry. I think I fell asleep for half a year. OK, I really need to put up the rest of my photos from my US trip. But before that…
I’m in Barcelona! And instead of flying, I took a ship.
I was originally thinking of crossing the Atlantic on a freighter, but an article by a globetrotting programmer pointed me to a somewhat more comfortable option: cruise ships. Wait, wait — before you think “how posh”, hear me out! As it turns out, during certain times of year, the big cruise lines ferry some of their ships across the Atlantic to prepare for their summer Mediterranean cruises. Since these sailings only go one way and happen during typically non-vacation times of the year, they are often very cheap. What’s more, the article pointed to these cruises as a fantastic way to get programming work done. Sure, internet is a no-go, but if you can get past that, you basically have an idyllic floating office (food service and hot tub included!) for a work week or two. Given my needs, it was a no-brainer.Continue Reading...
I recently got a high-end 15” Macbook Pro. The 13” model I was using before had served me with faith and dignity over the years, but as my appetite for high-performance apps increased, the poor guy just couldn’t keep up like it used to. In the past, I would have only considered upgrading to another 13” laptop, but a lot has changed over the years. Computers have slimmed down. I’ve slimmed up. A 15” device just didn’t seem like the back-breaking monster it used to be.
The other big factor in my decision was graphics performance. Among all the Macbooks currently available, the high-end 15” Macbook Pro is the only one with a discrete graphics chip still inside. You get access to an integrated Intel Iris Pro 5200 for everyday use, but the OS can also switch you over to a powerful Nvidia 750m when the polygons have to fly.
At first, I naturally assumed that the 750m would kick the 5200’s butt; this was a separate ~40w component, after all. But as I started to dig through forum posts and benchmarks for my research, I discovered that while the Iris Pro usually lagged behind the 750m by 15%-50%, there were a few recorded instances where it matched or even surpassed the Nvidia chip! Some people blamed this on drivers, others on architecture. Were the numbers even accurate? I wanted to find out for myself.
There were a couple of specific questions I was looking to answer during my testing:
- How good is the maximum graphics performance of this machine?
- How does the Iris Pro 5200 compare to the 750m?
- How does Windows 7 VM (Parallels) graphics performance compare to native Windows 7 (Bootcamp)?