Archives

Archives / 2007
  • New Job with McKesson and Other News

    Its been a very long time since my last post, but here I am again at last.  I just started a new job with McKesson this week as an ASP.NET Architect, where I'll be working on internal tools to support sales and marketing.  McKesson is currently 18th on the Fortune 50 list, being the largest health-care company, and I'll be working in their Alpharetta, GA, office.  I'm very excited about this change, both for the short-run and long-term, and I'm calling this a birthday present to myself since I just turned 40.  I still believe Mimsware to be the best Atlanta-based consulting company, and I highly recommend them, but I decided I wanted a more permanent role.  And McKesson isn't just any company -- they are also big enough that I can make a career with them and still find opportunity for change if I desire.  Its also a pleasant drive for me, taking back-roads from Woodstock, GA, although its a big change for myself and my family to not work from home.

    So that explains this post, but what have I been doing since the last one?  I suppose the easiest explanation is to simply say that I've been living!  My focus has very much been my family, and much less on being a tech guru, which was only a coincidence due to having lots of time a few years ago.  My wife Jenny is still cancer-free, and now reconstructive surgery is done, but earlier this year there was a tough time dealing with a reconstructive surgery that didn't heal which led to a much bigger surgery than expected.  But she's fine now and back at her job as a nurse in a cardiac cath lab.  Meanwhile, my kids are growing -- Tori is 10 and still enjoys dancing, while Zack is 9 and enjoys video games, and both stay busy with friends.  We also got a Wii, which is finally a game system we all can play together -- and I count it as real exercise in air-conditioning with no allergens!  I got Mario and Sonic Olympics for my birthday and even got a little sore.

    So what about the latest MS technology and my own endeavors like my O/RM?  I never set out to spend time on forums or to create a popular O/R Mapper -- I simply had a lot of free time several years back that I used wisely.  I love learning new technology, and I like to build something real that is useful to myself as part of that process, which is how it all started out.  I then discovered that others also found things I did very useful, which encouraged me to do even more, but then my O/RM took on a life of its own.  I found that I was no longer just learning or making something for myself, instead I was adding features for others and doing a lot of support also.  So Brian DeMarzo has taken my O/RM open source, and I'm just going to once again play with the latest MS stuff, like Linq to Sql and MVC for ASP.NET.  I may yet build something I think is useful enough to share with others, or at least learn enough for a new post, but if I don't then that's OK too.

  • Great News: Only One O/RM Shipping in Orcas

    I almost can't believe the great news that came from MS today.  That's right, the ADO.NET Entity Framework has been delayed !  I bet most of you think I'm being sarcastic, but I am serious.  I've got at least three reasons why this is good news to me.

    First, this gives Linq to Sql a better opportunity to thrive.  Linq to Sql is the "simpler" OR/M that's looking good enough for the vast majority of cases, while ADO.NET EF is far more complex -- and yet most gurus only wanted to talk about the EF.
     
    Next, since ADO.NET EF is so complicated, it absolutely must have a great designer ship concurrently, which was not the plan.  MS has apparently accepted this feedback since this is at least the publicly given rationale for the delay in shipping the EF.

    Finally, and this one may not pan out, but it is my own hope that ADO.NET EF is being re-aligned somewhat with Linq to Sql.  These two O/RMs are similar enough to share at least some code, and I believe that some of the MS guys have hinted at this too.

    So I'm happy that at first there will be one O/RM -- Linq to Sql.  The gurus may be disappointed, but the vast majority of MS devs will be new to O/RMs anyhow, and Linq to Sql will be good enough.  Very much like my simple WilsonORMapper has been so widely used.

  • Even Small Configuration Changes can cause Bigger Problems

    I've got a small app in production that's been running without a glitch until the other day.  It turned out to be a case where the server didn't have enough disk space and nothing more.  That should have been the end of it, but I also decided to add myself to the error emails.  The next day someone reported not getting their regular email, and I couldn't figure it out.

    Why would something that had been working perfectly and not been changed just fail randomly?  I looked everywhere in the code and could find no reason, and nothing was logged about this.  That said, there was an exception that was logged, but it was about my email, not the other.  My email address was on another domain, and that wasn't allowed, but I just shrugged it off.  Then it happened again today and all the sudden I realized what should have been very obvious.

    That small configuration change I had made to send myself error emails was the actual problem!  My code first sent error emails before sending routine emails, all of which was one try/catch  So when I added myself to the error emails, I introduced an exception that skipped the others.  This was now easy to fix -- just make each email send be in its own try/catch, instead of one.

    And the lesson learned:  any change, even a tiny configuration change, can introduce problems.  Even bigger lesson:  when problem occurs after small change, then your change is likely cause.  Those should really have been obvious in retrospect, but I managed to convince myself otherwise.

  • Atlanta Cutting Edge .NET User Group Meeting

    The Atlanta Cutting Edge .NET User Group is meeting Monday, March 5, 2007, at 6:00pm in the Microsoft offices in Alpharetta.  Paul Lockwood will be talking about advanced production debugging and Eric Engler will be talking about the ASP.NET AJAX framework.  Eric promises it will be about much more than the UpdatePanel, which seems to be the extent of most such talks.

  • Pet-Sitter Recommendation: Wholistic Sitting

    This is a non-technical post, but I don't do this often, so please indulge me.  We recently went on a vacation and had to find a new pet-sitter for our dogs, cat, and fish/turtles.  We ended up choosing Wholistic Sitting and were very pleased with Tanya's service.  She sent us emails during our trip, including pictures, and it was obvious she was spending quality time with our pets given her descriptions.  The house was also well taken care of, accidents cleaned up, and the mail brought in.  So I'm very happy to recommend Wholistic Sitting if you need a pet-sitter in the Woodstock, Canton, or Roswell area of Georgia.  And if you've always done kennels then think again, as pet-sitting doesn't cost anymore, especially if you have more than one pet, and your pets are much better off in your own home.

  • Hummingbird DM AEM: Automated Email Management

    I've had the opportunity lately to work with Hummingbird's Document Management (DM) system on one of my projects at Mimsware.  In particular I was tasked to install, configure, and learn about their Automated Email Management (AEM) system in a test environment.  What is AEM?  It is basically a plugin for MS Exchange that makes it possible for all emails in an organization to be automatically archived into the Hummingbird DM system according to flexible rules that you define.  The goal for some organizations will be to make legal compliance of email retention automatic, and any necessary legal discovery very easy, especially important in a government organization with open record laws.  Other organizations may also be interested in simply making email work like all other documents, so that one document management system can be used to store and search all types of documents in the organization.

    I was able to get AEM working effectively, but there were also several aspects of the installation and configuration that were not documented well, or which required a lot of trial and error, so I want to share some of the lessons learned.  We are using DM version 5.1.0.5 SR6, so that is what I installed for AEM to begin with, but at least on my system it would not start up successfully after an apparent successful install, so I had to use patch SR6 MR2.  I suppose some will say that you should always use the latest version, but a Hummingbird installation is a very complex beast, so once you have something in place that works for you, its a big deal to update everything.  Luckily in this case I was able to only install the new version for just AEM and leave the rest of the DM system on the current version, but even that was something that had to be thoroughly tested, and there may still be some unknowns.

    Once I had it installed it quickly became a very long and involved process to configure things correctly, but most of this was documented and in most other cases the log was sufficient.  I think the biggest problem is that everything is too configurable and that there are no smart defaults, and yet for this type of system there are a lot of defaults that just seem to be obvious.  For instance, they provide a default email profile, with fields to store the from, to, cc, bcc, received date, and send date, but none of these are configured for you so you have to specify both the profile and every one of these fields.  We also had some other custom fields that had to be set, and of course I would expect that to be my task, but I just don't see why they can't have the standard email fields defaulted to begin with.  But ignoring my custom fields for now, which were very easy to figure out with their log's help, here is what I determined to be the optimal set of profile values for the standard email fields:

    PROFILE=(DEF_MPROF), TYPE_ID=(EMAIL), ABSTRACT=(%s), EMAIL_FROM=(%f), EMAIL_TO=(%t), EMAIL_CC=(%h"cc"), EMAIL_BCC=(%h"bcc"), EMAIL_RECEIVED=(%h"datereceived"), EMAIL_SENT=(%h"date")

    The Type Id might be something else for someone else, since this was a custom type that I created myself, but I also think it just makes good sense to define an Email type to best differentiate email documents.  The Abstract value, which is used for the document description, and wasn't documented anywhere that I could find, may also be something that you may want to set differently -- I've simply set it to the subject.  On the other hand, all of the other values seem non-debateable to me since of course you want the from value set to the from address, and so one for the to, cc, bcc, received date, and sent date.  I should point out though that they do not document the dates anywhere, which seems to be an important oversight since these are pretty standard email fields, but I was able to figure out the sent date myself since it is a normal email header.  The received date on the other hand is very simple once you know what to do, but it took support a while to get this one found for me, and the received email header is quite involved so it was not something I could figure out myself.

    At this point I had it all installed and configured so that I could successfully send and receive emails and see them captured and stored in Hummingbird DM according to the rules that I had setup.  But there were still a few other problems that became apparent in testing -- the first being that email attachments were not getting profiled separately, which was an option that I had specified I wanted enabled during the installation.  It turns out that the installation program did not set a registry value correctly, and support was able to identify this pretty quickly, but I'm still not sure why this wasn't set correctly by the installation program.  I should also point out that this registry setting, and many others, are well documented, including some that have to be manually set since they do not have options in the installation, like full-text search.

    And that left me with everything working correctly with the exception of one advertised feature that was unable to work in my case, although its also a feature that we can probably do without for the time being.  The advertised feature is that you can specify folder names that don't yet exist and AEM will automatically create them on the fly, which I can see some shops wanting to better organize emails by sender or receiver or some other dynamic criteria.  My understanding on this issue, after many discussions with support, is that this feature does work in environments that do not have custom fields of their own added to the default profile form, but its our customizations that are causing it not to work.  Of course it does beg the question of how they never accounted for this situation before, since I would bet just about every Hummingbird setup involves some customizations, which they also strongly encourage by the way.  Oh well, its now on their list to fix, and its probably something we can live without for now, but hopefully by documenting here, along with my other lessons learned, I can save someone else out there some time.

  • LINQ to SQL "Real" Example App Available

    The Atlanta Code Camp was today, so I finally got to give my LINQ and O/R Mapping talk that I've been preparing.

    I tried to have minimal slides so that I could do a deep dive into real code, but I still went a little too long.  The slides look great on my own PC, and in fact they're mostly some I stole straight from other LINQ presentions.  But the overhead I was using made the text nearly unreadable for some reason, which made me take longer on the slides.  It also made some of the standard VS color syntax unreadable, with the work-around being to select that code.  I small the same problem with another speaker in the same room, so I guess it was the projector, but very frustrating.

    In the end I still got to hopefully show a fair amount of LINQ to SQL, but I had really hoped to show more.  I also made sure I gave a glimpse at SqlMetal and LINQ to Entities, but both of those were meant to be just glimpses.  Finally, I briefly demoed my new "real" example application written with LINQ to SQL which is included in my download.  This example shows off my own POCO objects with an external XML Mapping file, instead of the ugly code gen with attributes.  Its also a "real" app that consumes the LINQ to SQL with WinForms grids, drop-down filtering, and create, update, and delete.

    Note that it assumes the May 2006 CTP, but I'll update it to the next one when it comes out, hopefully next month.  Its also nearly identical to my existing "real" example app downloads that I have for my own ORMapper and NHibernate.

  • Mimsware Website Updated due to Blog Comment

    You may remember me posting about joining Mimsware as a software consultant here in Atlanta a couple of months ago.  Well first let me say that things are going well and that I really enjoy working with Mimsware, and of course I highly recommend them if you're in the Atlanta area.  But it was pointed out by Wim in the comments that Mimsware's website looked like Microsoft's website back in the year 2000.  Well I'm happy to report that Dave Mims took that comment to heart and made updating the Mimsware site a priority -- so take a look now.  Its also worth noting that Dave did already know that it really needed updating, but it had just never been a priority until Wim's comment.

  • Atlanta Code Camp 2007 Registration is Open

    Registration for Atlanta Code Camp 2007 on January 20th is now open.  Space is limited and fills up fast, so do NOT delay registering -- it's free.  Thanks to Jim Wooley for putting this together this year.

    I'll be presenting a session titled "Linq and O/R Mapping" that will be lots of real code and very little powerpoint.  If you've seen the standard Linq sessions already, or even if not, but you've been wanting more then this is for you.  I'm not going to waste any time on Linq to Objects or Xml, although those are cool in their right -- I will focus purely on Linq to Sql, and to a lesser extend Linq to Entities or Datasets.  Do you want to see a real application built using Linq to Sql?  That's what I plan to do, and I'll do it several ways so you can experience the possibilities.  For instance, should we use SqlMetal, the GUI Designer, or do our own thing with xml mappings instead of attributes?  What if you want to include some relationships, use some stored procs, and even some inheritance?  We shall cover all of those possibilities and more -- you will NOT be disappointed since this will not be just another slide deck or sample series based on what's already available.  In fact, I would actually challenge you to find any other "real" sample that includes all of these with xml mappings, but you won't find it since it doesn't exist.  I hope you get that I'm excited about this, as these technologies have definitely matured past my initial criticisms.  And even if you can't make it for some reason, I'll post at least some version of my sample app after the event is over for all to see.