I Moved my Blog to the Mango Blog Engine

After using and loving wordpress for years and years, I’ve become smitten by the simplicity and feature set of MangoBlog.

Be sure to visit my new site today and bookmark it.

http://www.vincentcollins.com

I’ll be keeping this old blog up and running as an archive but all new posts will be here.

Boy, it’s been a long time since I’ve had something worth saying eh?  ha ha

Advertisements

ReactOS – Just stumbled upon this one

Open Source Windows OS cloneI have a laptop that I use to try out different operating systems occasionally when I get bored.  I recently installed the newest Ubuntu and was sadly unable to get the wireless driver to work.  Strange since the previous version did work.  Anyway, I was doing a little research and came across ReactOS, which is essentially an open source windows clone built from the ground up to avoid all the pitfalls the proprietary OS currently experiences.  It’s a project that is more than ten years in the making and the current code base has been developed over the last 7 years.

Sadly, I’m unable to install it on my laptop.  The install freezes while asking me what language I want to use.  I’m assuming this is due to some keyboard driver issue.  I then downloaded and attempted to install the ReactOS LIVE CD but it has stalled on the “installing devices….” screen.  My laptop is an HP Pavillion AMD Turion 64 with the ATI Radeon Express 200M graphics card.

Has anyone had luck installing the ReactOS 0.3.10 or any other release and if so, what are you thoughts?  I realize this is all considered alpha as the website suggests, just curious how the experience is.

http://www.reactos.org

Open Source Windows OS clone

Bringing “Old World” Customer Service into Today’s Trend of Electronic Transactions

This week I attended the Internet Retailer Conference & Exhibits. That posting brought a dialog with Margie and Ted and it got me thinking.  Who today is providing superior customer service online?

To better qualify what superior customer service is, let’s look at an offline store experience.  In this ever-changing world of impersonal online transactions, in this world of big box stores where you potentially never interact with a person with a name badge because you are forced to use self-checkout, who stands out as a leader in personal customer service in a physical store?

Best Buy

In short order, Best Buy kicked Circuit City out of the big box electronic store market.  Why?  Customer Service.  At least in my local Best Buy, you are almost guaranteed to talk to 4 different employees while in the building.

  • The greeter – Some say having this person is silly.  While they actually have two roles, a greater and a security monitor, I think they are equally important.  You walk in and someone looks you in the eye and says “good morning”.  You know right away that you can ask them for customer service.  You are guaranteed to have someone you can find and ask a question of.
  • The people in the isle – So you decide to buy a new harddrive.  Chances are that either on the way to that isle or once you are in the isle, an employee is going to ask you “can I help you?”  if you engage, they assure you at some point that they do not collect commission and that they are there to help you.  Their sole purpose is customer service.  Of course most every shopper while in a store is going to do a bit of wandering around and you are going to most likely talk to a third person asking if you need any help.
  • The checkout – At least in my Best Buy, there aren’t any self-checkout registers and I hope it stays that way.  Once again, the cashier is friendly and asks if you were able to find everything you were looking for.  Once again, you have the opportunity to speak to someone that can assist you with customer service.

I’m convinced that Best Buy beat Circuit City by this simple principle alone.  Not on price, not on selection but strictly on customer service.

Ok, enough you say, I get it.  This isn’t rocket science.  This isn’t new news.  Yes, I would agree with all of that.  However, the real challenge to online businesses and especially online-only businesses is how do you do this on your website?  How do you somehow break through the barrier of firewalls and websites and overcome the fact that you will never see your customer face to face?  This is the biggest challenge online merchants face today.

There are large sums of money spent on data mining.  Today online businesses know more personal information about their clients than offline businesses who’s customers mostly pay cash.  This is certainly important for target marketing and other reasons.  However, offline businesses are beginning to overcome that by offering rewards programs and the like to help level the playing field of information.  But what are online businesses doing to personalize transactions?

Live Chat programs such as Live Person, ActivaLive, InstantService, SightMax, Live2Support are just a few services you could integrate into your online businesses which allows your customers to quickly ask a question of a live person within your business.  What a great opportunity to proactively tell your customer we are here and ready to serve you.

Make your site social – Add the ability for your customers to talk to each other by adding features such as ratings, forums and tags that allow them to twitter or post something in facebook about your site or your product(s) with one click.

There are many buz words being thrown around like social sites and the like but what does it all mean and how do you package your site with these offerings in a way that makes sense?  There are many ways to make your online business more valuable than offline storefront businesses but the key question is how?

I WANT TO HEAR FROM YOU!

What online store(s) differentiates themselves in their market space by providing superior customer service and why?

Building Customer Loyalty Through Great Customer Service

What a Cliché right?

I’ve known this rule from the very beginning and how it will affect your bottom line directly.  However, time and time again, I find myself sacrificing this for other, more immediate things.  Things that I feel are either more interesting or more pressing to concentrate on:

  • Fix that patch
  • Monitor ad campaigns
  • Order that software update
  • Code that new functionality
  • Dabble in new, exciting programming techniques
  • Grab that cup of coffee
  • Check and recheck your email
  • Blog about something (oops, doing that now)
  • Jump on facebook for “a few minutes”
  • Tweet your latest musings

