If you blog it they will come?

Wednesday, December 12, 2012


Powell Street is jam packed with tourists getting their first glimpse of San Francisco's cable cars and behemoth retail stores on their way to Union Square. I'm stepping out of the office because I need a break, or better yet, a change in perspective.

I've lived here three years and see the tourists' sights as part of my daily commute. When I witness SLRs snapping family vacation photos with the backdrop of Abercrombie's double doors, judgment creeps in.

But, I didn't take this walk to judge tourists. Instead I attempt to cast myself into their mindset: to have come a long way to arrive in a place that is new and novel, to have arrived somewhere with the intention of marveling at marvels (commonplace now to me).

I imagine that I too am a tourist, and delude myself into thinking I've been traveling for hours and I close then open my eyes, and I as a tourist I think: "I've finally arrived, I'm here! There's so much to see, this amazing city, and it's mine to explore, etc."

"I've finally arrived, I'm here!"

There's instantly a rush of adventure, and wonder again as I gawk at the bustlings and buildings of Market Street.

It's possible to take this a step further.

It's more abstract, but I next imagine myself as a tourist though time AND space, one who has been traveling not for hours, but for years and years. And what a long, strange road it's been to this very precise moment, where I've finally arrived. So much time and effort, but now I can say, "I'm here."

This isn't merely a mental stress ball technique, it's a frame of mind I try to keep and access anywhere, anytime (not easy).

Perspective shifted, earnestness in hand, ready to encounter the next destination on my weird lifelong tour, I will walk around a bit more then return to cranking out code.

Wednesday, November 21, 2012

A lifetime of supporting roles

There are two types of people (for the sake of argument): those who thrust themselves into the spotlight, and those lean away from it.

I'm the latter. Maybe it's timidity, but perhaps not...

In sports, I was usually the defender, because I was better at reading an attack than creating one. But in music, I started off playing guitar, then picked up the bass so I could join a band with a talented singer/songwriter who needed a bass player.

In my work, I started off as a tester. Now I am a feature developer now but my comfort zone is at companies which have recently realized significant success and are building on it. I have not stuck my neck out at early, unproven startups.

Sometimes I want the limelight. I imagine a swift sprint upfield to score, stepping up on the monitors for a facemelting guitar solo, or launching some product in my free time that snowballs into an unprecedented one-man Silicon Valley success story, complete with magazine covers and a feature film.

But sticking to the shadows doesn't mean that you concede the act of creation.

In soccer, stopping an attack means setting the pace and the direction of the counterattack. And bass players know (few others do) that they are the ones really controlling the song  -- the tempo, energy, the complexity and direction.

And the developers who join a company well after its business model is demonstrated must be roadbuilders who not only pour asphalt over dirt roads, but design intersections and plan highways.

The world needs people who sparkle in the spotlight, but to mix metaphors, it's people like myself who may not always blaze the trail, but are ultimately steering the ship.

Thursday, August 9, 2012

jwz quote that's stuck with me

I could have benefitted from internalizing this quote when I was starting out, I was one of the skittish ones.:
"I think that's one thing that's really important is not to be afraid of your own ignorance. If you don't understand how something works, ask someone who does. A lot of people are skittish about that. And that doesn't help anybody.  Not knowing something doesn't mean you're dumb--it means you don't know it yet." --jwz (from Coders At Work)

Friday, June 29, 2012

List of shortcuts to change in XCode

Some shortcuts in XCode don't make sense at all, some are for features I never use, and some are awesome but off by default. I'll update this periodically.

Shortcuts to enable/simplify:

  • Select Word (Selection)
    • This is close the vim-ism "Change Inner Word" (ciw). Saves a lot of cursor hopping.
    • Ctrl+W  
  • Move Focus to Next Area
    • makes it easier to hop between the split panes if you don't want to deal with the Cmd+J navigation view.
    • Cmd+Option+up arrow

Shortcuts everyone should disable:

  • Ctrl+P to print
    • when was the last time you needed to print anything in Xcode?

Shortcuts I have no use for:

  • I never use code folding
    • It's too much manual work to fold and unfold everything
    • If you need code folding, your methods are too long.
    • If you want to find functions quickly, just hit Ctrl+6 and start typing its name

Friday, June 1, 2012

iOS Security Overview

I recently read Apple's iOS security overview which outlines the various security measures present on iOS devices.

