Celebrity Look Alikes

November 18th, 2009

This sounds fairly scientific. Take a look at my collage and tell me what you think!

Announcing ‘Spin a Friend’

November 14th, 2009

I am in the process of releasing my first Android application to the Android Market.  It is called Spin a Friend. It is an entertaining time waster and an innovative new way to manage your telephone contacts.  It facilitates reaching out to friends you haven’t talked to in a while by text or phone.  It also gives you the option to clean out contacts who are no longer making the cut.

From the splash screen:

  Have you lost touch with
old friends or old flames? Have some names
and numbers in your contact
list you barely recognize? Well, take a
spin through your contacts and
see who is worth contacting and who
maybe should be … let go!

The core features are:

  • Spin to a random contact
  • View last contacted date and time
  • Text the selected contact
  • Call the selected contact
  • Edit the selected contact
  • Dump the selected contact
  • Keep spinning if the random contact doesn’t grab your interest

It works great on my new Motorola Cliq, and I hope you will enjoy it as much as I have!

Android Application Development

October 15th, 2009

I have started meandering down the road toward being a proficient Android mobile application developer.  I downloaded the SDK and Eclipse plugin last night and started working on a simple application.  So far, I have figured out the basics of the XML-based layouts, alignment, styling, buttons, and event handling.  I have even implemented some effects using timers.  Nothing earth shattering so far, but it is definitely fun.  As a seasoned Java developer, I am pleased with how quickly I have been able to pick up things.  Some of the terminology is a little weird, but I am starting to find my way around things and feel productive already.

If you haven’t heard, T-Mobile is launching the Motorola Cliq this month, with pre-orders starting the 19th and deliveries beginning in early November!

MacBook Pro Teardown

September 25th, 2009
Dented Case Damaged LCD Bare Display Assembly

I tore the upper display assembly of the MacBook Pro down to bare metal last night.  Found some good articles online on how to do it–after I had already done it.  Probably could have saved myself a few glass shards in the fingers.  Basically I just started prying under the cracked glass with a knife until I had all the original glass cover off and then used a very tiny Phillips screwdriver to remove the damaged LCD panel.  The trick I could have benefited from is to use a heat gun or hair dryer to loosen up the adhesive and just pull up the glass with a large suction cup.

Once I had it opened up to the bare metal, I turned the laptop upside down and rested it on a hard wood surface and tried to pound the dent out with a hammer from the inside.  At first the hammer just bounced off and I thought maybe the metal could use some softening.  I used a hair dryer on high power held right up against the aluminum to try to soften it.  Seems to have worked as the next whack of the hammer basically turned the dent pointed in into a small dent curving up from the exterior surface.   That should be okay as I intend to keep it in a MCOVER hard polycarbonate shell from here on out.

After I was pretty confident that I could reassemble the MBP, I went ahead and ordered a replacement LED-backlit LCD and glass screen for it.  Total cost for the polycarbonate shell, replacement LCD, and replacement glass is about $270.  If only Apple would have stood behind their product for the same out of pocket…I would be willing to buy another one.  When the MBP dies, I am totally going with something like a Dell or HP!

Why Apple Will No Longer Be Part of My Life

September 18th, 2009

Just a few weeks ago, I would have recommended an Apple product to anyone.  My wife and I own 3 iPods and 2 portable computers–an iBook G4 and a MacBook Pro.  The design and user experience of the products are wonderful.  However, I have learned this week that the customer service experience is something much, much different.

Although my earliest experiences with Apple go way back, I became an Apple customer for the first time in December 2004 when my wife, Amber, gave me an iPod mini for Christmas.  Shortly thereafter, I just had to have the Apple iBook to accompany it!  I found a great deal on an iBook G4 that was not the latest and greatest processor and I was ecstatic.   I am a Unix power user, so I loved having access to the raw, unfettered command shell while still being in a great looking and well thought-out GUI environment.

