Archive for August, 2010

It Doesn’t Take a Genius

Tuesday, August 31st, 2010

On Monday I went to the Apple store in Market Mall and was amazed how busy it was at 12:30pm.  No wonder Apple is making record profits!  I went because I bought a bluetooth hands free ear piece from Apple, and something happened to my cable.  My Mac no longer recognizes my iPhone when connected using that cable, and it no longer charges my ear piece.  I asked about getting a replacement cable, and was told I would have to speak to a Genius.  They were so busy, I couldn’t get an appointment the same day.

Now while Apple may win awards for customer service, I don’t think it should have taken a genius to know that I don’t want to drive for 40 minutes back to the store some other time to get an answer to my dilemma.  Can I buy another cable from Apple and if so, how much?

If I had walked into a IBM PC clone retail store, they wouldn’t have said “make an appointment” to get the answer, and I would have found out what my options were right away, or they would have said “we will have to research it and get back to you.  What’s your phone number?”.  Apple didn’t even offer.

hcOPF Designtime Strategy

Saturday, August 28th, 2010

One of the great things IMHO about hcOPF is the design-time binding.  This feature requires you to install a design-time package into the IDE containing the MetaData for your objects.

The hcUIObjectBinder component uses the ThcUIBindingItems specified by the developer to create the appropriate mediator class at run-time and bind the specified attribute (by name) to the specified control (by name).  If you name your controls consistently it would even be possible to add automatic design-time binding by inferring the mediator from the type of control, and matching the name of the control and the attribute.  That feature isn’t available yet, but after configuring the bindings for 30+ controls on a form you can bet I have it planned.

My current project has grown to the point where the objects contain lots of code other than that used at design-time.  Initially I have used some conditional directives to limit the units implicitly imported into the object design-time package.  This has become increasingly difficult as things have grown and have added complications during the compile cycle.  If I’ve built the design-time package recently, then some of the DCUs are built with the conditional directives, so I either re-compile the entire main project, or change the Unit Output Directory for the design-time package to a separate directory (which is what I did).

To make it easier to keep fleshing out the objects, I have considered 2 different approaches:

1) Using Include files containing all the common code used by both the design-time and run-time objects.

2) Creating the base business objects for design-time use and concrete objects descending from them for run-time use.

Neither approach is ideal.

Include files break up the code so much it’s harder to navigate and make sure changes in one file don’t prevent compilation.  Too bad Delphi doesn’t support partial classes.  If it was just the object metadata it would be one thing, but the code for child lists has to be included so they can also be bound at design-time.  Using include files makes it easier to generate class definitions from the database, but I already have a utility that generates my entire unit so I have a good starting point for a business object.

Likewise, inheritance breaks up the class so reading it and understanding the whole run-time object can be more challenging.  This is typical of OOP design though.

What approach would you use and why?

Why I Would Not Buy a Broan/Nutone CentralVac

Friday, August 27th, 2010

In 2007 I purchased a Broan/Nutone VX550CC central vac to replace my aging CanaVac that never did turn itself on when you plugged in the hose and flipped the switch on it.  The unit was on sale, and the specifications seemed quite good compared to much more expensive models by other manufacturers.  I didn’t install the unit right away because the current CanaVac was working, and I was busy.  Replacing a working vacuum with a working vacuum was a little bit further down my list.  Eventually, the CanaVac bit the dust and I installed the NuTone unit only to discover that it too didn’t turn on automatically using the switch on the hose.  It’s a pain to turn it on and off manually, but I tolerated it for a while until a friend of mine checked out the wiring for me.  He confirmed there was connectivity, so it wasn’t a wiring issue.

