Proud of the award; not proud of the organization

Almost 20 years ago, I became an Eagle Scout. This took a lot of work and taught me leadership and many skills that help me all the time. I am extremely proud of my accomplishment and it is pretty apparent in my office where I have my Eagle Scout award hanging on the wall.

As most people are aware, the Boy Scouts of America has some facets to it that are extremely conservative especially when it comes to its views of gays and religion. The recent case of an Eagle Scout candidate being denied the award is deep rooted in religious views that seems to dominate some policies of the organization. Nowhere is it stated that gays can’t be leaders and/or earn the rank of Eagle Scout. Some claim that being gay is not part of “to do my duty to god” or being “reverent”. This brings religion into an organization that doesn’t teach religion and should keep religious debate to adults and not bring Scouts into it.

This is discrimination and hatred pure and simple. It doesn’t make the candidate any less deserving because of his views and really makes the organization look bad. While it will be too late for some Eagle Scout candidates, Randall L. Stephenson, the CEO of AT&T has vowed to end this discrimination when he heads the BSA in 2014; it can’t come soon enough.

It is my belief that the concept of religion should be completely removed from Scouting as the only thing that religion seems to do is create controversy and hatred. However, as the organization doesn’t specifically say what “god” is, it can be interpreted in many ways. I don’t recall if the handbook talks about organized religion, but I also don’t think that atheists should be excluded. Maybe their “god” is Mother Earth. Maybe it is family. Who knows, but to exclude people based on beliefs is teaching the wrong message.

The Boy Scouts should be ashamed of its practices; I, however, will not give up my Eagle Scout award and will continue to say that I am an Eagle Scout. I hope that things can change in the organization with the change in leadership.

Working for “the man”, 2 years later