I beat the crap out of that iBook.  It fell off tables, chairs, couches and just kept ticking.  Its construction just confirmed to me what I heard about the quality of Apple’s engineering a complete product from hardware to software to accessories.  I enthusiastically recommended Apple and the Mac to everyone I knew, whether they were in the market for a new computer or not.  I don’t know how many purchases my recommendation led to, but I planted the seed in lots of minds.  After four and a half years of nearly constant use, the iBook started to show its age.  The trackpad became less sensitive and required a firm and very intentional clicking motion to activate it.  Shortly afterward, the video started cutting out requiring restarts of the computer.  I contemplated making repairs but decided it probably wasn’t worth it.  Still, I couldn’t bring myself to dispose of it, so I zipped it up in a neoprene sleeve body bag and laid it to rest on my shelf.  Amber always tells me I spend too much time on the computer, and she is almost certainly right.  At the risk of being dramatic, losing that iBook was like losing a friend.

Since the iBook only had 1GHz of processor power and a 12 inch screen, I contemplated replacing it with an inexpensive netbook.  Amber knew how much I enjoyed that Mac and generously encouraged me to go ahead and replace it with a new one.  She said, “I don’t want you to get something that you’re going to be disappointed with after 6 months.”  So, I logged on to Amazon.com on August 9, 2009, and purchased a new MacBook Pro 13inch with the aluminum unibody.  It was the latest and greatest (at least with a 13 inch screen, but I really wanted true portability).

With its sleek aluminum case, the MacBook Pro was truly a thing of beauty.  To avoid having it sit on my front porch for thieves, I had it shipped to my office, where I work with several other software engineers.  I unwrapped it and showed my co-workers the sleek and compact design.  I even made a point of showing off how well the Apple chargers are designed, with their removable extension cords and built in prongs for wrapping  up the cord.

Everything’s peachy, right?  Well, if only I had the opportunity to have those 6 months Amber worried about to be tired of that Mac!  After about 35 days of possession, in a freak accident, Amber’s laptop slid off the couch and the corner dented the top side of the closed Mac.  While I will admit that we weren’t super careful and could have prevented the accident, the astonishment began when I opened the Mac and saw that the LED display was very damaged and even the front glass in front of the display was cracked in a spiderweb like someone had shot it with a BB gun.

This was not a great moment for me.  I knew the accidental physical damage would not be covered by the warranty and figured I would be out $300-400 for the repair.  It’s a costly mistake, but not the end of the world, right?  Boy, was I about to have my world rocked.  I did some Googling and found various parts that might repair it, ranging from screens only to full display assemblies.  The prices I found were $350-750 for parts only.  Well, I thought, that pretty much rules out me doing it for myself.  I knew Apple’s warranty wouldn’t cover the damage, but I was hopeful that they would make me a deal on the parts and labor since I had owned it less than 2 months.  So, I took it in to the Apple Store’s “Genius” Bar at the Country Club Plaza store (Kansas City, Missouri).  That’s when my story took a turn for the worse, as I discovered that whatever genius the employees may or may not have certainly does not apply to customer service.

While waiting for 40 minutes for my 4:15 appointment (9/17) to which I was asked to show up 10 minutes early, an employee at the Apple Store chatted with me briefly about the situation.  He said “if they can’t help you, be sure to check with your credit card company about protection.”  (Jumping forward a bit, this seemed somewhat helpful until all 4 Apple employees I talked with suggested this route and 2 of the 4 suggested I file a homeowner’s insurance claim.  I quickly got the feeling that Apple wasn’t interested in supporting their product.)

Finally, I spoke with “Genius” Mike about the situation.  He looked at the computer, said “That’s too bad,” and immediately quoted me repair prices without any reference materials.  While you could consider that professionalism and having a great memory, it immediately set off alarm bells for me.  That specific laptop model has been out since June, and he has already had enough exposure to repairs on the screens to quote me a price?  Yet, the prices themselves were astonishing alone.  He said that the usual repair rate would be $1000 (on a $1200 laptop), but that there was a special accidental damage rate of $755 if it was shipped off to a third party for repair.  Wow, look at the savings!  Without waiting for my response, he started shutting down my laptop that I had brought in running–seemed a little presumptuous to me.  I asked him about other options.  He mentioned directly contacting a third party repair shop, accidental damage protection on my credit card, and homeowner’s insurance.  Finally, I mentioned to him that I had seen parts online and thought about fixing it myself.  He said if I was technically minded that I should be able to do it since the MacBook Pro is “beautifully engineered.”  I had to take exception to that, and said “except for that part where they don’t build the case strong enough to protect the screen.  I am pretty sure my iBook with the polycarbonate case would have survived this.”  At this point, “Genius” Mike turned in to passive-aggressive jerk Mike and said something about “it’s accidental damage, you can’t expect us to do anything” and started walking away.  I said, “that’s fine, but I won’t be buying from Apple again.”  At that point, he said with a sneer, “Well, then enjoy your new computer” and walked away.