It's a fairly short read at under 20 pages and it's great stuff to familiarize yourself with if you're developing on the platform. Here is a summary / some limited thoughts (I don't know much about security):

  • A lot of Apple's security measures are possible due to novel hardware solutions
    • The ARM processor's Execute Never which marks pages as non-executable
    • AES 256 crypto engine and SHA-1 are built into the file system and implemented in hardware, which drastically reduces the overhead of encrypting everything
    • Novel ways of wiping sensitive data that would otherwise linger in flash memory
    • UIDs are not readable by software or firmware, yet still used as input to crypto
A lock inside a lock inside a lock

  • The file system encryption is of an onion nature
    • File metadata is not available all the time. This is to restrict access when the device is locked or interrupted by a phone call, etc. and availability rules are described by a files' class
    • File metadata is encrypted. The file data itself is encrypted too, and that key is only available after decrypting the file metadata (that's right, each file has its own key)
    • Did I mention that the file class which points to the file's metadata is also encrypted? See image above
    • It's fast to remote wipe your device: just destroy the top level keys and nothing else on the filesystem is accessible
  • Every encryption/security algorithm I've heard of is deployed here (ok not ROT13):
    • Address space layout randomization
    • Lots of certificates to authenticate trusted code
    • Asymmetric elliptic curve cryptography (Curve25519)
    • Yarrow
    • PBKDF2
    • SSL, VPN, etc.
    • AES and SHA-1
    • escalating time delays: it'd take years to brute force a short password
  • I don't understand keybags yet
    • My eyes glazed over and it sounds too similar to teabags

Monday, March 26, 2012

"We have a false model of what thinking is"

This is a tasty excerpt from a great interview with David Graeber:

We have a false model of what thinking is. Because you can't really think by yourself, can you? You have to create someone else in your mind to explain things to, and to have an imaginary conversation with. This idea was inspired in part by the philosopher of cybernetics, Andy Clark, who proposed something he calls the extended mind hypothesis. Basically, the argument goes like this: Say you're doing long division on a piece of paper instead of doing it in your head. Clark asks why the piece of paper is not just as much a part of your mind while you're doing that calculation as the part of your brain that's doing the math. He says there's no reason at all.There are a million similar examples that philosophers like to trundle out—you have a bad memory so you write everything down. Is that piece of paper then part of your mind?

"Mind" isn't "brain"— the brain is just an organ; your mind is the dynamic interaction of various moving elements that culminates in thought. Philosophers like Clark are willing to take that argument this far, but the question that never seems to occur to them is this: when you're having a conversation with someone else, is their mind part of your mind? Nowadays, many philosophers of consciousness like to note just how razor-thin this thing we call "consciousness", that self-aware part of our mental operations, really is. The average person can rarely hold a thought for more than three or four seconds, eight at the most, before the mind wanders. It's very unusual to be fully conscious for more than a tiny window of time. That is, unless you're having a conversation with someone else, in which case you can often do it for long periods of time, especially if the conversation is with someone you find particularly interesting. In other words, most of the time we're conscious is when we're talking to someone else, or otherwise interacting intensely; during moments in which when we're not clear whose mind is whose. So consciousness is interactive, it's dyadic or triadic. It's a fallacy to imagine that thinking is something you largely do alone. On some level, of course, we already know that. But I don't think we've even begun to explore the full implications.

Monday, March 12, 2012

error: unknown warning group

I try and write about really frustrating issues that I manage to figure out or interesting problems that I solve in hopes that it will help other poor developer souls who would otherwise be without a guiding light. Here's an Xcode-inspired episode of the former.

I decided to see what would happen if we moved our iOS project to Xcode 4.3 and it nearly went without a hitch except that I spent several hours trying to figure out why our rake scripts weren't working.

...actually let me back up a step and describe a couple of tools we use.

We use Cedar to run automated tests ("Specs" to follow the parlance of rspec), and one Cool Thing is that they can be run in Xcode or from the command line using rake.

Another Cool Thing, or at least a Thing That Used To Be Cool Before Upgrading Xcode, was our use of PivotalCoreKit to make spec writing more convenient.

PivotalCoreKit uses (abuses?) the dynamic-ness of Objective-C categories to override existing class behavior and suppress NSUrl from making an actual network connection, for example. The advent of 4.3 discourages this sort of flippancy and will issue a warning/error by default, which the newest commit of PivotalCoreKit suppresses with pragma preprocessor macros.

Now is where the wonkiness really starts. Running our specs from Xcode went swimmingly after updating PivotalCoreKit, but building the same spec target from the command line would fail with errors such as:

Externals/PivotalCoreKit/SpecHelperLib/Extensions/UIWebView+Spec.m:4:34: error: unknown warning group '-Wobjc-protocol-method-implementation', ignored [-Werror,-Wunknown-pragmas,2]
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

What the heck??? They are the same target!

But after comparing the build outputs of Xcode 4.3 and the command line spec script, they were drastically different. For one, I could not get the command line to compile with SDK 5.1. Despite my various environment variable tweaks, the -isysroot parameter pointed firmly at yesterday's SDK.

Here's how I (eventually) fixed it:

  • I ran
    xcodebuild -version
    and found out I was *still* on Xcode 4.2 (I had decided not to delete it yet)!

  • I warily installed the latest command line tools (Apple: "The command-line tools are not bundled with Xcode 4.3 by default. Instead, they can be installed optionally using the Components tab of the Downloads preferences panel")

  • After installing the latest command line tools I was still on 4.2. After digging in /usr/bin/ to ensure that xcodebuild had in fact been updated, I serendipitously discovered

  • sudo xcode-select -switch /Applications/Xcode.app/

  • xcodebuild -version
    is now 4.3!!

  • All is well is command line specs land

So here I am 4 hours later to administer the following advice:
--Delete old versions of Xcode when installing the latest if possible
--Otherwise, remember always: xcode-select -version

Sunday, February 12, 2012

This weekend was one well spent as I participated in Music Hack Day SF for the first time.

I initially partnered with Kelly Dunn, who has been working on a project to send OSC messages triggered by Sifteo cube user interaction events (more here: Siftosc).

From 2pm on, we toyed with the idea of creating an air drum setup, which treats the cubes as shakers or drum sticks, using Renoise's built-in OSC server. Ultimately this didn't pan out since we weren't able to trigger note events without preprogramming a beat into Renoise, but Kelly did get the shaker implementation working and went on to do a crazy hack where he used the Sifteo cubes to manipulate his monome controller .

I moved on to experimenting with PureData on iOS with libpd a good 3-4 hours later. I got a basic grid-based synth working, but was unhappy with the sound quality on the iPhone simulator, which is a known issue with libpd. I learned a lot about puredata and could have potentially demoed the app despite its annoying distortion issues, but since I didn't have a device to deploy to and it was still before midnight on the first day, I decided to start over with something else.

Looking for examples of manipulating microphone input on iOS, I found aurioTouch, a powerful demo app created by Apple to showcase audio processing with the microphone. I started tinkering with this but was starting to feel fatigued from wrangling libpd and wanted to move on from audio low level synthesis.

I took an hour break and decided to work on a zany, assuredly demo-able project.

Enter sideTrack. It's a Rube Goldberg-esque python script which leverages many different APIs to mutate an initial seed song many times over until it eventually plays a completely unpredictable song, while speaking the nonsensical phrases it uses to perform each search.

Similarly to how one might fall down a wikipedia hole, this python script uses random lyrics, geography, song titles and more to repeatedly mutate different searches into a track with a spotify url, which is finally played via AppleScript after exceeding a depth limit parameter.

It leverages APIs from MusiXMatch, EchoNest, Spotify, and google maps to mutate the songs at each depth level. It worked and the results were always surprising. I was grateful to receive generous prizes from spotify and 3scale.

Here's a screen cap of sideTrack:

Regardless of frustration from my numerous aborted project ideas, music hack day was a ton of fun. I met some very talented and passionate folks, and eagerly await the next music hackathon.

Tuesday, January 31, 2012

brief notes from graeber talk

30% of the world's mined gold exists underground Manhattan, and you can take tours!
"You can tour the trading rooms, the museum and the Fed's vault, which holds 900 tons of gold."

In many ways, war gave rise to capitalism and not vice versa.

Modern coinage and money arose largely out of the enormous challenge of feeding and paying a medieval army.

Kings would print money and distribute it to their populace, then ask for some of it back. Markets arose out of the need to pay this tax, and it benefitted soldiers who had lots of spending power. So it was governments creating the markets, not regulating them once they'd come to fruition.

Additionally, it was unwise to do business with armed passerbys with IOUs, so cash was the logical material of exchange, especially since the soldiers had most likely recently looted some gold/silver/whatever on their way to visit your humble market.

Precise exchange rates were born of violence, for instance to stem a blood feud, exact legal damages were conferred, and substitutions were made when necessary. Otherwise, most trades were conducted with rough equivalency, with shame or death as a possible punishment for underhanded-ness.

Also the anarchism of Barcelona

also the war debt that is circulating from the king of england and the british bank notes that act as IOUs