Preston And AT&T Give Each Other The Finger

I made the jump the last day before Verizon stopped offering unlimited data plans. The delay for switching to Verizon was not lack of motivation–AT&T service has always paled to Verizon in Arizona and is nearly nonexistent at my summer home–but in desperate procrastination of dealing with the migration process. My longest conversation (highly abbreviated) with AT&T on the matter took about an hour and was so traumatizing that I can’t see myself ever returning. As far as I’m concerned AT&T is dead and buried:

Coverage map showing AT&T's miraculous ability to provide "Best" service without operational towers.

 

Me: I’m not happy with my AT&T service and would like to cancel my service plan.

Customer Service Representative: I’m sorry to hear that, sir. May I ask why?

Me: I’m in an area with about 1-bar service about half the time, no 3G data (EDGE only), and constant dropped calls. I’m not really getting “service” per se.

Rep: I’m very sorry to hear that. We can cancel your plan for $<huge fee>.

Me: Well… I really don’t think that’s entirely fair. The issue isn’t really that I don’t WANT service, but AT&T isn’t providing what I’m already paying for. I’m paying about $100/month for unlimited 3G data, <list of other features>, and I only get a few of them some of the time. Check the coverage map.

Rep: Yes, sir! I can see you live in a “Best Coverage” area. That is very good!

Me: 1-bar signal 50% of the time, no 3G and dropped calls the other 50% is “Best Coverage”?

Rep: The map shows we have multiple towers in the area! You should be getting great service according to the map.

Me: I understand what the map says; I’ve seen it many times, trust me. The issue is not just me, though. No one else with AT&T seems to get usable service here, either.

Rep: I’m very sorry to hear that, sir. One of the towers is not operational. That may have something to do with it. Would you like us to send out an engineer to test your hardware?

Me: Wait… what? First, my hardware is fine. It works fine in <other cities with service>. No one else’s phone works well here on AT&T’s network, either. Second, if you’re dispatching an engineer wouldn’t it make sense to fix the tower instead? …You know, the NOT OPERATIONAL one that is currently providing “Best Coverage”?

Rep: Unfortunately we cannot do that, sir.

Me: It doesn’t make sense to charge me for a service you just admitted you can’t provide. I understand I’m under contract and don’t dispute that, but AT&T has obligations, too, and if AT&T can’t meet them it isn’t right to punish the customer.

Rep: Unfortunately, sir, it is your fault for choosing to live in an area without good service coverage.

Me: ARE YOU FUCKING SERIOUS??? I checked your goddamn map before, during and after moving here, and the fucking thing says “BEST COVERAGE” despite having a non-operational tower. I’ve been here for some time now and it’s never been any better.

Rep: Yes, sir! Coverage in that area is strong. Would you like us to send out an engineering to test your equipment?

Me: YOU JUST SAID A TOWER IS NOT OPERATIONAL. SOME GUY WAIVING MY PHONE TO THE SKY IS NOT GOING TO MAKE IT CONNECT TO A TOWER THAT DOESN’T WORK. DO YOU UNDERSTAND WHAT THE FUCK A CELL TOWER DOES?

Rep: Like I said, sir, it is AT&T’s policy to charge cancellation fees according to your contract. We cannot even consider overriding them in such a strong service area.

Me: <Infuriated abrupt disconnect.>

So, I’m now staring at a ridiculous cancelation bill. On the bright side, though, I sold my old AT&T iPhone the next week via eBay for over $200, which not only covered the new Verizon hardware cost but activation fees as well. I’m not getting great 4G on my Mifi (which was disclosed though), but at least I’m getting ok 3G and voice service on my iPhone for about the same price. AT&T? Please.

Google AdWords Account Access: A Cacophony Of Stupid

If I haven’t blabbed your ear off already, OpenRain has a small business web presence product called the Online Business Platform. It’s a big deal as it’s fairly unique in many different ways.
Anyway, the the upper service level options include consulting and advisement on advertising with Google AdWords, which means we generally need access to the clients AdWords account to monitor progress and such.
The problem is that AdWords accounts have the idiotic restriction of allowing a given email address to be tied to only one AdWords account. In other words, preston.lee@example.com can be granted access to OpenRain’s Adwords account, but not client accounts nor other side-project accounts. Google Analytics, on the other hand, allows for a single email address to manage multiple Analytics accounts in a much saner manner. Considering the amount of revenue Google generates from paid Internet marketing, accessing multiple AdWords accounts is a 7-layer stupidburger with extra retard sauce. I’m sure there’s a wonderful technical rationale that generates rainbows of technical applause, but as a user I couldn’t care less.
To answer the “How do I manage multiple AdWords accounts?” question, Google created My Client Center (MCC): essentially an AdWords account management aggregator. The kicker? To create an MCC account–and yes, it’s a separate account–you can’t use the email address for the account(s) you’re trying to aggregate. We ended creating a silly AdWordsIsStupid@example.com email group and use that email address to create the MCC, which is turn gets granted access to your different AdWords accounts that are, again, all tied to different email addresses.
So when I say AdWords account access is a cacophony of stupid, I mean it. N+1 email addresses required-level stupid.