That started the whole reason for this post.  I called the 1-800 number in the Nutone warranty booklet and was told the warranty service is performed by Transglobal Service.  I called Transglobal Service at 1-800-360-2742 spoke to Claudia on Feb. 4, 2010.  I told her my story, and asked for a service call.  They indicated they needed the original proof of purchase.  I thought there was no way I could find it.  I even contacted Home Depot to get a timeframe for when I made the purchased on my Home Depot card.  That helped narrow down where to look for it, and eventually I did find it.  I faxed it in to Transglobal on May 4th to the attention of Charmaine (not sure of the spelling).  I got a work order (2128724) and was told I would be called to arrange a service call.

I didn’t hear back from Transglobal, so eventually I got around to calling them on May 4, 2010 and found that they had cancelled the work order because I had not called them back and because they assumed it was no longer under warranty.  I read the warranty info to them and they asked that I fax it in because they have no database that tells them what the warranty period is.  I faxed a copy of the warranty in but that didn’t seem to satisfy them.  Every time I called in, I got challenged that there was no warranty on the unit.  It in fact has a lifetime warranty for the original purchaser home in which it was installed.

On May 7 I called again finally asked to speak to a service manager.  I was getting tired of having to repeat the entire sequence of events to each person I talked to, and they kept reading from a call log that was not being updated.  Apparently my fax was not readable, but no one bothered to call me back to see if I could fax an enlarged version.

On May 28th I called again and spoke to Debra Makaruk about the warranty and they didn’t have my warranty info on their call log.  Debra asked me to email a scan of the warranty page to her.  I did so on the 29th, and on June 1st she arranged to have Diane call me.  Shortly after that call, I emailed Debra this:

” I got a call from Diane, and I must say I wasn’t impressed!  She asked me all the same questions Trans Global asked me in terms of what was the problem with the unit.  When was it purchased, did I have a receipt.  The only thing I hate more than chasing people to get them to do what they should have done in the first place, is repeating the whole story and re-supplying the same facts to someone else when the buck gets passed.”.  That pretty much says it all IMHO.

After completely ignoring the basis for my frustration, Debra asked for my contact information, and home address, which I supplied and asked her to me contacted in two weeks as I was going to be out of town the following week.

On June 13th I received a call from George from Transglobal.  I emailed Debra this account of our conversation:
“George told me he was calling in regards to my service appointment on Monday between 1:30-3:30pm.  I told him I hadn’t scheduled any service appointment, that the last time I had contacted you I had asked to be called on Monday to arrange a service appointment because I was out of town all last week.  Later during the conversation he said the service times are what he determines based on his schedule, but he never asked if it would work for me, he made it sound like that was the time I had arranged.

He again challenged my claim that the product was under any warranty.  He didn’t listen when I told him we had tested the connectivity of the wiring, so we were pretty sure it was a control unit problem.  He said he had no information on the situation other than the unit was dead.  I corrected him, and also told him that I had supplied the warranty information several times, and was tired of repeating myself to every TransGlobal service representative I spoke with.  I told him it wasn’t my fault that you guys don’t record the information I provide in one centrally accessible place, or disseminate it appropriately.  Although he said he had no information on the call, he then tried to tell me he wanted to confirm what the problem was, in pretty much the next sentence.

Needless to say, I was not as polite as I would normally be, even to someone who called me during the supper hour, because he was not straight with me, he did not listen, nor did he explain himself very well. Also, I do not appreciate having to repeat myself, especially when I have brought it to the attention of TransGlobal on numerous occasions.

I just thought I would advise you of this so perhaps you could take some corrective action and provide a more pleasant customer experience in the future.”

That didn’t get any real response from Debra other than saying she needed a “Date Code” from the unit.  I looked all over it and sent back the one thing I thought may have been it on June 21st.  I was determined I wasn’t going to jump whenever TransGlobal decided they needed something else in order to service my unit.

Then one day I was in Home Depot with a buddy and he suggested that I talk to Customer Service there about my experience.  The person I needed to talk with wasn’t available at the moment, so after waiting a while I left a message and went home.  Fareed called me later that day, and that is when things started moving again.  On July 5th Fareed called my cell and informed me that Marilyn or someone whose name starts with M will be calling me at 1pm to arrange a service call and that Home Depot will cover up to $100 for the service call but I have to put it on my credit card initially.  Transglobal didn’t call.

