The blog was completely offline for a while because my Macminicolo machine died a slow death. Well, it's not really dead, but it is in a sort of coma. Probably a bad disk, everything is insanely slow that touches the disk.
I thought maybe it was time to set up a VPS instead of a "real" machine. I had the usual struggle trying to remember where to put the directives to enable mod include, and I had to remember how to set up GOPATH for the go installation. I think everything is working now except the massive mod rewrite file.Permalink
In Praise of Marco Arment
Marco Arment (twitter @marcoarment) is a programmer. You've probably never heard of him, unless you are a programmer or journalist who is interested in the Apple ecosystem. But if you are a programmer who has any interest in entrepreneurship, you should know about Marco. He is truly a jack of many trades, master of several, a one-man wrecking ball of an entrepreneur. And I mean wrecking ball in the most positive, awesome way imaginable.
I feel like he might cringe to hear himself described as an entrepreneur. I can hear his joking drawl, the one he uses to mock corporate double-speak and business jargon. Air quotes around "entrepreneur."
Anyway, Marco is Internet Famous, which means that tens of thousands of people read his tweets and blog posts, and probably a similar number listen to one of several podcasts that he hosts. Being Internet Famous kind of sucks. You aren't famous enough to get the best table in restaurants, or get free VIP tickets to concerts, or get invited to parties with rock stars. But you are famous enough that assholes on the Internet (thousands of them) say mean things about you and try to hurt your feelings. More on that later.
I first encountered Marco when I started listening to podcasts in 2010. I listened to a lot of the podcasts on the 5by5 network, and he had a show with Dan Benjamin called Build and Analyze. His backstory at the time was that he was an early engineer at Tumblr. I learned later he was basically the first engineer at Tumblr, which was a blog hosting site that I didn't really understand very well because I'm old. (I was even old in 2010). But I knew Tumblr was cool, and Tumblr was big, so I thought it would be interesting to hear what he had to say. At the time, I was also working on a new-ish web site that was pretty big, probably similar in scale to Tumblr. So I had a professional interest in what he had to say.
On the first episode I listened to, he was talking about technology selection at Tumblr, and then in the other things he was working on. He had a very pragmatic view, which was essentially "use all the tech that the most developers in the world use, and use them in the normal way." I remember first nodding vigorously in agreement, then being rather stunned that this young engineer had completely nailed and could articulate a philosophy that had take me 15 years to figure out. I was a fan from that moment on.
He's first and foremost a software developer, and he very often discusses technical problems he is working on at both a high and low level. If you are a young programmer, these discussions are worth listening to. It turns out that the best work you do as a software developer is not when you are up to your eyeballs in a complicated debug session, but rather when you layout a problem in front of you and discuss or just think about angles of attack, and walk all the way through the implications. It's cliche, but your best moments as a software developer really are likely to happen when you are in the shower, thinking, having just failed to solve some problem in the prior workday (or work week).
Marco has a typical engineer's disdain for corporate business culture. He very often speaks the word "brand" in a teasing, fake-dumb voice, as if he's nervous of losing his nerd cred. However, he understands brand-building that would put many so-called marketing experts to shame. His software creates a total user experience: the design, the interaction, the tone of voice in the apps, the no-nonsense way they serve the user speak to this.
After Tumblr, Marco created the "read it later" app called Instapaper. I don't know if he invented this category of app, but Instapaper was for a while (and may still be) the most popular of these. At a time when content on the Internet was all about free, he was able to design a business model to generate enough income for him to live on. Just by selling software a couple bucks at a time to an audience that appreciated good quality. I became a customer long after I heard him discuss the product at length, not because I thought I needed it, but because I was fascinated by the process. It turned out to be a product I used almost every day.
Here's where things about Marco get really interesting to me. He had this pretty good "indie" software business going, something so many indie developers would kill to have. Then he sold this great popular app. He didn't sell it to go back to a J-O-B job, working for The Man because the indie gig didn't pay enough. He sold it because he wanted to do something else. And who did he sell it to? Another one-man show? No, he sold it to Betaworks, a very well respected, well-known, big thinking, firm that is similar to Idealab. To me, that was a great victory, a huge win for the "little guy." (And that's not a joke about Marco's physical stature.) I was super excited for him, though I had no idea what kind of financial terms he got. I assume they were adequate.
So there was this big mystery now. What was he going to do next? I think by this time he had a new podcast (ATP), and he would give coy hints about what he was thinking of. He ended up releasing Overcast, a podcast player, into an insanely crowded field of other great podcast players. Many of them were free, including one from Apple itself. I encourage you to listen to ATP episode 74, which is where I think he talks about the selection of the name "Overcast," not only the thought behind it, but the trademark process he went through to secure the name. It is a great story about what it means to be an entrepreneur: figure out what needs to be done, even if it's outside of your career training, even if it's boring, weird stuff that needs lawyers and government, and get it done.
As I noted, Marco is Internet Famous. While this certainly helps his new business ventures to some degree, it has a downside. Mostly, the downside is that if you are both Internet famous and financially successful, idiots on the Internet get very bothered. And they feel compelled to tell you in great detail, that you are successful only because you're famous, and you don't really know what you are doing, and all kinds of other horrible and jealous things. Marco, in particular, attracts this kind of negative attention because he wears his heart on his sleeve: he says what he thinks is true. If he sees something that is poorly done, or shady, he is not shy about saying so in plain words. The vast majority of the time, those things that he points out are quite true, which enrages the targets (or the fans of those targets) all the more.
Still, he weathers the storms. When Tumblr was sold to Yahoo in 2013, Marco (being effectively employee #1, or close to it) got a substantial windfall. I don't know anything specific about it, but having been in startups for a long time, and knowing how those kinds of things work, I'd be suprised if it was less than some number of millions of dollars. It's a funny aspect of nerd culture, that when people who are deemed CEO or founder types make hundreds of millions or even billions of dollars, it's just the way it is. But when someone that is perceived as "one of us programmers" makes a small fortune, it really sets off some jealousy.
It's so strange to me. If you are one of the people that follow Marco's work, and writing, or especially listen to him talk on podcasts, it's incredibly clear that he is a truly kind and thoughtful person. Why anybody would begrudge such a man success is mystifying.
Which brings us to the latest part of Marco's story. He (and others) have been discussing the implications of the coming ad-block-ocalypse. In a nutshell, the new release of iOS 9, and the forthcoming release of MacOS include technology in Safari that will allow third party developers to create content-blocking apps.
Marco's notion on this topic, which he has discussed on ATP and on is blog, is complicated. Which makes sense, because the issue is complex. I will try to sum it up as briefly as I can:
Today, content publishers rely on ad revenue to provide their products to readers. Readers, as a population, have been shown to be unwilling to pay publishers more money than advertisers are willing to pay. So content is "free" to the reader, and publishers rely on advertising for revenue. Unfortunately, advertisers have figured out that by using software, they can create more effective campaigns by targeting particular user profiles, and even individual users. This is achieved by rogue's gallery of companies that track our movements not only within web sites, but across sites as we move around the Internet. I think it's possibly reasonable to have such tracking systems, if they are disclosed, and if people have ways of opting out of them. (I made my living from Internet advertising for 10 years, so I am certainly not unbiased).
However, and this gets to Marco's point, the publishers are so desperate for money, and the ad networks are in a race to provide ever more fancy targeting to capture the advertisers, that nobody is paying attention to the quality of web sites. They are literally being crushed under the weight of advertising technology, and in many cases both the good content underneath is unreachable, and in all cases, our bandwidth and our privacy are taken from us without consent or recourse.
So, Marco did what he has done. He said, it's not cool that readers take stuff for free by blocking ads, but it also isn't cool that no one is defending the users' rights to click into a nightmare of privacy violations. Then he released a great piece of software to deal with it. He shipped one of the first, and in my opinion, the best ad- and tracker-blocker for iOS9. It rocketed to the #1 paid app in the store. I was so happy for him. It's just like being a sports fan and seeing your favorite player make the play that wins the championship. Not only that, but he did it by making a deal with Ghostery. This is a real business deal, the kind that serious companies make. Only one of the companies was Marco, which, again, fills me with joy. The app was called "Peace."
You should download it. But you can't.
I say "was called" because after two days he pulled the app. He wrote about it on his blog. There's a battle that's about to start, and it's between the interests of the users who want a fair experience on the web, and the advertisers who want to wring every last penny out of their marketing spend. The victims are likely to be the publishers who can't figure out other ways of generating revenue. It's very sad, and Marco doesn't want to be in the middle of it. I do wish he would give it a shot, but I can't blame him.
There you have it, this odd little fan letter. If want to be your own boss, and make things happen for yourself, (which you should!) you should check out what Marco has done. It's inspiring.
And, if you are Marco Arment, here's to you. I can't wait to see what you do next.Permalink
How to transfer Nike Running data to RunKeeper
I like log my running with a smartphone app. I've tried a lot of them, but I like Nike Running for the clean UI and terse, friendly voice.
However, I like the reporting console available in RunKeeper, and my friends all use that. So if I want to compare notes or just geek out on the data a little, I want to have stuff in RunKeeper.
(RunKeeper has a super slow-talking, verbose voice. It drives me crazy. It says "Average Pace... Nine minutes... Thirty-four seconds... per mile." No shit. My pace is in minutes and seconds per mile? It's not hours or something per league? Thanks for letting me know every fucking time, because I couldn't have figured that out.)
Anyway, so what I do is run with Nike and then once a month I download the GPX files using Nike Plus exporter. Then I log into run keeper and upload the dozen or so GPX files. Easy.Permalink
Notes on the Go Language
I'm playing with the new language Go. I got interested in it after playing with Swift. I really like the idea of a compiled language that has modern syntax and capabilities. I was messing around with scripts and server apps on my Mac. But these experiments had a hard limit: if I ever wanted to do something "real" with a server/web application, Swift is not a viable option. I can't run it on a virtual private server.
Sure, I could scale up a Mac Mini Colo installation, but that is very limiting: there's one and only one hardware and OS vendor to support me and that vendor has a much greater than 0% percent chance of changing something core in the OS that could really break a server app. Apple's target market is end-user consumers, not nerdy developers who want to implement a large-scale web app on a few dozen (or even hundred) Macs.
I started looking at go as an alternative. Go has a similar flavor to Swift: it's modern, compiled, fast and it is open source. I know it is really a creation of Google, but it is cross-platform. If Google abandons it (much greater than 0% chance, I'm sure), there probably is enough critical mass outside of Google to keep it going. At the very least, there is the source code and specification.
I like the idea of a server app being composed of a single language, as least as far as that is practical. It makes moving code and people around a system a lot easier, and you don't get into a situation where, for example, the image server is written in Haskell and the original person who wrote it left the company, and no one wants to touch it. Pick a primary language and use it everywhere you can. If you must write some administrative scripts in Perl or something, fine. But, please, only if you must. (And use Perl for all of them, don't do some things in Perl and some in Ruby and some is Python. Pick one.)
So here are some random notes as I explore Go.
[I paused writing this article to go to lunch and then watch the WWDC 2015 Keynote. Where they announced that Swift 2 will be open source. Which is great, and of course might mean I could use swift as a language for Web apps. However, that is probably at least a year away, and Apple has to pull off doing a real open source effort, not a Sun/Oracle/Java situation.]
Back to Go, for now though.
Debugger: debug supprot on Go seems pretty weak. There are apparently gcc-based implementations of Go, and gdb sort-of works with them. I did find one project on Github that wants to be a complete native debugger for Go Delve
Databases: seems like there is a support for SQL drivers, including MySQL and Postgres.
Frameworks: There are at least a few frameworks under development. Revel looks like it is pretty far along, but it is not yet a 1.0. The documentation is internally inconsistent, for example. Stuff is still changing pretty fast. Another one, Beego looks a lot farther along.
There is a Go SDK for AWS provided by Amazon.
There is a Go plugin for JetBrain's IntelliJ. It's an Alpha.
There is a markdown implementation: blackfridayPermalink
My First Week with Apple Watch
I was pretty excited to get an Apple Watch. I ordered two, one for me and one for my wife. The most interesting thing aspect of the watch to me was the personal communications features. I love the concept of sending a few taps on the wrist to my close family with no more effort than raising my wrist. And they could get that message without it interrupting whatever they are doing. "Hi, I'm thinking of you."
So I ordered two watches on April 10 at around 4am. They are identical except in size: a 42mm for me and a 38mm for her. But they were backordered until May.
Last week one of them arrived early. Of course it was the one for my wife. She's very nice (and isn't an Apple addict like I am), so she let me use hers until mine arrives.
The watch is very nice. For a mass-manufactured product, it is very high quality. I got the steel version with the milanese loop, which is a kind of metal cloth or mesh. It's very comfortable. The 38mm watch is a bit small for me: it's slightly smaller than the mechanical watches I wear.
It took about a day to orient myself to the various "places" in the watch: the watch face; the notifications area; the "glances" which are like widgets; and the app launch screen. After a couple of days messing around, I spent most of my time on the watch looking at the watch face with its summary weather and calendar information, or reacting to notifications. When I first set up the watch, I turned off almost all notifications from apps. The only things I allow are texts, VIP emails, calendar notifications and Slack direct messages.
It's quite a good experience overall. I can't really say anything bad about it, apart from the occasional bug. It's quite excellent for a 1.0 product.
However, it hasn't yet had a big positive impact on my life. Since my wife is not wearing one yet, I don't have anybody to send discreet smiley faces to. That one aspect which I still think might be most revolutionary, I haven't really been able to try.
The other big feature I was looking forward to was to use it for running. I like to go trail running and occasionaly participate in organized races. Part of my enjoyment of running is keeping tabs on my progress with my phone: I've used Nike Running and RunKeeper and Strava. They all are great, but sometimes it's a drag having a phone strapped to my arm. Especially since they have gotten bigger and bigger. So I was looking forward to putting my phone in my back pocket and just using the watch display to track pace and distance.
I ran in a local 10K on Sunday and I used the default workout app that is included in the watch. I think this is the only fully "native" watch running app available. Nike and Strava and RunKeeper watch apps are all basically remote controls for the phone app.
The app worked, and it did track my heart rate as well as pace and distance. However, there were a few problems:
It was quite difficult to read the screen. This was partially because it is hard to see the watch's display in bright daylight, and partially because the text was too small on the watch. Looking at the running display, over 75% of it was blank. It seems to me that they could have made everything much bigger.
I couldn't make the watch display what I wanted. When I run, I want to see total distance, current pace and average pace. If I could only have two of those, it would be distance and current pace. But it seems that distance and current pace are two things that cannot be combined. Or if they are, it was too difficult to figure out while running.
Because the display is off, to check my current pace I had to raise my wrist and hold it for longer than a stride. It would take a second or two to turn on, so I couldn't just glance down as my arm came up in stride naturally. Which is what I do when running with my phone in an arm band.
So it wasn't a clear win over just running with my phone.
After the race I started to miss my mechanical watch. I've worn a watch pretty much every day since I was 10, when I got a wind-up Timex for my birthday. I still have it. But for the past 20 years or so I've worn a Rolex. The first one, my Dad left to me. So it was (and is) special because it was his, and his most prized posession. Years later, my wife bought one for me. That one is special because she picked it out. Even more years later, my wife bought me another one for our 25th anniversary. That one is still new, and I was really missing it while I wore the Apple Watch. (I actually wore the Apple Watch on my right wrist and my regular watch on my left wrist for a whole day. It was awkward. I don't think I'll do that again.)
So I put the Apple Watch back on its charger on Sunday and strapped on my regular watch. It's not fair, comparing a fine handcrafted Swiss watch to a mass-produced, tiny computer. Apple is the best in the world at making high-quality tiny computers, but there is a tangible difference to a Rolex or similar watch. Also a real physical watch face looks beautiful all the time. The Apple watch face is a black piece of glass (well, sapphire crystal) 95% of the time. It's a like a very pretty TV that is turned off. It's not ugly, but it's not beautiful, and it's definitely not interesting.
Plus, when I want to know what time it is, I just look at it. I don't have to make an exaggerated wrist flip and hope it reveals the time in a second or two. It's right there all the time. The time.
I realize that I am not typical. I think that for people that don't wear a watch at all, and want to have a fitness tracker on all the time, the Apple Watch is great. But I do think that though Apple has been aiming to beat the Swiss at their great industry, they have not done it yet. People who like Rolex or IWC or Patek Philippe are not going to be satisfied with the Apple Watch, not even the gold one. It doesn't fulfill the mission of telling time well enough.
I've been two days without the Apple watch. I don't really miss it. I'll put it back on when we have two to try out.Permalink