If I haven’t blabbed your ear off about it already, OpenRain has a small business web presence product called the Online Business Platform. It’s a big deal as it’s fairly unique in many different ways.

Anyway, the upper service-level options include consulting and guidance on advertising with Google AdWords, which means we generally need access to the clients AdWords account to monitor progress and such.

The problem is that AdWords accounts have the idiotic restriction of allowing a given email address to be tied to only one AdWords account. In other words, preston.lee@example.com can be granted access to OpenRain’s Adwords account, but not client accounts nor other personal side-project accounts. (Google Analytics, on the other hand, allows for a single email address to manage multiple Analytics accounts in a much saner manner.) Considering the amount of revenue Google generates from paid Internet marketing, maintaining access to multiple AdWords accounts is a 7-layer stupidburger. I’m sure there’s a wonderful technical rationale that generates rainbows of technical applause, but as a user I couldn’t care less.

To answer the “How do I manage multiple AdWords accounts?” question, Google created My Client Center (MCC): essentially an AdWords account management aggregator part of an optional “Google Advertising Professionals” program. The kicker? To create an MCC account–and yes, it’s a separate account–you can’t use the email address for the account(s) you’re trying to aggregate. We ended creating a silly AdWordsIsStupid@example.com email group, and used that email address to access the MCC dashboard, which is turn gets granted access to your different AdWords accounts that are, again, all tied to different email addresses.

So when I say AdWords account access is a cacophony of stupid, I mean it. N+1 email addresses required-level stupid. Bad Google!

Major Seagate/Maxtor Fail

drive_failIt’s Friday, 10pm, and I’m not a happy camper. This picture is me holding a pile of ordinary hard drives I keep on my home desk. They are cycling backup drives and are not in any way frequently used. Four are Seagate Barracudas–one of which I’ve already had replaced–and the fifth a Maxtor DiamondMax. The oldest of the bunch appears to be from 2002 and all are PATA 200-250GB models. 

I’m unhappy because I picked them up tonight to run a very infrequent backup of all my household data: over a TiB worth while requiring the use of all of them for a complete home backup. Much too my dismay, I won’t be running any backups this weekend.

Failure rate: 100%. (5 out of 5 failures.)

I haven’t been this unhappy with a manufacturer since the last of my IBM DeathStars failed around 2003. Fortunately all the Seagate models are still under warrantee, but such performance is still disheartening and frustrating.

What’s happened to quality drive manufacturing in the 21st century? Some of the ~10MB hard drives in my 486-era machines easily lasted 10+ years, but a single drive these days lasting over 3 seems ever more scarce. Sigh.

Netgear FVS114 – Worst POS SOHO Router Ever

Some of the worst infrastructural issues OpenRain has had since inception has been border hardware. We’ve been through all typical COTS models you’d find at Best Buy, but all have had issues with at least one of..

  • Dropping inbound traffic due to some stupid “DDoS Protection” feature we couldn’t disable.
  • Not passing VPN traffic though to an internal server.
  • Crashing.

But this latest POS–the Netgear FVS114–really takes the cake. Check it..

  1. Log in to http://www.workingwithrails.com
  2. Visit http://www.workingwithrails.com/person/new
  3. Listen for the sound of everyone simultaneously screaming “WTF!? The ‘net’s down!”

We’ve reproduced this issue with FireFox and Safari from multiple machines inside the network. Way to go, Netgear! (Might want to get on this one.) I’ll be buying some real hardware online in about 15 minutes.

 

 

Five Major Apple Design Irritants

Apple,

My software development firm–OpenRain in Arizona–spends buckets of money on your products. Stuff works pretty well in general, but you really need to address these issues. Really.

  1. PowerBook, MacBook and MacBook Pro power supply cables invariably rip. Not only that, but it’s always at the same freaking places. The MackBook/Pro power supplies are better than the PowerBook ones, but still don’t last more than a couple years of real-world use. The issue is at the endpoints of the laptop end of the cable that get bent constantly from travel and being wrapped sharply when the electric outlet is on the wrong side of the laptop. I really love the small and agile design, but the cables need to last at least 4 years without tearing.
  2. Laptops still run hot. Phoenix summer get hotter than 110 degrees Fahrenheit, and I have gotten physically burned by the MacBook Pros when wearing shorts. Product such as the iLap are amusing, but should not be necessary. Getting physically hurt by a computer is a problem.
  3. Keyboard are not ergonomic. The latest iteration of post-modern laptop-style bluetooth keyboards are great to look at, but absolutely horrid on the wrists. No one at the office really likes them in practice, and we’ve had to revert to the Microsoft Natural series of keyboards when have been around f-o-r-e-v-a-r but Apple hasn’t responded to. I’m 100% confident you could build a swanky, highly usable bluetooth keyboard that puts the Naturals to shame.
  4. iPhone copy/paste support. It’ll be an awesome design accomplishment when we no longer need this, but you haven’t gotten there yet, sorry, and everyone else agrees. Add copy/paste support (if only in key areas) to iPhone.
  5. iPhone needs to support dvorak. Yeah yeah…. I know I’m in the minority on this and am sneaking it in, but I spend a lot of money with you guys, and having to use QWERTY just for the iPhone is driving me insane. Add the freaking layout please.

 

 