The list is endless really, but when I stop to think about it, what would have happened had I called up a customer directly and asked how their online experience was?  What could have been gained by this simple act?

I did that today.  I called one of my good, regular customers.  I introduced myself for the first time.  They have always done business via the web and so to them, our entire business front is our website.

I can’t tell you how shocked they were to hear from me.  “Who is this?”, “Why are you calling?”  At first they felt this was a sales call.  I assured them that I’m not selling them anything.  I explained that I wanted a couple minutes of their time to ask them what they thought of our company.

What happened next was incredible.  They were willing to share with me the good, the bad and even provided specific user experiences that caused them routine problems.  By the time our “two minute” turned 30 minute conversation ended I had two pages of notes scratched down on my yellow pad.  I thanked them for their time and promised that I would incorporate some of these issues into our next release.

They were genuinely appreciative of the personal phone call may have won them to our side for the long term.  The question is, if I hadn’t called them, would they have chosen our competitor down the road?  While I can’t answer this question definitively, I can say that the benefits of this simple 30 minute phone call certainly outweighs the time I could have spent checking my email…

This is one of a series of IRCE-related postings.  You can read more here:

I Attended This Years Internet Retailer Conference Exhibition in Boston, MA

I Attended This Year’s Internet Retailer Conference & Exhibition in Boston, MA

My first time attending the IRCE - No regrets

My first time attending the IRCE - No regrets

It was my first time attending the annual Internet Retailer Conference & Exhibition or IRCE and I’m not dissappointed.

In forums like the IRCE I’ve come to realize that many of the speakers are really smart, successful people who just want to share.  Even though there are direct competitors in the room, CEO’s and the like are up there talking about the wins and their mistakes and how they plan to fix them.  Incredible.  I came in with only one goal:  Learn as much as I can from smarter people

I own eCoast Jobs LLC and also run a New Hampshire focused job board ( NHJobs.com ) which isn’t necessarily a “Retail” organization but to me online retail stores are trying to achieve the same goals as I am as a web application developer.

  • Build Customer Loyalty through great customer service
  • Provide a unique online service and experience
  • Help your customers find what that want fast
  • Remove barriers to buy
  • Grow Market Share
  • Build your brand around your services
  • Once they are at your site, don’t mess it up!

I could build a much larger list of important rules or goals when building an online business of any sort, but to me, these stand out above all.

In the coming weeks, I’m planning on talking about these points in more detail.  I’m also going to be addressing the overall retail trends I saw while attending this show as well as what some of the industry leaders and innovators were saying at this conference.

Hope you consider joining me on this soon to come series of postings.

ARTICLES IN THIS SERIES:

More articles in this series to come…

My Dad was an Atari Programmer and Author

Joseph W. Collins - Author of Atari Color Graphics

Joseph W. Collins - Author of Atari Color Graphics

This afternoon I came across the photo to my right.  It’s of my Dad (Joe Collins) holding his newly published book, “Atari Color Graphics”.  This photo was taken in 1984.  The book was published September 1984.  I was 15 at the time.

I remember when the box arrived with several copies of the book.  It was a big deal at our house.  My dad had been writing pretty much all his life.  When he set out to learn how to write BASIC and more importantly the use of Atari’s color graphics, he was frustrated that there weren’t any books geared to the very beginners.  He spent long hours putting together this 203 page book.  To see it all come together, I was really happy for him.  I’m still very proud of his achievement and of course have my signed copy on my shelf.

His achievement really showed me at an early age that if you set your mind to it, you can do anything.  I did some googling and although it’s of course out of print, I came across some cool little tidbits.

Antic Bookshelf had a nice little article that I’ll republish here in the event the page goes away sometime in the future:

Atari Color Graphics - authored by Joseph W. Collins

Atari Color Graphics - authored by Joseph W. Collins

Atari Color Graphics: A Beginner’s Workbook is a useful introduction to 14 Atari BASIC graphics modes. These include the three GTIA modes and two modes (Graphics 14 and Graphics 15) unique to XL computers.
If you’re a beginning programmer, you’ll want to keep your BASIC reference manual close at hand, since the workbook only describes BASIC graphics commands.
Each workbook chapter introduces a different style of computer graphics, including high, low and medium resolution modes; single and multicolor modes; the GTIA modes and three text modes.
The book contains many illustrations and dozens of short type-in programs that demonstrate key points in each chapter. New BASIC programmers ready to add interesting graphics routines to their programs should start with this book.
(This book is available by mail from the Antic Catalog bound into this issue of the magazine.)
…Published by Arrays, Inc./The Book Division, 11223 South Hindry Avenue, Los Angeles, CA 90045.

Amazon had the published information but alas, no photo

Having a Dad with such a drive and interest towards knowledge and computers no doubt affected me.  Amazingly enough, I didn’t pick the path of programming until much later in my life but I’m enjoying it immensely now.