Three years ago this May, I quit my job and started being an independent software developer doing contract work. I decided that I was tired of my IT job and wanted to go back to writing code all the time (which was a change from a year and a half before that where I was tired of writing code). Working for my last company made me realize that I no longer wanted to work for anyone else and I wasn’t going to work for a large company again (I worked for Qualcomm at the beginning of my career. I wanted to be in charge of my work and control my own destiny; I believed that I could only accomplish this being self employed.

About six months after that, I was offered a full time position with eBay and took the job. This, of course, went against me not working for someone else and not working for a large company. Many factors went into the decision, one being getting to work with a lot of really good people; something I hadn’t done in years (I had worked with good people, but only a handful).

One of the keys to job happiness, I believe, is good management. Management has to balance overseeing employees with giving them the freedom to do their jobs. I’ve been quite lucky to have a manager that does this well. I’ve also been giving the opportunity to work on a number of projects and put my finely tuned skills to work. While I’ve had some difficulties on some projects, my manager has helped me through them and put me in a position that some say is enviable. At the moment, I control a lot of what I do; based on high level goals, I get to decide what to do on a day to day basis. This is what I believe I wanted when I told myself I wouldn’t work for anyone else again.

As for the large company, I work in a group that is fairly small and almost acts like a small company so I don’t feel like the big company is constraining me.

I’ve come to realize my flip flopping on not wanting to write code and then write code has to do with a good mix of work which I haven’t had until now. I was either writing code all the time or not writing code at all; I’m now in a position that I get to write some code, but I also get to do other things such as think about high level application architecture. If I want to write code, I have the flexibility to do that.

So, while I’m not saying that this is the perfect job (there is no perfect job), I’m quite content and plan on sticking around for awhile despite the constant recruiters contacting me from companies whose products you use everyday.

Bluetooth Knowledge Followup – Apple Radar Filed

In my last article, I wrote about an issue I had with my Bluetooth heart rate monitor and my Bluetooth headset. After analyzing the issue and trying to reproduce the issue, I was unable to do so in my office and then on my next run, everything working perfectly. However, on my run this morning, the problems came back. When I got home, I turned off RunKeeper and ran my test app. My test app either disconnected or I heard an audio dropout every 6 seconds. The big difference between my initial tests and this test was that my heart rate was up and the contacts on the heart rate monitor were conducting quite well. This would indicate that the issue is not a RunKeeper issue, but either an iOS issue or an iPhone 5 issue.

I’ve gone ahead and reported it to Apple as radar://13004711. Based on my past history with Apple bug reports, I don’t expect a resolution any time soon. This would be quite unfortunate as more and more Bluetooth devices come on the market.

Using my Bluetooth knowledge

In November, I saw that TI announced a product called SensorTag which is basically a development board for working with Bluetooth 4.0. I was immediately intrigued as iOS 5.0 supports Bluetooth 4.0 (LE) and lets me write apps that aren’t certified by Apple via the Made for iPhone program. I ordered the device (it was $25 which I consider a bargain) and then in early December, it arrived.

While I had no real use for it, I decided to learn how to write code to use Bluetooth LE and wrote a app that monitors all the sensors in the SensorTag and reports them. The TI app did this, but wasn’t very elegant and I also wanted to add alarms for high/low temperature. A few weeks later (I worked on it an hour at a time in the evenings), I finished my code and had a working app. Since I don’t have any plans to monetize my work, I’ve made all the code available under an MIT license. One of the comments I’ve received about my work is that my code is better than the code provided by TI! It might be that I’ve been writing Objective-C and iOS code for awhile or my goal was to produce an app that anyone could use. In any case, I may release it to the app store, but the audience is quite limited as it requires the SensorTag which is basically a developer/hacker tool.

Now, where was I going? With all this Bluetooth 4.0 knowledge, what should I do next? I wanted to learn something new and I did that; I likely won’t make any money from my new found knowledge, but it is fun playing around with it. However, today while I was running, I determined what I could do with the knowledge.

Let’s rewind a few months. When I run, I take my iPhone, use a pair of Motorola S10-HD Bluetooth headphones and a Wahoo Fitness Blue HR heart rate monitor. I use RunKeeper to log all the data. I have been using this combination successfully for many months and have been quite happy with it. When iOS 6 came out and I got an iPhone 5, things started going downhill. RunKeeper was no longer able to talk to my heart rate monitor and they blamed Wahoo Fitness as they use a Wahoo Fitness library to talk to the heart rate monitor (the library also supports ANT+ heart rate monitors via a Wahoo Fitness dongle). After a few app updates, RunKeeper appeared to support the heart rate monitor again.

After hurting my foot and then being sick, I started running again on Sunday. During that run, I noticed that the heart rate monitor reported accurate results via RunKeeper, but my music kept cutting out periodically. I initially blamed the Motorola headset as I’ve already had to return one pair due to the buttons failing. Today I ran again and noticed the same problem. However, I decided to count how often the drop outs occurred. The drop outs occurred every 6 seconds. For anyone doing sampling of data, this should ring a bell. Every 6 seconds is 10 minutes per minute which is a reasonable period to be sampling data. I took off my heart rate monitor, put it in my pocket and after a few minutes when the Bluetooth connection disconnected, my music continued without drop outs!

So now I knew the problem wasn’t necessarily with the Motorola headset, but there were too many variables:

  • Switched from iPhone 4S to iPhone 5
  • Went from iOS 5 to iOS 6
  • Updated RunKeeper

The only pieces of the equation that hadn’t changed since everything was working smoothly were the Bluetooth Heart Rate Monitor (it is a Bluetooth 4.0 device) and the Motorola headset. Having worked with earlier versions of Bluetooth, I thought that maybe there was a conflict between the Bluetooth devices. However, the devices remained the same and only the phone had changed. How was I going to track down the problem? Since I now knew had to write a Bluetooth LE app, I decided to write an app to talk to the heart rate monitor and get readings. This turned out to be a simple task and took about an hour to write the app. I ran the app and played music through the headsets; I was expecting to hear dropouts, but no such dropouts occurred. So, this little test told me that the iPhone 5 with the Wahoo Bluetooth 4.0 Heart Rate Monitor and Motorola Bluetooth headset could all be operating at the same time without problems.

So what next? I ran RunKeeper again and tried to duplicate my results from my run, but was unable to do so. Granted I wasn’t running, but I expected to have dropouts. I’ll go for a run tomorrow and see what happens. I’m a bit suspicious about the Wahoo Fitness library as Bluetooth 4.0 is quite simple to talk to the heart rate monitor. I turned on the option for the device to notify (and not poll) the heart rate monitor and received an update every 2 seconds. So if the Wahoo Library was using the notify option, I wouldn’t have heard dropouts every 6 seconds.

I think that this issue is worth a look as the Wahoo Fitness library is doing something funky and that RunKeeper can directly talk to the heart rate monitor without using the library. If the library is polling, it should be changed to use the notify feature of Bluetooth 4.0.

Streamlining Receipt Entry

As many that read this blog know, I started scanning in all of my receipts over 6 years ago and pretty much every piece of paper (of some value) that comes into my house gets scanned and then shredded or filed (I’m still not sure why I file it; some places don’t accept copies of receipts, but a lot of paper doesn’t need to be saved). I use a Fujitsu ScanSnap scanner along with Mariner Software’s Paperless to store everything. I’ve used a bunch of scanners and still have a few lying around my house.

Yesterday I saw a tweet from Dan Frakes, an author at Macworld magazine about using an Eye-Fi card with a Doxie scanner to wirelessly scan. This got me thinking as I had an Eye-Fi card that was just lying around; my wife and I both have iPhones and use them for a majority of our pictures (the best camera you have is the camera you have with you). I also had a BulletScan M40 that was unused. Since the M40 takes an SD card, I thought this would make a great combination.

My plan was to setup the M40 and Eye-Fi card to send all the images to my media center (it is on all the time) and then use Dropbox to sync the files back to my main machine. (If this sounds familiar, I setup something similar two years ago with my Brother scanner.) This morning, I went to set everything up only to discover that for some reason the M40 didn’t recognize 8 GB cards, both the Eye-Fi one and one I had lying around. It didn’t have a problem with the 256 MB cards. I reformatted the Eye-Fi and tried lots of tricks and basically gave up. However, after staring at it, I realized that the SD card reader that came with the Eye-Fi was lying on my desk. I plugged the Eye-Fi card into the card reader and then the card reader into the M40. Presto, everything started to work.

To put the finishing touches on my new setup, I used Automator to setup a Folder Action that would rotate the images downloaded from the Eye-Fi and then move them to a folder on Dropbox. This offloaded the processing and saved me a step on my main machine.

My 5 year old son was so mesmerized with the scanner, all he wanted to do was scan receipts and see them show up on my machine. He has no idea all the magic that goes into it; he just knows that the scanner is not connected to my computer and receipts show up. Now all I have to do is recruit him to scan in all of my wife’s receipts!

(Yes the ScanSnap is much faster at scanning in receipts, but this setup will be much easier to use for my wife and she doesn’t have to take over my computer to enter her pile of receipts.)

Suggestions to SeaWorld

Yesterday my family and I went to SeaWorld as it is now an annual thing for us to visit a theme park (last 2 years was LEGOland). I expected there to be some people (tourists and others that don’t celebrate Christmas), but thought it would be a breeze to get into the park. We left our house around 9:40 for a 10 am opening of the park. We live less than 10 minutes away, so 10 minutes to get in, get parked and get to the gate did not seem unreasonable to me as we’ve done it before.

We get to the parking lot and had to wait in a line. That’s the first problem. The way SeaWorld does parking is they have multiple gate houses (that’s what I call them) with 1 car lane on each side. Each gate house can accommodate 2 people, one person on each side. Well, SeaWorld decided to staff each gate house with 1 person meaning that instead of 2 cars going in at a time, only 1 went in at a time. You would think that this was done to slow down traffic in the parking lot, but there was practically no moving cars in the parking lot. I also noticed that one gate house was empty, so there were no cars at it.

If that wasn’t bad enough, the 1 person has to take your money or pass, go inside, ring it up on the computer and print out a receipt before returning. So with the great invention called mobile terminals, they should be able to collect money/credit cards/passes without having to go inside. Combine this with 1 person per lane and more cars could get in faster. If you were unlucky and pulled your car on the left hand side of the gate house, your passenger (or you if you don’t have a passenger) has to hand everything through the passenger window. Putting a person on each driver’s side window would make it easier.

After we made it through that line, we had to park. At DisneyLand, there are people directing you to empty spots and basically don’t let you park wherever you want. SeaWorld kind of makes it a free for all which causes empty spaces. So people cruise up and down the aisles looking for empty spots (we did that and found one pretty quickly).

We thought we were home free and the long lines were people buying tickets. We were wrong; the long lines were to get in. They had 2 entrances open which meant that 4 people at a time could get in. Then when we got to the front of the line, the same problem they’ve had for ages showed itself again. That was their horrible ticket scanning machines. These machines require you to put your ticket on a platform and line up the X to read the barcode. They are slow and problematic. Then for pass holders (and presumably multi day ticket holders), you have to put your finger on the biometric scanner which seems to be flakey as well. Yesterday, the machines flat out didn’t work, so the people at the entrance had to use handheld devices and scan the barcodes. While barcode scanning is a fairly fast process, lining up the barcode takes time especially if you’re trying to hold the device and the ticket. Using a magnetic stripe on the ticket like they do on many transit systems would speed up the process. The downside is that people that printed tickets at home would have to exchange them for encoded tickets. Since there were a number of unused automated kiosks, this doesn’t seem unreasonable. While this does shift the line, it only shifts the line for those that printed tickets at home.

While this may sound like I’m complaining, a trip to a Disney theme part shows that these problems have been thought out and solved a long time ago. I’m not sure if the current owners of SeaWorld don’t want to invest the time or just don’t care. It could be the latter because people still come to the park and are just grumpy until they get inside and forget about the 40 minutes to actually get there.

Suggestions on busy days

  • Staff each parking gate house with 2 people.
  • Open all parking gate houses.
  • Use mobile terminals for parking payment collection.
  • Put people on driver’s side of each lane and not stay in gate houses.
  • Have people directing cars to fill in every spot.
  • Open more entrances to let people in.
  • Get more reliable ticket reading machines.
  • Use magnetic stripe tickets instead of barcodes.

Inaccurate speed tests

One of the most popular ways to test Internet connection speeds is to use speedtest.net. The problem with using a site like this is that providers sometimes have a feature that increases the bandwidth for the initial part of the download. This allows for faster downloads of smaller files. Unfortunately this really messes with speed tests. For instance, I’m now getting 15 megabits per second down, but the tests are telling me that I’m getting 28-30 megabits per second. This would be fabulous if I got it, but I don’t. A more accurate test is to download a large file from a fast host. In my case, I download stuff from Apple and get about 2 megabytes per second which is 16 megabits per second. This is more in line with what I’d expect.

Love/hate relationship with Cocoa bindings

When I started ReceiptWallet over 6 years ago, I wanted to use the latest and greatest Mac OS X technologies, so I used Cocoa bindings to make it easier to bring the UI to life. Bindings allowed me to write less code and have UI elements updated automatically based on what was selected and other variables. Bindings work great for simple cases, but once things start getting complex, bindings almost become a problem. Bindings are quite hard to debug as there is no one place where you can see all the bindings and one slight change to the code can cause a crash; tracking down the crash can take hours. I had to write custom debugging routines to examine the bindings and eventually shipped a stable product.

Fast forward 6 years. This past week I wanted to write a simple app and choose to use bindings again to link up the user interface. This app didn’t do much, but it took me hours to figure out bindings again discovering that I had forgotten almost all I learned about bindings and the documentation wasn’t much help. My biggest problem was that I accidentally setup a binding for an NSTableView in addition to setting up a binding for the NSTableColumn. Of course, nothing warns you of this and debugging is a nightmare. I’m sure if I started using bindings again I’d get better at them, but with as infrequently as I write Mac applications, I’ll probably struggle the next time I attempt to use them.

Is there a simple guide I’m missing? Should I abandon bindings completely? I have no idea.

Abusing NSDictionary

Lately I’ve been more aware of developers using NSDictionary where a class should be used. While it may seem easier to use an NSDictionary to store data and pass it around, the lack of type checking and easily mistype keys is prone to failure. Creating classes with a bunch of properties has gotten even easier with the latest version of Xcode; you don’t even have to synthesize properties. Just define the properties and presto, you have a class where you would have used an NSDictionary. NSDictionaries have their place, but in many cases classes serve developers better.

Social media for customer service

In the last few years, people have taken their frustrations dealing with customer service reps to social media. Companies, in turn, are reacting quite quickly to complaints and reaching out to customers. While I’m not sure I’m a fan of jumping on social media before giving companies a chance to fix the problem, it seems to be an amazingly effective tool.

Last month I returned my cable modem to avoid the $3.95 monthly lease fee that is now being charged and replaced the cable modem with the same model that I bought off eBay for $23. I had to goto a Time Warner Cable store to do this and got a receipt for the return. Like all the paper I collect, I scanned in the receipt and stored it in Paperless. When I received my next bill, I saw that I was still being charged for the lease (it is billed one month in advance), so I contacted customer service via the web chat and tweeted about it. I got a direct message asking if they could help, but I had already gotten it “resolved” via the standard channel. I thought my tweet complaining was legitimate as I shouldn’t have had to contact customer service after waiting at the store and returning the modem. Problem solved, or so I thought.

I just got my latest bill; it had a $3.95 credit on it, but the cable modem lease fee was still being charged. OK, so now I’ve gone through the official channel twice to fix this issue. I tweeted again and this time corresponded with their social media folks who said they escalated the issue. Awesome service on a Saturday by the social media folks, but this kind of issue shouldn’t have required me to do this.

So the moral seems to be, if a company wrongs you, they are much better at fixing the problem if you complain in public. I’m not saying that this is the way to go, but if the front line folks aren’t capable of doing their jobs correctly, then I’m not going to waste my time and will just use Twitter as my complaint board. While I’d like to say that companies will do a better job at fixing things the first time, social media probably isn’t going to change that.

I have my fingers crossed that I’ll not only get credited the $3.95 for the charge for the cable modem this month, but the recurring charge will be taken off my bill. However, given the track record, I suspect that I’ll either get the recurring charge taken off or the credit, but not both. If that is the case, I’ll be taking to Twitter again next month and possibly doing a chargeback on my credit card; I have very little patience for things not done right the first or second time. Yes, it is only $3.95, but it is the principal that matters to me.