On July 7th I called Home Depot to let Fareed know that Transglobal dropped the ball again.  I spoke to Wendy and then to Peter, who said he would talk to Fareed on Thursday and they will address this together with TransGlobal or take it to Mark their store manager.

TG contacted me and arranged a service call for July 20th.  They told me there would be a $82.95 + GST trip charge when they called to confirm the service call the day before.  The service representative arrived, was very courteous, and checked out the vacuum.  He looked all over the unit for the “Date Code” but could not locate it.  He concluded that the unit had a defective controller board and he needed to get parts.  He said that would be about a week.  I asked him how long it might be before he got back to install it, because TG had told me he was only in town 2 days a week.  He said that wasn’t at all the case.  He was based in Calgary, and was only out of town about once a week if I recall correctly.  He never collected the trip fee or got a copy of the warranty page as I was told would be required.

I called TG again July 30th and got my new work order #2167929 from agent Alda.  She said she would call dispatch and find out why the service rep hadn’t been back to fix my unit and why I hadn’t been contacted.  I never heard back from her, and on Aug. 4th I called again.  This time I spoke to Shelley who said there is a note on the work order indicating “please cancel”, without any reason given.

I decided I had had enough!  On Aug. 4 I called Home Depot spoke to Peter and told him I wanted to return the unit for a store credit, because TG seems unwilling to service the unit so even if I get it fixed now, I might have the same issues down the road.  He said I would need to talk to Fareed who was not working for a couple of days.  Later that same day Shelly returned my call.  She said that parts would be COD but could not tell me the amount.  She didn’t know why the tech hadn’t called me, or why there was a note on the work order to please close it.  When I asked her how much the parts would be, she couldn’t tell me.  She said she would have to get back to me.  I chastised her for not thinking ahead, and surprisingly enough, I didn’t hear back from her.

On Aug. 7th I called Fareed @ Home Depot.  He had forgotten my last name so hadn’t called me back.  He had to talk to his store manager to authorize the return.  He called me back to say that while they couldn’t offer me a stored credit, but they could exchange the power unit.  He suspected that the unit I got was defective from day one, and that a replacement should solve the problem, even though it meant if anything ever did go wrong I would still be stuck dealing with TG.  After supper I went and picked up the unit.  I returned once to get a missing piece because Nutone had changed the unit so much, but I am very happy to say that I now have a working VX550CC that turns on and off using the hose switch as it should have from day one.  This is thanks to the customer service at Home Depot, and not the “service” provided by Transglobal.

What did I learn from this experience?  Home Depot values their customers, and if you’re buying a major appliance, consider who services it as part of your buying decision.  It might be worth paying a bit more to buy from retailer who stands behind the products they sell and a manufacturer who does the same for what they make, but it pays for itself sometimes.

Thanks again Fareed, Peter and the Home Depot.

Spence Diamonds - Think Twice Before Buying

Tuesday, August 24th, 2010

Spence offered great value, and I had a wonderful experience selecting the ring.  They were even kind enough to give me a store display ring similar to the one I ordered so I could propose with it.

Unfortunately, my engagement didn’t go as smooth, and after a couple years of not marrying for various reasons, I was given the ring back and dissolved the relationship.  Doing so required a large cash settlement, so I was strapped for money, and decided I might just as well return the ring to Spence.

When I took the ring back into the store, the gentlemen (I wish I could remember his name - a tall fellow with a beard and moustache) I gave it to initially tried to tell me that the ring was not longer within the buy back period.  After I protested, and he read the documentation again he corrected himself.  I actually had 5 months remaining.