JXTA: Not The Solution To Java Peer Discovery

sun_jxta.gifOnly developers with hair should use JXTA, because those with bald or shaven heads won’t have anything to violently rip from their skulls while they develop with it. I have been, and continue to be excited by, JXTA’s potential, but have been very disappointed at the pace at which a project progresses when using it. JXTA’s capabilities, on the PowerPoint level, are impressive. It facilitates a great deal of networking features necessary for peer-to-peer operation and service discovery. So what’s my beef? A couple major areas off the top o’ me head..

Documentation

There isn’t exactly a massive community using JXTA. There are limitless possibilities of the platform and a few significant projects that use it, but it’s not exactly a common-place technology. That’s ok. Communities need time to grow. But to build a better mousetrap, people must understand why yours is better, and how to use it properly. At first I suspected I had jumped into the system at a particularly odd moment, but most of the documentation I’ve read is either out of date, or, in the case of much of the code itself, completely missing. This may come as a surprise to the good folks at jxta.org who provide many links to JXTA articles, but as a developer new to the platform sitting down and getting started, you’ll find yourself confused by deprecated and changed APIs without a clear understanding of the Right Way to do things. Thepopularbooksarelongoutdated.

Testing

As an advocate of test-driven development, my application unit tests attempt to cover the interactions between multiple peers on the JXTA network. Doing so requires instantiating multiple cores within the same Java unit test process, and being able to reset them to initial states between test cases. Unfortunately, JXTA is designed as a singleton, which as we already know is not a friendly pattern to test-driven development. Couple this unfortunate design with the general difficulties of multi-threaded unit testing, and you’ll either be spending vast amount of time with your unit tests, or forgoing the complicated ones completely. Probably the latter. So what’s the solution? I’m not exactly sure, but I’ve started working on one.

Journeta

Currently code named “Journeta”, that goal is to create a greatly simplified, zero-configuration-required peer discovery and communication Java library for “trusted” networks. No configuration files, hefty learning curve or even constructor arguments, but no security or over-the-internet functionality either. (At least at the library level.) While I haven’t been actively developing it this year, I started the project last year over at OpenRain, and anticipate releasing a build sometime this summer. Let me know if you’re interested and I’ll ping you when we release a demo.

Please Stop Saying "Google Simple"

It should be generally assumed that designs should be as simple as possible. So if you’re working directly with a competent designer, you need not say so. If your designer does not hold this as a core working principle, get a new one.

Client: “We’d like you to design a next-generation car dashboard for our new line of luxury vehicles. The car will feature all the latest gizmos: GPS, iPod integration, satellite radio, automatic environmental controls, you name it. And the interface needs to be simple. Google simple.”

Me: “Ok.. here’s what we’ll do. We’ll remove the wheel, pedals, and all conventional buttons and displays. Instead, we’ll mount an LCD to the dash, and display a single text input box. Voice recognition will fill in this box for the driver, and when (s)he says “Search”, the car computer will return the first 5 million commands (s)he most likely meant. The driver can then touch the command which they meant and have it execute. Alternatively, the driver can say “I’m feeling lucky!” to have the car automatically execute the most likely desired command, such as “Turn right”, or “OMG STOP NOW BEFORE WE DRIVE OFF THAT CLIFF!!!” If the driver survives long enough, they’ll get to enjoy the lumbar support and tunes from their iPod.”

Client: “…”

Me: “We can call it ‘Sue-gle’.”

Why Outlook Sucks: Part 2 of 900,000

Note: Yes, this is still on an older version of Outlook because that’s what I’ve had to use. Please feel free to contribute to this series in your own blog via trackback/ping, and I’ll post links en mass to the front page when I get enough!

Let’s delete a folder to which messages are directed via a rule.

error.jpg