Man, was I steamed. I thought I should definitely contact Apple phone support and hope for a better resolution.  I opened up case number 136513051 and spoke with Brad around 6:20 PM CT on 9/17.  He quickly affirmed that Apple wouldn’t be helping me under the warranty (which I knew and fully understood) and recommended a claim with my credit card company or homeowner’s insurance.  I said that I would really like to talk with someone who might be able to work out a deal on the parts and labor (like maybe at cost since I had owned the Mac for so little time).  He escalated me to Steven, who again brought up the credit card company.  These guys really didn’t want to provide any support!  I asked Steven if I could get the parts and labor at a discount and specifically mentioned the idea of getting them at cost.  He explained that Apple either fixes something under warranty or they don’t–there are no other resolutions.  He used tons of lines like “I can’t do that,” “That’s just the way Apple works,” and “policy”.  So, who was this guy I got escalated to–just another tier 1 guy?  At this point, I just thanked him for his time and specifically requested that he write in the notes of the ticket that I would not be purchasing from Apple again.  He had no reaction to this other than to agree he would write that in the notes.  I was astonished.

I have talked to Amazon, the credit card company, and 4 Apple employees, and the only resolution I have been offered is paying most of the price of the laptop again to have it repaired.  Customer service is dead in America.  All I want is for someone to offer me parts and labor at cost (and if that cost is more than about $400 I will feel pretty confident I am being lied to). That doesn’t seem that extreme given this situation.

So, here is what my treatment means for Apple:
-Beyond maybe fixing my laptop, I won’t be making further Mac purchases from Apple
-There will be no new iPods in my home
-The iPhone I have contemplated buying will be replaced by a Nokia smart phone or Android phone
-The iPhone software I have been contemplating writing will never be sold in the Apple App Store
-When my current iTunes account balance is gone, I will not be using iTunes Store
-I will politely refuse to accept any gift of iTunes gift cards from family members as holiday stocking stuffers or gifts
-I will tell everyone I know about my experience, especially people to whom I have previously spoken favorably about Apple

If any Apple employees read this, I am confident that you will see your company is in the wrong in this situation.  Thanks for reading!

A History of the World, As Told by Budweiser

May 21st, 2009

Old Budweiser Can

I was mildly amused when a remodel of our small half bathroom uncovered an old Budweiser beer can hidden beneath the drywall.  Amazingly, it was in great shape and not too dirty considering.  The first puzzle was to figure out exactly how old it was.  On the side was prominently featured the USA Olympic logo and rings and a message “Proud Sponsor 1988 U.S. Olympic Team.”  I consider it unlikely that they were making that advertising emphasis much before or much after the 1988 Olympics, so let’s just call it a 21 year-old Budweiser can.

I didn’t think too much about it, other than, “hey, maybe an old Budweiser can is worth something on eBay.”  That was enough to get me thinking about just how much times have changed in the last 20 years.  What has changed on the Budweiser can itself and in the world around it?

Interestingly enough, although the can says “Recyclable Aluminum”,  it also says “Pitch In!” with a stick figure man throwing a blob into a trash can.  Throwing away metal cans with no recycling guilt definitely speaks of a simpler time, when throwing your beer cans away made you a much better citizen than the other popular option–tossing them out the car window.

There is also no Surgeon General’s Warning or mention of caloric content.  Nevertheless, overconsumption was prevented by the tiny mouth of the can.  The need to guzzle had apparently not yet been established, or at least endorsed by Budweiser.  In those days, a  helmet with upside-down beer cans and straws were apparently good enough.  I suppose keg stands and beer bongs were around too, although I can’t really say definitively.  I am a little behind on my 80’s pop culture.