He gave the ring and documentation to the girl at the reception desk and instructed her to take care of it.  I asked her if I would get a receipt for the ring, and she printed me off a customer statement showing the amount of the buy back and informed me that head office would be issuing the cheque, and they were quite slow so it would be about two weeks.  While I wasn’t thrilled by the amount of the buy back (it doesn’t include the GST I paid on the ring and it also didn’t cover the platinum setting ).  It was better than I was told I could expect to get trying to sell it privately, so I took the deal.  I turned in the ring July 12th, 2010.

On Aug. 20 I called to find out why I hadn’t been called to pickup my cheque or had received anything in the mail.  Heather said she didn’t have a cheque for me.  I gave her my cell # and she said she would have to send in a fax to find out what the status was, and call me back, hopefully by the end of the day.

On Aug. 23rd I called again because I hadn’t heard from Heather.  I spoke to Shelly. She checked shipments from Head Office (HO) for cheque.  She checked Heather’s email and the reply to Heather’s previous inquiry said that the HO in Vancouver is waiting for the proper paperwork from the diamonds appraisal division to issue the cheque.  She said she would follow up with another email and give me a call.  She apologized for the 5 week delay and Heather not calling me.   I told her while I appreciate that she was sorry it didn’t do me a lot of good.  I was paying interest on money I had borrowed because I hadn’t received these funds yet.  I asked to speak to someone in charge to see what they would do for me.

Scott called me on at 10:46am on the 24th.  He told me that the ring buy back agreement was subject to me returning the item with all the original paperwork.  According to their head office, I hadn’t supplied the original purchase order detailing the diamond characteristics etc.  I told him I had returned everything I had received originally in the original box for the paperwork.  In fact I returned the ring in it’s original box, and still had the original bag.  All of it had been sitting in a drawer for 4.5 years.  He claimed I didn’t not meet the conditions for the buy back and that if I couldn’t produce the paperwork, they could not proceed.  I told him I couldn’t prove that he did receive the paperwork because I didn’t make copies, and he couldn’t prove he didn’t.  I said IMHO the least he could do for taking 5 weeks to tell me what I should have been told the day I returned the ring, was to make an exception, but he refused.  I even argued that the paper he was requesting was generated by the Spence computer system, so they had all the information on file.  He insisted it was a required condition for the buy back.  He said he would look around there to see if my paperwork was at the Spence office and asked me to look for it as well and inform him either way.

So now I have no ring in my possession, and am told they will not buy it back.  On top of that, my trust of Spence has been so shaken I’m concerned that the ring I will be picking up from their office may not even be the one I purchased.  How am I to know that the diamond wasn’t changed?  They changed their mind about honouring their buy back guarantee despite the fact that one of their employees could have trashed my paperwork.  She was apparently fired because of issues like mine.

Think twice before you buy from Spence, and if you do have to use their buy back guarantee, make sure you keep copies of all your paperwork before you give them anything.

The New RoadMap - Business as Usual

Thursday, August 12th, 2010

Mike Rozlog just published a new roadmap for Delphi.  Apparently Delphi XE will be the big announcement at DelphiLive this year, not the preview 64 bit compiler,  or a public beta for Mac OS/X support as I had hoped.

Thew new roadmap mentions lots of Cloud Computing enhancements including Windows Azure and Amazon C2E.  This baffles me, since I know very few developers who are even interested in Cloud Computing, let alone actually writing code for it.  To me, Cloud Computing is still an experiment whose main participants are the big companies who can fund their efforts for a long time until they become profitable, or who make their money from advertising.  Cloud computing also rated 4th on “upcoming technology that would have the greatest impact on the development community at large”.  That was behind Mobile applications, 64 bit computing, and parallel programming.  I think it’s strange that such new technology is being incorporated into the Fulcrum release, when the survey didn’t ask when or if developers were going to target that environment.

What developers are targeting today, and tomorrow is the current Windows platform.  With Windows 7 copies flying off the shelves, you would think EMB would want to maintain it’s position as the best native Windows ADE.  Without 64 bit support it’s going to be difficult, and true 64 bit support will not be available until Project Pulsar is delivered (no timeline is given).  The preview compiler which will be available in 6+ months will not be able to generate Windows GUI applications if I interpret the slides correctly.

