A couple of weeks ago, the fan on our home’s 30 year-old furnace began having problems starting. It would buzz and whine, and when I’d hear it doing so, I’d have to run downstairs and give it a “jump” with a flathead screwdriver. The thought of having the fan’s motor burn out while we were sleeping or out of the house was a drag. It was high-time for a new furnace, especially since the weather is beginning to feel winter-y. We narrowed down the list of applicable companies in Kitchener to three to get quotes on a new furnace.
One quoted us over the phone a couple of hours after we called them. The second company sent a sales person to our house to look at our laundry room (where our furnace is) and discuss various furnaces the very next day. The second company, Boehmers, is who we decided on and scheduled the installation to happen two days later. Dena and I are now nice ‘n’ toasty with our brand new high-efficiency furnace, and I’ve since put the screwdriver away.
Oddly enough, the third company that we contacted didn’t get a hold of me until today – 10 business days after we first contacted them! Ten days are a lot and I can only imagine what their sales process is at said company. Did they use something low-tech like PostIt notes to track leads and schedule follow-ups? Do they have a CRM system? Even the smallest of companies should be able to setup and maintain something simple like Act! or Maximizer, let alone offerings from Siebel, SalesForce.com or even Microsoft Dynamics CRM. Any CRM system, properly used, should be able to “tickle” sales people when a lead or a customer should be contacted. Even Outlook or gCal can do that at a basic level. It boggles the mind that it’s still possible for businesses to let opportunities slip when there’s technology that can help – simple and affordable technology at that.
No, this post will make no mention of bottle tokes.
For the remaining freelance gig in my spare time pipeline (which hopefully is winding down), an ecommerce site, I had to create simple user management system. Obviously, I’m not going to store users’ passwords as plain text in the database, but rather as a hash – an MD5 hash to be exact. Unlike the old days where you had to implement the MD5 algorithm yourself, modern programming environments have this conveniently part of some specific standard library. From PHP, hashing a password (or any other string data) is easily accomplished like this:
$plain_text = "ChrisBellini.com";
$md5_text = md5($plain_text);
// hash is '56d1df360dce2f5025c71fa7697af642'
That hashed value is then stored in the database and I can use it to compare during logins. Easy peasy.
Sometimes, though, I’d like to verify what a hashed string really is. What does “12345” look like after passing through MD5? If you can do that in your head, then you can probably move objects with your mind. For those of us lowly creatures who can’t, though, a simple way to determine this would be nice. I’m a .NET guy in my day job, so a quick console app should suffice. Using .NET’s MD5 library with C# is trivial.
string plain_text = "ChrisBellini.com";
UTF8Encoding objEnc = new UTF8Encoding();
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte  arrHashBytes = md5Hasher.ComputeHash(objEnc.GetBytes(plain_text));
// hash is '56-D1-DF-36-0D-CE-2F-50-25-C7-1F-A7-69-7A-F6-42'
That would do the trick, but what if I’m on my Linux computer? I could use Mono, but still… It sure would be nice to be able to do this quickly on any operating system. Enter Python.
plain_text = "ChrisBellini.com"
md5_text = hashlib.md5(plain_text).hexdigest()
# hash is '56d1df360dce2f5025c71fa7697af642'
Pop this into Python’s interactive interpreter, Idle, and you’ve got yourself some lovely hash.
Oh, the things one can learn on Reddit…
Google Trends is a fun diversion where you can view the popularity of any search term or topic and slice ‘n’ dice that by region. I came across this blog post about geographic trends in ‘adult’ Google queries. According to the list:
19. Rim jobs are apparently enjoying a spike of popularity in the small town of Kitchener, Ontario.
While I think that “small town” isn’t an appropriate description since Kitchener‘s population is over 200,000 and the tri-cities total close to 600,000 people, I digress.
Are those of us in K-W really into licking anuses to get our jollies? Maybe some are, just like they could be in any place on the planet. Speaking for myself, I say ‘yuk’ – Escherichia coli and love don’t mix in my books. In actuality the inventor of the Blackberry, Research in Motion (aka: RIM), is one of the area’s larger employers. Its corporate headquarters, primary engineering office and an assembly plant are located in Kitchener and Waterloo. Plenty of people in the Kitchener area would likely be interested in a job at RIM.
Google Trends is obviously only capable of lexical and not contextual analysis, and it makes for some funny blog posts.
On my first go-around, I got:
I missed ADDRESS, BASE, BASEFONT, BDO, CAPTION, CITE, COL, COLGROUP, DEL, DFN, DIR, FIELDSET, INS, ISINDEX, KBD, LEGEND, MENU, OPTGROUP, PARAM, Q, SAMP, STRIKE, TFOOT, TH, THEAD, TT, and VAR. I never use those.
Or instead of being truthful, one could just change the score to something ridiculous 🙂
If there were that many elements, that would be insane! Even with all the propriety elements in frameworks like ASP.NET and Java Server Pages….egads!
For those still following my online ramblings and unsure about my recent whereabouts, I’ll shed some light. Rest assured, I’m still vertical and breathing. I’m in the midst of finally wrapping up a freelance gig that’s gone in every direction but forward, more often than not. Thankfully, I finally see the light at the end of the tunnel. But I don’t wanna jinx it and cause a deluge of scope-killing feature requests to bugger up my luck.
Gimme two seconds, folks 🙂
The onChange event for HTML form elements is fired when the value of that element actually changes in Firefox/Seamonkey, Opera, Safari and any other other modern Web browser. It just makes sense. Yet for some lame reason with Internet Explorer, onChange is only fired once the focus on said form element is lost, effectively making onChange act like some freakish onChange+onBlur hybrid. WTF? I’m just wondering what the design reason that the Internet Explorer team at Microsoft came up with could be, is all.