There is no 800 number or .com address on the can; its most high-tech feature is a UPC barcode.  Even though I clearly remember the days before popular public adoption of the Internet, it is now pretty weird to think about a time with no web site to visit to check out my favorite products.  Maybe they had a Gopher site?  I’m guessing not!

That’s all I have on this topic!  However, I am taking offers for this piece of American history!

Recipe: Scamboli

March 4th, 2009

Here’s a new category to keep things lively.  This recipe is great!

Scamboli

Ingredients:
-2 loaves of frozen bread dough, thawed
-2 eggs
-1/2 cup vegetable oil
-1/2 tsp salt
-1/2 tsp garlic powder
-1/2 lb pepperoni
-1/2 lb ham
-1/2 tsp oregano
-1/2 tsp parsley
-1/2 tsp pepper
-1/2 tsp basil
-1 lb sausage
-1 lb mozzarella cheese

Roll out the dough to about 10×12 inches.  Mix eggs, oil, and spices.  Spread onto both loaves.  Save some to brush on top after rolled.  Layer pepperoni, sausage, 1/2 cheese, ham, and rest of cheese.  Roll up jelly-roll style.  Seam down and tuck ends.  Bake for 25-35 minutes at 350F.  Slice and dunk in marinara.

Thanks to my sister Jennifer and whoever gave this recipe to her!

Oh, the Insanity… In Soviet America the Internet Visits You

February 21st, 2009

Two of my great interests are politics and technology.  Most politicians are brain-dead about technology, and most of my techie friends don’t give a crap about  politics.  This particular article might turn things on its head a little.  It will both provide further proof that politicians are brain-dead and likely incite my techie friends to anger.

http://www.cnn.com/2009/TECH/02/20/internet.records.bill/index.html

These two lovely bills, already in the House and Senate, mean that any usage of DHCP has to be logged for two years.  This means any time I use a Wi-fi access point at a hotel, coffee shop, or the airport I would have to give them my personal information to be held for 2 years?!  If someone comes over to my house and uses my Wi-fi with their laptop, I have to keep a record of which IP address they were assigned for 2 years?!  My office network has to keep track of which employee had which dynamic IP when and retain that information for 2 years?!

You can kiss free and low-cost Wi-fi goodbye.  No one will want the legal risk anymore.  And, you won’t be able to come over to my house and use my Wi-fi without signing a ledger and providing a thumbprint.

Just like the debate over guns, the stated purpose of protecting children from exploitation is not the only result that can come from it.  Just the sheer effort and cost involved with something like this is another backdoor way of expanding the immense government bureaucracy.  If it is expensive and a pain to do, no one will do it without enforcement.  Need for enforcement means a new government bureau with lots of idiots in suits running around holding press conferences and meeting with Congress in hearings to whine about their funding and rationalize their lack of results.

If the logging requirements were ever expanded to provide real-time government access to this type of data (probably only possible with the biggest ISPs and Wi-fi providers), it could be used to track people’s movements.  We all know when you go down that road, the capability will be used for any political advantage conceivable.

What happens if these bills go through? We fail to save the children from harm while continuing to bloat the government.  Then, the government controls you and everything you do.

How do you stop this? 8 years ago, I would have said vote Republican.  Now, I’m only a Republican because I can’t find anyone I hate less to join up with.  The Constitution Party is a bunch of philosophers with apparently no plan to ever gain office at the national level.  The Libertarian Party talks about freedom only because they want to secure new freedoms for potheads and degenerates.

Arggggggh.

Contract-driven web services with JAX-WS

July 28th, 2008

Attentive readers will notice that I have previously advocated both contract-first web services and JAX-WS. Although these might seem like contradictory concepts at first glance, I believe I can make a case for the use of these two approaches together. Although many “Hello World” web service examples with JAX-WS simply use the @WebService annotation, a much more sophisticated web service can be developed by digging in to the optional attributes of the javax.jws.WebService annotation. One in particular that jumps out:

-wsdlLocation: allows the specification of a URL of an existing WSDL file. This file can be stored on the web or referenced with a local URL. The WSDL and an external JAX-WS XML bindings file can be used to specify the service operations and the Java type mapping respectively.