My Dad Rocks!

Active Directory LDAP Authentication

I recently had a project for a client where I needed to authenticate with their implementation of Microsoft’s ADAM. Behind the scenes they are syncing their Active Directory as well as their SAP data with ADAM.

Using ColdFusion, I was able to to do something like the following:

<cfif Trim(selUsername) neq "" and Trim(selPassword) neq "">
<cfset SearchFilter="sAMAccountName=#selUsername#">
<cfset viewfieldlistLookup = "sAMAccountName,distinguishedName,cn,memberOf">
    <cftry>
      <cfldap action="QUERY"
		      name="qry_authenticate_user"
		      attributes="#viewfieldlistLookup#"
		      filter="#SearchFilter#"
		      sort="sn"
		      start="#LDAPBase#"
		      server="#LDAPServer#"
		      username="#selUsername#"
		      password="#selPassword#">
      <cfcatch type = "Any">
        <cfset err = "#err#
	<li>Unable to find that username and password.</li>
">
      </cfcatch>
    </cftry>
<cfelse>
  <cfset err = "#err#
	<li>Username and Password are required fields</li>
">
</cfif><strong>
</strong>
<cfif err eq "" and IsDefined( "qry_authenticate_user.recordcount" ) and qry_authenticate_user.recordcount gt 0>
  <cfset variables.IsValid = 1>
<cfelse>
  <cfset variables.IsValid = 0>
</cfif>
...

The above works because all users of this organization has read only and search access for ADAM.

Now here is the interesting thing. For a different client, they don’t have an implementation of MS’ ADAM directory so I’m tasked with authenticating directly with their Active Directory. This company does not give the user read only or search capability of their Active Directory. So, I ended up having to rewrite it a bit by doing the following:


<cfset variables.IsValid = 0>
<cfset err = "">

<cfif Trim(selUsername) neq "" and Trim(selPassword) neq "">
    <cfset SearchFilter="sAMAccountName=#selUsername#">
    <cfset viewfieldlistLookup =
"cn,displayName,distinguishedName,givenName,homeDirectory,name,objectClass,sAMAccountName,sn,mail">
    <cftry>
        <cfldap action="QUERY"
                name="qryCheckUser"
                attributes="#viewfieldlistLookup#"
                start="#LDAPBase#"
                server="#LDAPServer#"
                username="#LDAPUsername#"
                password="#LDAPPassword#"
                filter="#SearchFilter#">
                <cfif qryCheckUser.RecordCount gt 0>
                    <cfset curDisplayName = "#qryCheckUser.displayName#">
                    <cfldap action="QUERY"
                            name="qryAuthenticateUser"
                            attributes="#viewfieldlistLookup#"
                            start="#LDAPBase#"
                            server="#LDAPServer#"
                            username="#curDisplayName#"
                                password="#selPassword#">
                    <cfif qryAuthenticateUser.RecordCount gt 0>
                        <cfset variables.IsValid = 1>
                    <cfelse>
                        <cfset err = "#err#
	<li>Username and/or Password Failed</li>
">
                        <cfset variables.IsValid = 0>
                    </cfif>
                <cfelse>
                    <cfset err = "#err#
	<li>Username and/or Password Failed</li>
">
                    <cfset variables.IsValid = 0>
                </cfif>
        <cfcatch type = "Any">
            <cfset err = "#err#
	<li>Technical Error Connecting to LDAP Server.  Please notify IT.</li>
">
            <cfset variables.IsValid = 0>
        </cfcatch>
    </cftry>
<!---
    Here is a list of Active Directory errors you could optionally test for:
    525 - user not found
    52e - invalid credentials
    530 - not permitted to logon at this time
    532 - password expired
    533 - account disabled
    701 - account expired
    773 - user must reset password
--->
<cfelse>
    <cfset err = "#err#
	<li>Username and Password are required fields</li>
">
</cfif>

Because the user doesn’t have permission to query AD via LDAP, I must use a system account to look up that person to find out if they exist first. There is an interesting twist in this second example. After a long time searching, I gave up on trying to find out why I couldn’t pass their NT username (sAMAccountName) and their password like I did in the first example with ADAM. After much trial and error, the only way I figured out how to do it is by looking up their DisplayName and passing that along with their supplied password instead. I think looking up their Distinguished Name (DN) works as well.

I’m assuming that AD blocks the passing of their NT Username for some obscure reason or more likely I have made a mistake. I’ll look to others reading this post for any insight. The current code works but I’m not 100% sure it’s the best solution.

I suppose another option is to set NT Authentication as a requirement for the directory within IIS and handle it that way. A colleague showed me a quick example which seemed like a pretty graceful way to handle things. I just am unclear on the compatibility of this option with other browsers, Servers like Apache, as well as possible problems from remote connections via VPN.

So, there you go, a couple of examples of how I have used ColdFusion to connect to two different LDAP compliant directories.

I’m looking for suggestions to make this better as well as any feedback you might have regarding the use of NT Authentication at the Web server level instead.