Outlook does some dependency checking and found that deleting the folder will hork a rule. Good. Unfortunately we get a disgruntled little dialog box entitled “Rules in Error”. (Shouldn’t this be “Error in Rule”?) The use of a table I surmise would be to support display of a laundry list of errors, but since there’s only one in this case and the table won’t wrap the error text, we get to scroll all the way over to the right. Not that it really matters, because I don’t have a choice on how to proceed. The “Close” button gives me no indication as to what will happen when I click it.

I never have this issue in Mail.app, because when I delete a folder related to a rule, the rule automatically becomes disabled and folder reference unselected. Here’s what a simple rule looks like after you delete a folder to which it directs email.

rule.png

No annoying dialog, and I can easily rewire the rule since it wasn’t deleted. Also, if I create a new folder with the same name, the folder automatically gets wired into the old rule. Makes sense!

Why Outlook Sucks: Part 1 of 900,000

Let’s find an email from Toni regarding her party next weekend. There appears to be a search box in the toolbar.
full.jpg
Wait.. that seems to be only for contacts. Nevermind.

menu.jpg

There’s a find button to the left which brings up a toolbar, but it appears to search only the Inbox. Unfortunately I have a bazillion folders and rules and have no idea where the message is located, so I’ll go over to the “Options” menu (of all places) and start an “Advanced Find”.

advanced2.jpg
Uh.. ok. I have no idea why I need “More Choices” or “Advanced”, and apparently I’m still searching only the Inbox. Let’s “Browse”..

select.jpg

Now that we’ve systematically selected every possible place the email could be–which could apparently be in my Calendar or Contacts–we can click OK and go back to the “Advanced Find” dialog and click ‘From..’

sub.jpg

Great.. the engineers decided to reuse the same old contact finder dialog. There are a lot of people with a ‘Toni’ in their name, so we’d better embark on a separate sub-find quest to identify the correct contact record. Make sure you click ‘Find Now’ and not ‘New Search’ when you’re done.

res.jpg

When we come back from a coffee break, we see Outlook proudly presenting a result set, sorted by date, most recent first. That’d be great, except that if I’d received it recently, I probably wouldn’t need to use an ‘Advanced Find’ to locate it, would I? The results are also displayed within the dialog for some reason instead of the main window, so I guess I’ll have to keep this up on my second LCD, which I’ll now repurpose as the “Dedicated Advanced Search Dialog Monitor”. Whatever.

Just for shiggles, let find an email in Apple’s Mail.app.
picture-1.jpg
Holy freaking crap. I typed in ‘toni party’, and it gave me emails from Toni about her party, sorted by likely relevance. It was immediately clear how to search and the results took less than a second to display, despite the fact the PC is apparently faster spec-wise and I have magnitudes more email on my MacBook Pro. Huh.

Update: Part 2 of 900,000

Singletons Cause Cancer

It’s been said before. I’ll say it again. The singleton pattern sucks. From a pragmatic point of view, it has two primary drawbacks: reuse and testability.

Reuse

A public static getInstance() method is, by definition, statically bound at compile time. Since you can’t override static methods, reusing singleton code via inheritance means you’ll need to create a new getInstance2() method. No matter how creative you get with this method name, you have to accept that users of your code will periodically call the parent types public getInstance() method instead of your spiffy new getInstance2(). Working off an interface largely becomes a moot point since the developer must know the exact type of singleton they want to use at compile time in order to invoke the correct getInstance() method.

How do you configure a singleton without a parameter to getInstance(), which would not be consistent with the intentions of the pattern? Since the instance is constructed internally using a non-publically-accessible constructor, there isn’t a convenient way of introducing configuration information before it’s created.. unless the singleton is aware of a configuration source at compile time with yet more static binding. This makes the code very inflexible, as developers intending to reuse it will be at the mercy of your pre-chosen configuration mechanism, which may not be appropriate for their circumstances, or even unit testing.

Testability

Unit tests generally require control over the lifecycle of the class under test to fully validate proper state transition and contractual validity. Since you, the master of the known universe, are writing the software, you’ll certainly write negative scenarios into your unit tests to assert proper failure handling. If intentionally introducing a negative test results in an irrecoverable state, how do you throw out the singleton and start the next case with a new one? You can’t. What if your test case is creating a tricky concurrency scenario emulating multiple systems within the sandbox of a single JVM? You can’t (trivially). What happens when you discover you need multiple instances of the singleton within your application? You can’t. Time to refactor.

Additionally, unit testing of code using static singleton dependencies has a high potential of awkwardness due to an inability to swap out implementations for mock objects. Under the principle of designing for testability, quality and maintainability, hackishness is not a quality to aspire to.

Conclusion

Singletons can be hazardous to your health, seriously jeopardize your family’s safety, and have been classified as ‘terrorist patterns’ by the U.S. government. The fact that an application only needs one instance of something does not mean the object should be designed that way, and there aren’t very many scenarios where singletons are appropriate. Do as the Jedi do and use them with consideration and responsibly.