thoughts from brian samson

The iPhone is not Facebook

The iPhone is a great, magical, revolutionary device. I owned first-gen one for 2 years and loved everything about it (except AT&T). I think it’s great how many apps are out, and how much emphasis the platform has put on software development in general. Without the iPhone I’m sure my Nexus One wouldn’t even exist.

However.

Shaq released an iPhone app today: The Shaq App. The entire point, as far as I can tell, is to watch shaq’s twitter feed. There are about a thousand ways you could have done that already, the easiest of which is going to his twitter page. There is no reason for this.

But Shaq is rich. And social. If he wants to pay somebody to write The Shaq App, that’s fine by me. What spurred this post was a spam I got from contacts.com with this in it:

contacts.com spam

“Our new LensGaugeâ„¢ iPhone App makes it easy. It prompts you when to change your contact lenses. It maintains all pertinent information about your contacts. And it makes re-ordering a snap.”

This LensGauge ™ app is so dumb it is hard for me to properly articulate it. It is dumber than the fart app(s). It is dumber than the “I am Rich” app. It is maybe even dumber than The Shaq App. From the reviews on that page, it sounds like it doesn’t even work (how that is possible is beyond me).

This isn’t new. Lots of companies seem to be “promoting their brand” through “new business channels” by “having a presense” on a “social platform.”

So listen up, all you pillars of industry. You probably don’t need an iPhone app. If your best idea for an iPhone app can be used at most once a year, you definitely don’t need one. If it doesn’t do more than your website, just make your website work on mobile devices. If you just yearn for virtual friends to “like” you, go get a facebook page or open a twitter account. If all you desire is to be “social,” you should probably quit your job, because you are terrible at it.

The iPhone isn’t Facebook, although with 100,000 apps its starting to get pretty close.



New from BrianSamson.com! Really like this blog post? Take it with you! With the new BrianSamson.com iPhone app, it’s like having Brian Samson in your pocket at all times! You can re-read all your favorite posts, and be the first of your friends to know when there is a new post! Download the BrianSamson.com iPhone app today! (Coming soon to Android and iPad)

The worst comment I’ve ever written

I’m sitting here trying to debug a very complex piece of “meta” code. This code generates web forms that have fields that automatically show/hide based on the selections in other fields. It’s usually very nice to work in, and it makes creating dynamic forms easy, but it is insanely complex under the hood. I finally find the source of the bug is a hip, railsey, ruby one-liner. It’s not to hard to figure out what that line does (adds some kind of prefix to each key). However I have no idea why it would do that. Luckily when I wrote this code I knew this was confusing, so I included a comment:


if (@if)
#in case this is being rendered in a subsection, the key
@if.each {|andor, array| array.each {|h| h[:key] = field_name_prefix + h[:key] }}
end

Except I forgot to finish it. The key…. the key….. WHAT ABOUT THE KEY YOU IDIOT?? This is the worst comment I’ve ever written. It is worse than no comment. No comment wouldn’t have got my hopes up….and then crushed them. Why isn’t it lunch time yet?

Kiln’s kilnauth.py crashes under python 2.4

We recently switched to using Mercurial hosted at Joel Spolsky’s Kiln. So far I love it. I think distributed source control is the way of the future and I’m all for it.

Anyway, Kiln provides a number of useful Mercurial plugins, one of which is called ‘kilnauth’ and helps by caching your http authentication cookies so you don’t have to enter your password a bunch of times. I was setting this up on our linux box, which only has python 2.4, and kilnauth was causing a crash when it tried to do an md5 hash. The fix is pretty easy. Near the top where they import the md5 library, change this line:

try:
    from hashlib import md5
except:
    # Python 2.4
    import md5

To this:

try:
    from hashlib import md5
except:
    # Python 2.4
    from md5 import md5

That’s it. Simple little typo that they probably just didn’t test.

And on the subject of passwords, if you are bothered that capistrano outputs your inline http authentication passwords to the console, you can install this gem I wrote, cap_password_filter, to fix that.

To help out with searching, I’m including the full stack trace of the error:

** unknown exception encountered, details follow
** report bug details to http://mercurial.selenic.com/bts/
** or mercurial@selenic.com
** Mercurial Distributed SCM (version 1.5)
** Extensions loaded: kilnauth
Traceback (most recent call last):
  File "/usr/bin/hg", line 27, in ?
    mercurial.dispatch.run()
  File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 16, in run
    sys.exit(dispatch(sys.argv[1:]))
  File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 30, in dispatch
    return _runcatch(u, args)
  File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 47, in _runcatch
    return _dispatch(ui, args)
  File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 466, in _dispatch
    return runcommand(lui, repo, cmd, fullargs, ui, options, d)
  File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 336, in runcommand
    ret = _runcommand(ui, options, cmd, d)
  File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 517, in _runcommand
    return checkargs()
  File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 471, in checkargs
    return cmdfunc()
  File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 465, in 
    d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
  File “/usr/lib/python2.4/site-packages/mercurial/util.py”, line 401, in check
    return func(*args, **kwargs)
  File “/usr/lib/python2.4/site-packages/mercurial/commands.py”, line 677, in clone
    branch=opts.get(’branch’))
  File “/usr/lib/python2.4/site-packages/mercurial/hg.py”, line 209, in clone
    src_repo = repository(ui, source)
  File “/usr/lib/python2.4/site-packages/mercurial/hg.py”, line 82, in repository
    repo = _lookup(path).instance(ui, path, create)
  File “/usr/lib/python2.4/site-packages/mercurial/httprepo.py”, line 271, in instance
    inst.between([(nullid, nullid)])
  File “/usr/lib/python2.4/site-packages/mercurial/httprepo.py”, line 190, in between
    d = self.do_read(”between”, pairs=n)
  File “/usr/lib/python2.4/site-packages/mercurial/httprepo.py”, line 134, in do_read
    fp = self.do_cmd(cmd, **args)
  File “/usr/lib/python2.4/site-packages/mercurial/httprepo.py”, line 85, in do_cmd
    resp = self.urlopener.open(req)
  File “/home/xxx/kilnauth.py”, line 145, in open
    cj = get_cookiejar(ui)
  File “/home/xxx/kilnauth.py”, line 66, in get_cookiejar
    cookie_path = os.path.join(cookie_path, md5(current_user).hexdigest())
  File “/usr/lib/python2.4/site-packages/mercurial/demandimport.py”, line 71, in __call__
    raise TypeError(”%s object is not callable” % repr(self))

Survivor: Kitchen - Orange Chicken

Orange Chicken

Tonight we didn’t feel like going to the store so I thought I’d play a little Survivor: Kitchen. I found a chicken breast in the freezer, so I let it defrost in some teriaki/peanut oil/salt/peper and then sauted it with onion, red and green peppers, and an orange. The sauce was mostly (and probably too much) orange juice with a little plum sauce (no idea why I have this) and sriracha. I added a little brown sugar at the end because it wasn’t sweet enough. The chicken was a little over cooked because I left it in the wok while the sauce was reducing, but overall it was pretty good and it didn’t get voted off the Island.

National Security, FUD, and the Media

Bruce Schneier pointed out a couple of interesting posts about national security today, specifically about how politicians (Bush and Obama) exaggerate the threat of terror for their political ends (duh). The first one, at Tom Englehart’s blog, is a very good read. Obviously, the risk of being killed in a terrorist attack is much smaller than the risk of getting in a car wreck, being murdered on the street and even being struck by lightning. But that doesn’t stop the President from using even a failed attack like the Christmas “Underwear Bomber” to spend a bunch of money and increase further the power of the executive office. I suggest you read the whole thing.

Bruce also linked to a newsweek article with similar sentiments. As I started reading this one I was thinking it was quite refreshing to hear the “chill the fuck out” message coming from the mainstream media:
Newsweek headline

However, if you scroll down just a little bit, you see that Newsweek can’t take it’s own advice as they attempt to generate a little more advertising revenue with a scary picture of a terrorist and an alarmist link:
Newsweek trys to scare you

I guess I shouldn’t be surprised the media can condemn politicians for “tough-guy bluster” and in very the same article advertise a link to the 10 scariest terrorists they can find. What does surprise me is that anybody takes this hypocritical rag seriously enough to pay for a subscription to it.

Word count in your Browser

My wife is taking an online class that has a requirement that she make some number of forum posts on their blackboard. This is not uncommon for online classes to encourage participation. The ridiculous part is that she is required, at the end of her post, she needs to include the number of words she wrote so that the instructor knows the post is long enough. So she ends up launching Word and writing her post over there so she can use the word counter over there to make sure she gets all her words. So I thought I’d be nice and write a little bookmarklet that does this for her:

Word Count

Drag this link up to your bookmarks bar and click on it and it will tell you the number of words you’ve typed into all of the text areas on the page. It reports the count back using the internal name of the field, but that will usually be enough to figure out which field you’re typing in. It also counts the number of words you have selected in the web page, just because its easy to do. I hope this helps somebody else out there meet arbitrary post length guidelines.

Internationalization is Hard

Either that or programmers are lazy. I’ve been working on an App at work that requires internationaliztion, and until you get used to doing it, its very easy to let strings just leak through. I just installed Google Chrome, and right there on the first prefs page is a whole slew of I18n bugs: Chrome-es