Maybe you are not interested in creating your own WSDL or XML bindings file, and you instead want to use Java as your language to express your service contract. Although you lose some power in this arrangement (mainly in the area of XSD data constraints), this may be a more natural approach for most Java developers.

One important consideration in maintaining the contract of a web service is versioning capabilities. If you need to provide backwards-compatibility when you make service operation signature or semantic changes, consider the use of version-based namespaces. Again, the @WebService annotation provides for this with another optional attribute, targetNamespace. It is good practice to embed a version number in both the service endpoint URL and the service namespace to protect against future changes that break backward compatibility.

Having a mechanism for versioning is only half the battle. Having a minimally invasive way to continue to separate your web service endpoint from refactoring and change in your Java code is the key. The approach that I rely on is to inject business services into my service endpoint class rather than directly annotating business services with the JAX-WS annotations. These classes can be a simple 1-to-1 delegate at first, but can adopt more complex mapping and adapting behavior over time if needed for backward compatibility. This allows business services (Java) and web services (JAX-WS/SOAP) to have different refactoring and backward compatibility restrictions (if desired).

The most simple example:

@WebService
public class HelloWorldWebService {
private HelloWorldService service;

public void setHelloWorldService(HelloWorldService service) {
this.service = service; //service delegate injection point
}

@WebMethod
public String helloWorld() {
return service.helloWorld();
}
}

It is tempting to take the easy way out and simply annotate a concrete service class with web service functionality. My preferred breakdown is to have a business service interface, a business service implementation, and a concrete web service endpoint class with annotations. This makes your business services completely unaware of remoting considerations, which is good insulation against future adoptions/un-adoptions of technologies. If the REST advocates have their way and take over the world, you can always rip out your JAX-WS service endpoint class and replace it with the remoting strategy du jour.

You can create a contract-driven SOAP web service with varying degrees of rigor easily with JAX-WS. Understanding your constraints and how closely you want to adhere to contract-driven approaches should allow you to find a happy place where you can leverage the JAX-WS toolset and still build robust and stable web services.

Software development methodologies can easily be adopted with religious zeal, but it is important to remember that our ultimate goal is to build software that delivers on business needs!

Imaginary people and the art of software estimation

July 28th, 2008

When asked to estimate software development, either unilaterally or as part of a team, there are a number of pitfalls you might encounter. You might be building software for a domain you are not entirely familiar with or adopting new technologies with largely unknown risks. Although those are valid issues that might arise, the advice I bring to this blog entry is much simpler. There are no formulas, charts, or dependencies.

To be honest, I have “learned” this lesson before, so I can’t really say this knowledge takes me by surprise. However, the sooner everyone in software development takes it past the recognition stage and adopts it as an inherent philosophy, the better…

When being asked to estimate software development, never rely on imaginary people.

If you have anything less than 100% confidence that a resource will be available to you when needed, assign that resource to “nice-to-have” or contingency features. Delivery dates should never be cited based on possible hires. What all too often happens is the folks with the purse strings remember your commitment to a specific date but forget their obligation to assist with resources. This situation can cause a lot of bitterness and resentment throughout the organization. Worse yet, it all too often is the sign of the beginning of the end for a project.

If you have 2 developers readily available to work on a project for which 10 would be ideal, show the delivery date based on their actual productive capability. It is fine to show delivery dates that are progressively sooner by adding additional people, but it must be made abundantly clear that the one that matters is the one in bold based on actual resource availability.

Even if your developers that are expected to remain imaginary do become available, it is important to remember another related type of developer–the mythical developer and his accompanying productivity.  The mythical man month has been discussed in great detail elsewhere, so I won’t spend too much time on it.  However, it is important to remember that even a well-resourced project can be run into the ground by mismanagement of resources.  Pay special attention to developers’ strengths and weaknesses and make sure you are using them where they can help your team and project the most.

It is sometimes hard to connect the dots between business success and resourcing of projects. The fact is many projects can be delivered much later than anyone would like or with a diminished feature set and still deliver dramatic business value. However, the correct balance between delivery dates, scope, and quality must be agreed upon by everyone involved with a project to ensure success.