While the roadmap indicates that numerous projects are being worked on simultaneously, we’ve been hearing that since the last roadmap, and a year later the result is Delphi XE, now aka Fulcrum.  So far, from what I’ve seen, there is nothing earth shattering in this release.  In fact nothing worth upgrading for, and nothing that is a top priority request from the community or market.  To be fair, the top two items are big ones to deliver (64 bit Windows and Mac OS/X support), but could have been anticipated long ago if EMB had their finger on the market pulse. After a year of waiting it would be nice to at least see some progress, rather than Fulcrum features becoming what’s available in XE, and having everything else pushed back into Pulsar (now you see it now you don’t).

My concern is that resources are being consumed to deliver features to satisfy needs that have already been met, or are not true needs.  Subversion support is a great example of the former, and Cloud Computing the latter.  Why re-invent the wheel when most developers are using other IDE integrations, or Tortoise?  At one time this would have been a great addition, but that time has long since passed.  It still adds some value, but isn’t a priority.

I agree with Mason Wheelers’ latest blog post.  I certainly wasn’t impressed, but I was amused by the subtitle on the first slide “What we are telling customers we are going to go”.  Most excellent english.  It seems like EMB doesn’t understand that the community needs some assurance that a Pulsar release is imminent.  It’s interesting, and at the same time discouraging that EMB is repeating the mistakes Borland made.  Perhaps if you keep the same people, you keep the same company, and it’s just business as usual.

hcOPF - A Reusable Settings Dialog

Monday, August 2nd, 2010

One of the things I like best about using an OPF is that an application can usually be sectioned into re-usable pieces if you aren’t dependant on the data layer chosen, and using an OPF inherently removes a great deal of your dependancy on that data layer.

Once you choose Oracle as your database, anything that talks to the database is no longer re-usable if the database is changed to SQL Server for instance.  You can of course, limit these dependancies by crafting the code with this in mind, and limiting any database stored procedures or functions utilized.  Unfortunately, it’s been my experience that this just doesn’t happen.  Either it’s development time constraints to remain competitive, lack of foresight, or just a poor choice for the initial RDBMS.  By the time the product gets to the point where the database needs to be changed to provide better scalability, or suit a target client, it essentially requires re-development because it’s too tightly coupled to the DAL.

Using a DAL like DBX, or ADO helps in that you can connect to a variety of different databases, but it doesn’t solve the problem that different databases support different column types and SQL syntax.  For example, Interbase doesn’t support the bit datatype commonly used in SQLServer.  To handle such differences you could create separate datamodules and try to abstract them so on start up the application could determine which datamodule to use.  This requires a great deal of effort and forethought, which in practice, seldom happens.  Conditional compilation is another option, but it can get quite cumbersome.

An OPF solves the datatype issues by providing translations from the Field types the selected Delphi DAL maps to the database columns, to object attributes.  A boolean object attribute can be stored as a bit in SQLServer and a Char(1) in Interbase, and all that has to be changed in your code is a single line that defines the attribute metadata.

You still have to deal with any database specific code if you choose to override list Load/ApplyUpdates or object Read/Write methods, but the RDBMS specific code is drastically reduced.  It works so well, that I used hcOPF to enable me to work on an Oracle 10G based application at home.  I didn’t want to install or maintain Oracle on my home machine, so I used Firebird at home and Oracle at work, with almost identical source code, using a conditional directive to isolate the minor differences.

The added benefit is that you can code re-usable application pieces, such as the classic Settings or Options dialog found in most applications, including Visual Studio.  Using dynamically created mediators, the entire dialog can be data driven, and re-used across projects regardless of the database employed.  The only requirement are the basic Settings table structures.  Supporting the editing and validation of a new setting is as simple as creating a database record.  This is one step above component development, and could even be deployed in a package to maximize re-use.  Don’t expect this code to make it into hcOPF though, it’s not my IP to give away.