They missed a translation and another couple don’t fit in the space and just run off the page into oblivion. These bugs are annoying to fix, but at least they are easy to find: Just change the locale on your computer while you develop. Only one person on the team really needs to do this.

I have my computer’s language set to spanish, so I notice these problems right away while testing, which is certainly something you should do for at least a round of QA before you ship, but preferably while you develop. You can make it fun if you write a pirate locale or something, but you should absolutely be running your app in a language other than english before you can even come close to calling it finished.

Leaving AT&T Wireless? Make sure you call them first.

I cancelled my AT&T/iPhone account last month on the 15th (1 day after my 2 year contract was up) and switched to T-mobile. During the phone number porting process, T-mobile told me I didn’t need to do anything to cancel my old AT&T account, which is true and worked great. I’ve spent the last 3 weeks in cell phone heaven, making calls in my house, receiving text messages, having service in restaurants, and generally enjoying life. Until today when I got a bill from AT&T.

By sheer coincidence I also had my credit card number stolen about a week prior to switching. This is important because I was on AutoPay with AT&T on that card, which I obviously cancelled as soon as I heard it was stolen. Today, I get an e-mail from AT&T that says I’m $67 (a full month) overdue on my account, plus a $1 late fee. When they tried to bill me for the full month of September, the credit card declined and they didn’t get paid. So I call them up this morning to get this resolved and without even asking for a bill reduction, the phone rep says he’ll go ahead and “manually pro-rate” the account down to $32, which sounds about right to me. AT&T was happy to auto-bill my account for $35 they knew didn’t belong to them, hoping I wouldn’t notice it.

So this is just a reminder that when you switch cell companies mid-month, they’ll happily bill you for the entire thing if you don’t call and remind them not to steal from you. Also, I’ve heard reports from friends that T-mobile did the exact same thing, so this is probably widespread across the cellular industry. Call your old wireless provider when you cancel. The number-porting auto-cancel is certainly convenient, but it could also cost you quite a bit of money, especially if you cancel early in your billing cycle.

Yahoo learns nothing, enforces “security questions”

I play fantasy football on yahoo. For the last few weeks they’ve been hassling me to enter “security questions” so I could reset my password if I forgot it. I already have an alternate e-mail address registered with them in case I forget the same password I’ve been using for 5 years, so I’ve been clicking “Later.” Until today, when I went to adjust my team and saw this:

Yahoo security questions

This is infuriating to me, especially considering how badly yahoo got burned in the media after that UTenn student “hacked” Sarah Palin’s e-mail address. I really wish that people would stop doing this, or at least make it not mandatory. Even Time Magazine had an article about how stupid these questions are.

So please, internet, I’m begging you to stop doing this.

AT&T’s nework ranked last in two thirds of US

I’ve blogged before about how horrible the AT&T service on my iPhone is, and how unrepentent they seem to be. Well JD Power has a press release out today, optimistically titled Overall, Wireless Carriers Reduce Dropped Calls, Failed Connections and Static, Driving an Improvement in Call Quality Performance. What’s funny (sad?) is that AT&T isn’t mentioned even once in their press release. I guess they’re heeding the old advice, “If you can’t say anything nice, don’t say anything at all,” because AT&T ranked DEAD LAST in call quality in the West, Southwest, Southeast, and Northeast. They did rank 2nd in the Mid Atlantic and North Central (3-way tie), but that doesn’t help me living in Arizona, or anyone else living anywhere outside of Maryland or Ohio maybe (what is the north central anyway?).

This is not a surprise to me, because this is the reason I’m planning on leaving AT&T as soon as my original iPhone contract expires next month. What is a surprise is that they’re still allowed to advertise as having “More bars in more places.” I think they get away with this by crafting their messages to emphasize that they have better coverage “worldwide.” Which is not really true anyway since they just piggyback on other carriers’ networks, and then charge outrageous rates that range from $0.79/minute in Canada, $0.99/min in Mexico, $1.29/min in most of Europe, all the way up to $2.29/min in Japan, and $2.49/min in the U.A.E., which has the most cell phones per capita of any country in the world. But hey, they just say they have the bars, not that you can afford to use them.

Not that I am a much of a globetrotter, but T-mobile has probably the same international coverage as AT&T (since AT&T likely uses T-mobile’s European network extensively), and their international roaming rates are mostly cheaper as well, $.49 in Canada, $0.99 in europe, $1.49 in Mexico, $1.99 in Japan, $1.99 in UAE.

So my plan is to switch to T-mobile as soon as possible and give the HTC Magic/MyTouch Android device a try. And if I don’t like that, I can always fall back to my trusty 2G iPhone, which is already unlocked for use outside of AT&T’s crappy network.

« Previous Entries