News
Events
Leadership Team
Technical Team
Jobs
Clients
Partners
Culture
Read Blogs
Call Us
Jobs
Follow Us
eImagine Blogs
eImagine takes great pride in our people. Our staff includes many outstanding professionals with deep industry knowledge and business experience. Our blogs reflect that, and cover a broad range of solutions and services. Search our blogs by author, category, or keywords.
  • Taking the Plunge: Indianapolis 2010 Polar Plunge for Special Olympics

    Freezin' For a Reason: 2010 Polar PlungeWe at eImagine believe that being truly present in our communities and every employee making a genuine personal impact creates integrity, accountability, and character that extends from the individual, through our business, and to our clients.

    In keeping with this tradition of community responsibility, I recently participated in the 2010 Indianapolis Polar Plunge. For those of you not familiar with Polar Plunge, it is an event hosted to benefit the Special Olympics. Those who sign up and raise the required amount get to go for a refreshing but icy swim.

    The event took place at Eagle Creek Reservoir where the Pike Township Fire Department cut through 2 to 3 inches of ice to create a swimming hole for the day's activities. The first order of business for the plungers was the Hair Gellin' because you have to look good when you’re making a fool of yourself. Then came the costume contest which was a blast. This year’s costume contest saw a variety of loonies including but not limited to, Smurfs (including local radio celebrity Scotty Davis), Scooby Doo and Mystery Inc., the Peanuts, and the cast of Jersey Shore.

    After the costume contest it was time to do what we had all come there to do - go for a swim. We lined up on the ice shelf and took turns jumping into the water, and while it was cold, it wasn't nearly as bad as you might expect. Plungers have two options - to get in and out of the water quickly or go for a lap and high five the fire fighters at the edges of the ice. After you exit the water it's a mad dash back to the locker rooms to get dry and enjoy the propane heaters.

    Polar Plunge is an awesome and crazy event that benefits a really great cause. However, there are a few things I wish I had known before participating that I’ll definitely keep in mind for next year:

    • If you plan on eating breakfast at the plunge make sure you get there plenty early - the doughnuts freeze and coffee disappears quickly.
    • You already look ridiculous swimming in February. You might as well give 110% and join the costume contest.
    • Plunging barefoot is ill-advised...everything is very slick, so wear proper foot wear.
    • Make sure you bring extra foot wear; cold, wet shoes make for an uncomfortable ride home.

    View my image gallery

    Full story

    Comments (1)

  • MS Dynamics CRM and Your Company's Facebook Fan Page

    In this post I’ll demonstrate how to create a newsletter subscription control on your Facebook fan page that feeds data into your Microsoft Dynamics CRM.

     Screenshot of newsletter button on Facebook Fan Page

    In MS Dynamics CRM:

    The first thing to do is create an attribute to store whether or not a contact wishes to receive the newsletter.

    Go to Settings, once there select ‘Customize Entities’. In the list of entities find and select the Contact entity. From the ‘More Actions’ drop down select Edit. On the left side of the window under the heading ‘Details:’ select Attributes. Create a new attribute and give it the display name ’Receive Newsletter’. Name the attribute ‘new_receive_newsletter’ (Note: Dynamics adds the ‘new_’ prefix automatically to all custom attributes, unless you have changed the default settings.) Next, set the Type field to bit and Save the attribute.

    In Asp.Net:

    In Visual Studio create a new ASP.NET Web Service project. Right click on the new project and select “Add Web Reference…” from the menu. The “Add Web Reference” window will open, from there you need to enter the url to the MS Dynamics CRM web service. (Note: It’s usually something like “http://urlToYourCRM/MSCRMServices/2007/CRMService.asmx”.) Click “Go” and VS will find any services located at the entered url. In the “Web reference name:” text box enter the name of the Namespace for the web service, I’ll be using “CrmSdk” for this example.

    Now open view the code for your web service. The first method we are going to add is for convenience:

    Listing 1.
        private CrmService GetCrmService()

        {

            CrmService crmService = new CrmService();

            crmService.Url = "http://urlToYourCRM/MSCRMServices/2007/CRMService.asmx";

            crmService.Credentials = new NetworkCredential("username", "password", "domain");

           

            crmService.CrmAuthenticationTokenValue = new CrmAuthenticationToken();

            crmService.CrmAuthenticationTokenValue.OrganizationName = "organization name";

            return crmService;

        }

    This method just creates an instance of the CrmService object and populates it with the information it needs to access you CRM. For simplicity in this example, all the values are inline but in your implementation you could store all this information in the web.config.

     

    Listing 2.
        private contact GetContact(string email)

        {

            ColumnSet columns = new ColumnSet();

            columns.Attributes = new string[] {

                "firstname",

                "lastname",

                "emailaddress1",

                "new_receive_newsletter " 

            };

            ConditionExpression emailCond = new ConditionExpression();

            emailCond.AttributeName = "emailaddress1";

            emailCond.Operator = ConditionOperator.Equal;

            emailCond.Values = new object[] { email };

            QueryExpression query = new QueryExpression();

            query.ColumnSet = columns;

            query.EntityName = EntityName.contact.ToString();

            query.Criteria = new FilterExpression();

            query.Criteria.FilterOperator = LogicalOperator.And;

            query.Criteria.Conditions = new ConditionExpression[] { emailCond };

            var result = GetCrmService().RetrieveMultiple(query);

            try

            {

                var u = result.BusinessEntities[0];

                return u as contact;

            }

            catch (Exception)

            {

                return null;

            }

        }

    In Listing 2, there is another convienence method for retrieving an existing contact from the CRM by their email address. This is used to ensure that we don’t duplicate a contact.

    Listing 3.
        [WebMethod]

        public bool SubscribeUser(string firstName, string lastName, string email)

        {

            bool create = false;

            contact c = this.GetContact(email);

            if (c == null)

            {

                create = true;

                c = new contact();

            }

            c.firstname = firstName;

            c.lastname = lastName;

            c.emailaddress1 = email;

            c.new_receive_newsletter = new CrmBoolean() { Value = true };

            if (create)

            {

                GetCrmService().Create(c);

            }

            else

            {

                GetCrmService().Update(c);

            }

            return true;

        }

    Listing 3 is the actual web service method Facebook will be calling. It uses the method from Listing 2 to get an existing contact if there is one, then update it with the information provided by Facebook. Depending on if the contact already exists, the contact is passed to either Create or Update accordingly.

    Now that the web service is created we can make it work with Facebook. While ASP.NET web services are capable of responding in JSON, they only do so if the incoming request is sent in JSON as well. Facebook will not be sending the request in JSON, it will be sent as a plain HTTP Post. In order to for this to work we have to intercept responses going to Facebook and convert them to JSON. To achieve this we need to create a HttpModule. Start by adding a new class to the project named FacebookCleanserModule. The class needs to implement the interface IHttpModule, so add that and implicitly implement the interface. We need to add the following code in the resulting class:

    Listing 4.
        public void Init(HttpApplication context)

        {

          context.BeginRequest += new EventHandler(context_BeginRequest);

    context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);

        }

        void context_ReleaseRequestState(object sender, EventArgs e)

        {

    HttpApplication app = (HttpApplication)sender;

    HttpResponse res = app.Response;

    if (this.isFBAjax)

    {

    res.ContentType = "application/json; charset=utf-8";

    res.ContentEncoding = Encoding.UTF8;

    res.Filter = new XMLtoJSONFilter(res.Filter);

    }

        }

        void context_BeginRequest(object sender, EventArgs e)

        {

    HttpApplication app = (HttpApplication)sender;

    HttpRequest req = app.Context.Request;

    string form = new StreamReader(req.InputStream).ReadToEnd();

    if (form.ToLower().Contains("fb_sig_is_ajax"))

    {

    this.isFBAjax = true;

    }

    if (req.InputStream.CanSeek)

    {

    req.InputStream.Position = 0;

    }

        }

    Next we have to add the class XMLtoJSONFilter to our project. The class should look like this:

    Listing 5.
    public class XMLtoJSONFilter : Stream

    {

        private readonly Stream _stream;

        private long _position;

        public XMLtoJSONFilter(Stream stream)

        {

            this._stream = stream;

        }

        public override bool CanRead

        {

            get { return this._stream.CanRead; }

        }

        public override bool CanSeek

        {

            get { return this._stream.CanSeek; }

        }

        public override bool CanWrite

        {

            get { return this._stream.CanWrite; }

        }

        public override void Flush()

        {

            this._stream.Flush();

        }

        public override long Length

        {

            get { return this._stream.Length; }

        }

        public override long Position

        {

            get

            {

                return this._position;

            }

            set

            {

                this._position = value;

            }

        }

        public override int Read(byte[] buffer, int offset, int count)

        {

            return this._stream.Read(buffer, offset, count);

        }

        public override long Seek(long offset, SeekOrigin origin)

        {

            return this._stream.Seek(offset, origin);

        }

        public override void SetLength(long value)

        {

            this._stream.SetLength(value);

        }

        public override void Write(byte[] buffer, int offset, int count)

        {

            string b = Encoding.UTF8.GetString(buffer, offset, count);

            XmlDocument doc = new XmlDocument();

            doc.LoadXml(b);

            string json = XmlToJSON(doc);

            byte[] data = Encoding.UTF8.GetBytes(json);

            this._stream.Write(data, 0, data.Length);

        }

        private string XmlToJSON(XmlDocument xmlDoc)

        {

            StringBuilder sbJSON = new StringBuilder();

            sbJSON.Append("{ ");

            XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);

            sbJSON.Append("}");

            return sbJSON.ToString();

        }

        //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array

        private void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)

        {

            if (showNodeName)

                sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");

            sbJSON.Append("{");

            // Build a sorted list of key-value pairs

            //  where   key is case-sensitive nodeName

            //          value is an ArrayList of string or XmlElement

            //  so that we know whether the nodeName is an array or not.

            SortedList childNodeNames = new SortedList();

            //  Add in all node attributes

            if (node.Attributes != null)

                foreach (XmlAttribute attr in node.Attributes)

                {

                    if (!attr.Name.ToLower().StartsWith("xmlns"))

                    {

                        StoreChildNode(childNodeNames, attr.Name, attr.InnerText);

                    }

                }

            //  Add in all nodes

            foreach (XmlNode cnode in node.ChildNodes)

            {

                if (cnode is XmlText)

                    StoreChildNode(childNodeNames, "value", cnode.InnerText);

                else if (cnode is XmlElement)

                    StoreChildNode(childNodeNames, cnode.Name, cnode);

            }

            // Now output all stored info

            foreach (string childname in childNodeNames.Keys)

            {

                ArrayList alChild = (ArrayList)childNodeNames[childname];

                if (alChild.Count == 1)

                    OutputNode(childname, alChild[0], sbJSON, true);

                else

                {

                    sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");

                    foreach (object Child in alChild)

                        OutputNode(childname, Child, sbJSON, false);

                    sbJSON.Remove(sbJSON.Length - 2, 2);

                    sbJSON.Append(" ], ");

                }

            }

            sbJSON.Remove(sbJSON.Length - 2, 2);

            sbJSON.Append(" }");

        }

        //  StoreChildNode: Store data associated with each nodeName

        //                  so that we know whether the nodeName is an array or not.

        private void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)

        {

            // Pre-process contraction of XmlElement-s

            if (nodeValue is XmlElement)

            {

                // Convert  <aa></aa> into "aa":null

                //          <aa>xx</aa> into "aa":"xx"

                XmlNode cnode = (XmlNode)nodeValue;

                if (cnode.Attributes.Count == 0)

                {

                    XmlNodeList children = cnode.ChildNodes;

                    if (children.Count == 0)

                        nodeValue = null;

                    else if (children.Count == 1 && (children[0] is XmlText))

                        nodeValue = ((XmlText)(children[0])).InnerText;

                }

            }

            // Add nodeValue to ArrayList associated with each nodeName

            // If nodeName doesn't exist then add it

            object oValuesAL = childNodeNames[nodeName];

            ArrayList ValuesAL;

            if (oValuesAL == null)

            {

                ValuesAL = new ArrayList();

                childNodeNames[nodeName] = ValuesAL;

            }

            else

                ValuesAL = (ArrayList)oValuesAL;

            ValuesAL.Add(nodeValue);

        }

        private void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)

        {

            if (alChild == null)

            {

                if (showNodeName)

                    sbJSON.Append("\"" + SafeJSON(childname) + "\": ");

                sbJSON.Append("null");

            }

            else if (alChild is string)

            {

                if (showNodeName)

                    sbJSON.Append("\"" + SafeJSON(childname) + "\": ");

                string sChild = (string)alChild;

                sChild = sChild.Trim();

                sbJSON.Append("\"" + SafeJSON(sChild) + "\"");

            }

            else

                XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);

            sbJSON.Append(", ");

        }

        // Make a string safe for JSON

        private string SafeJSON(string sIn)

        {

            StringBuilder sbOut = new StringBuilder(sIn.Length);

            foreach (char ch in sIn)

            {

                if (Char.IsControl(ch) || ch == '\'')

                {

                    int ich = (int)ch;

                    sbOut.Append(@"\u" + ich.ToString("x4"));

                    continue;

                }

                else if (ch == '\"' || ch == '\\' || ch == '/')

                {

                    sbOut.Append('\\');

                }

                sbOut.Append(ch);

            }

            return sbOut.ToString();

        }

    }

    This class will act like a normal stream, but by setting it up as the response filter (in Listing 4) it will receive the XML from our web service and parse it out into an equivalent JSON object and return that instead. Now we have to register the module in the web.config.

    Listing 6.
    <configuration>

      <system.web>

        <httpModules>

          <add name="FacebookCleanserModule" type="FacebookCleanserModule"/>

        </httpModules>

      </system.web>

    </configuration>

    Listing 7.
    <configuration>

      <system.webServer>

        <modules>

          <add name="FacebookCleanserModule" type="FacebookCleanserModule"/>

        </modules>

      </system.webServer>

    </configuration>

    Listing 6 shows how to register the module on IIS 6.0 or IIS 7.0 running in Classic Mode whereas Listing 7 is for IIS 7.0 running in Integrated Mode. There is just one more change we need to make to the web.config:

    Listing 8.
    <configuration>

      <system.web>

        <webServices>

          <protocols>

            <add name="HttpPost"/>

          </protocols>

        </webServices>

      </system.web>

    </configuration>

    By adding the HttpPost protocols to webServices we allow Post requests to our web service. Now all of this needs to uploaded to a web accessible host, since Facebook uses a proxy on their local server for AJAX requests, this can’t be hosted on your local machine.

    In Facebook:

    If you don’t already have a Facebook Fan Page, you need to create one, at the time of this writing it can be done at http://www.facebook.com/pages/create.php. Once you have a Fan Page add the Static FBML application to it. Edit your fan page and under the list of Applications you should see an entry from FBML, click edit on that entry. Start by entering the structural elements of your FBML.

    Listing 9.
    <a href="#" onclick="showform()">Subscribe</a>

    <fb:js-string var="subscribePopup">

        <div class="newsLetterControl">

        <form id="subscribeForm">

            <p>

                <span>Email:</span><input name="email" id="txtEmail" /></p>

            <p>

                <span>First Name:</span><input name="firstName" id="txtFName" /></p>

            <p>

                <span>Last Name:</span><input name="lastName" id="txtLName" /></p>

                </form>

        </div>

        </fb:js-string>

    As you see in Listing 9 we have a tag that starts with “fb:”, that just denotes that it is one of Facebook’s custom elements. In this case, the element takes whatever it contains and converts it to an object for use within your Javascript instead of displaying it.

    Screenshot of finished newsletter popup on Facebook

    Now we need to add logic:

    Listing 10.
    <script>

    <!--

        function showform() {

            new Dialog().showChoice('Demo Newsletter Subscription', subscribePopup).onconfirm = function() {

                var params = document.getElementById('subscribeForm').serialize();

                var ajax = new Ajax();

                ajax.responseType = Ajax.JSON;

                ajax.ondone = SubscribeCallback;

                ajax.post('http://urlToYourService.asmx/SubscribeUser', params);

            };

            return false;

        }

        function SubscribeCallback() {

            new Dialog().showMessage("Demo Newsletter Subscription", "You have been successfully subscribed.");

        }

    //-->

    </script>

    The code in Listing 10 will display a Facebook Dialog box with the contents of the <fb:js-string> tag as it’s contents. When the user fills out the form and clicks “Okay” it pulls out the form data and sends it to the web service you created earlier. When the AJAX call is successful it calls the method SubscribeCallback and displays a message to the user that they are subscribe to the newsletter.

    Full story

    Comments (0)

  • Small Business Server - Why Should It Matter to You?

    The eImagine Team is excited for our upcoming event on Wednesday, February 24 from 11:00am-1:00pm. We've teamed up with Microsoft and created an exclusive event for local small businesses. Free lunch, two prize giveaways including a Dell 10v Mini Netbook, and the chance to learn about an often underutilized product that you may own but not be using to the fullest - have we peaked your interest?

    When you're running a small business, your success depends on your business operating as efficiently as possible. You have to get more done in less time in order to stay in front of the competition. Do you have a small staff that often works remotely but still needs to collaborate when out of the office? Do you need 24/7/365 access to your email and documents from your mobile device? Is your staff editing documents and spreadsheets by sending emails back and forth, often losing track of the most recent version? If you own Windows Small Business Server 2008, you have access to the software and tools that can make your life easier. If you don't own SBS 2008 - maybe you should.

    During this seminar, eImagine will share with you:

    • The features of SBS 2008, Standard and Premium
    • The features and benefits of MS Exchange and Outloook, MS SharePoint, VPN and Remote Web Workplace
    • The importance of system backups and how SBS 2008 makes it easy
    • An overview of Windows 7 features

    For more detailed information on the features of Small Business Server 2008 that we will be discussing in our seminar, check out Brian Bewley's blog, "Not So Small Business Server."

     

    There's still time to register for our event (pre-registration is required because seating is limited). We hope to see you there!

    Full story

    Comments (0)

  • Think Managed Services

    To date the most popular form of fixing a computer Network or individual Computer is to wait until something fails.  This “Break-Fix” approach has been the bread and butter of the IT industry for years.  Something breaks, you call a tech to fix the computer, server, printer, etc., the tech comes out and does the “fix” then sends you a bill.  The problem with this approach is that you are waiting for something to break, the tech is hoping that something will break, and when the break happens there is a lot of stress and a big fire that has to be put out quickly, which interrupts productivity and is costly.  In business today how can any of us afford this approach to a part of our businesses that is so critical?

    The weakness in this model is that the tech is trained to only fix what is broken.  The tech will never know the answer to the question, “Why is the Network so slow”.  The tech has to wait until the Network is down in order to perform the fix.  The tech will recommend new services or hardware at this time because that is what the tech has been trained to do.  The tech has not been trained to proactively monitor and maintain the Network, Computers, Servers, Printers, etc. and keep that equipment healthy.

    The Managed Services Model offers a different approach.  With the Managed Services Model, the techs are trained to fix the problems before there is a system failure.  The managed services company has the tools that proactively monitor your systems and devices.  The tech is trained to see the signs of trouble and to answer  the “Why is the Network Slow?” question before anyone has noticed the problem exists.  If the network is slow, the Managed Services Tech is trained to have the solution! 

    With the “Break-Fix” Model when the network is down, the company that depends on the information that is stored on that network is down as well.  It is the “Break-Fix” tech’s job to get the network back up and running as quickly as possible.  Once the network is back up and running, the “Break-Fix” tech sits by the phone and waits for the next break to happen.  In the “Break-Fix” model there is no incentive to keep the system from failing.

    In the “Proactive-Managed Service” model the Managed Service Organization can be a true partner with your company to maintain network stability, usability and reliability.  The Managed Service Organization helps your company to plan and implement new technology that fits your business model and allows your company to see return on that investment quickly with little to no downtime involved.  The most expensive part of maintaining a network is the loss of productivity due to the system being down.  The Managed Services Model is dependent on your Network staying up at all times and operating at the highest efficiency.

    Full story

    Comments (0)

  • Not So Small Business Server

    Windows Small Business Server 2008 may have small in the name, but it is anything but small on features. The same technologies used by some of the largest corporations to handle messaging, security, remote access, and collaboration are part of the Small Business Server product. Microsoft has simply packaged them all together, made some tweaks to facilitate running them all on one server, and put some limitations on the number of users that can utilize the services. In this blog, I will highlight the main components of Windows Small Business Server 2008, and what function each performs.

     

    Windows Server 2008

    This is the core operating system that handles basic server functions like user authentication, file sharing, and printer sharing. Other common function like DHCP (IP address assignment), DNS (Domain Names System), VPN (Virtual Private Networking) support, and Terminal Services (Remote Access) are also handled by the operating system. Windows Server 2008 also includes NTBackup, the built in utility for handling system backups.

     

    Microsoft Exchange Server 2007

    This powerhouse application handles not only email messaging, but also provides a mechanism for sharing calendars, managing meetings and appointments, and scheduling resources like conference rooms and projectors. Think of Exchange as a conduit that coordinates people, places, and things.

     

    Microsoft SharePoint Services 3.0

    SharePoint Services does exactly what its name implies. SharePoint provides a web portal for sharing file and photos,  having group discussions, organizing and sharing company documentation and processes, and provides a foundation for creating workflow rules to help your business run more efficiently.

     

    Microsoft Windows Server Update Services
    The Windows Server Update Services provide a centralized mechanism for downloading and applying critical security and application updates to the server and workstations. Not only does this provide ease of mind and reduce IT support time, it also helps decrease bandwidth utilization on your Internet connection because only the server has to download the updates from Microsoft.

    Microsoft SQL Server 2008 (SBS Premium Edition only)
    Microsoft SQL Server is a standards based relational database system that provides a comprehensive data management and analysis solution. Many key line-of-business applications such as accounting and customer relationship management software utilize SQL Server as their database foundation. SQL Server also includes SQL Reporting Services which enables web-based delivery of reports, along with data export and automated report delivery features.

    Other Small Business Server Features

    To aid a small business in utilizing the components listed above, Microsoft has packaged quite a few goodies into Small Business Server. These useful applications are built on the key components and serve to illustrate the power of the platform. For example, a base SharePoint site is installed right out of the box that provides a full-featured Help Desk ticketing system. With a few minor tweaks, this can be converted into a customer service application, or call center monitoring system.

     

    Remote Web Workplace is another Small Business Server speciality. Built upon Microsoft Terminal Services, Remote Web Workplace provides remote access to both servers and workstations and does so using only a web browser and a single public IP address. This is very similiar to what many small businesses achieve through third party providers like LogMeIn or GoToMyPC. I have encountered far too many small businesses paying for these services simply because they did not know that their Small Business Server provided it for free.

     

    Conclusion
    Microsoft Windows Small Business Server is probably one of the most under-utilized platforms I've encountered. Far too many business owners and IT managers are not harnessing the power that is literally at their fingertips. For that reason, eImagine and Microsoft are hosting a seminar in February 2010 to help educate those in the community that either already own Small Business Server, or are looking at it for the future. We will go into much more depth on each of the components to ensure that those in attendance will see the potential and put it into action.

     

     

    Full story

    Comments (0)

  • A Time to be Thankful

    As Thanksgiving approaches, it is time for reflection and appreciation for the many things to be thankful for in our lives. I am thankful and appreciative of the hard work and dedication of our employees, particularly their contributions in our community. Too often we overlook the importance of companies contributing back to their communities. This past year, eImagine employees took active roles supporting the Arthritis Society, Special Olympics of Central Indiana, and the Juvenile Diabetes Research Foundation.  Being a parent of a child with type 1 diabetes, too often I feel alone and separated from the masses while managing the daily challenges.  Witnessing companies being involved and contributing their time, talent, and treasure toward the community, you realize you are far from alone and separated. This corporate involvement instills hope in the impacted families and in many cases, positively changes the lives of those families as well as those giving their time. As Thanksgiving approaches, being a Detroit native, I’m hopeful for a Lions win, but I’m forever thankful to the individuals and companies who contribute to our community and give us all hope for a better future.  

    Full story

    Comments (0)

  • In a World That's Constantly Changing...So is eImagine.

    As the newest member of the eImagine Technology Group team, I'm not alone. In less than a year, we've created six new positions that are key to the success of our evolving company. Our Founder and President, Joel Russell, has aggressive goals for our growth that we'll be poised to meet by 2013, when eImagine will celebrate its 15th anniversary.

    Immersed in an environment constantly focused on future growth, I've experienced the day-to-day atmosphere in our office to be exciting, challenging, and even overwhelming at times. With so many new faces, we're not only focused on moving fast to bring to market eImagine's newest business initiatives, but also getting to know each other and learning how to work together to build the strongest team possible to move those initiatives forward.

    Charting the course for our company's success today and over the next several years, each day brings a new challenge to our team. Personally, I'm thrilled to be working closely with such talented and forward-thinking professionals who, at the end of the day, are great people I consider friends. Success is the goal, but the people behind it are what matters most. Rapid growth brings both pain and great rewards, so its great to be surrounded by people you like and trust. I'm excited about our future and can't wait to share our successes as we continue using technology as the tool to solve our clients' business problems. 

    Full story

    Comments (0)

  • Using XP Mode Virtual Applications in Windows 7

    Windows 7’s XP Mode offers users a great option when it comes to providing legacy application compatibility.  Using Integrated Mode to run applications can be almost seamless.  Setup and configuration is easy, especially if you’re already familiar with Virtual PC.

    Just installing applications from the XP Mode desktop is often all you need to do.  (Assuming the Auto Publish setting is enabled.)  I always test the applications once in the desktop mode before running in integrated mode.  Also, make sure you completely log out of the XP Mode desktop before trying to run the newly installed application.

    If you want access to an application already installed, like Internet Explorer 6, it requires a little more setup.  Adding a shortcut to the Start Menu folder for All Users will work for most applications.  This also works for applications don’t have installers or don’t setup the Start Menu for you.

    Accessing other Windows XP features like Windows Explorer via Integrated Mode isn’t possible by just adding a shortcut.  Also uncommon shortcut types like VPN connections won’t work.  To call Windows Explorer, I created batch file on the XP Mode desktop to “call explorer.”  I then made a shortcut to the batch file, changed the name and icon to match the original, and put it in the Start Menu.  Now I can access VPN connections and other features without having to open the XP Mode desktop.

    Full story

    Comments (0)

  • Management & Delivery

    There is much to consider to ensure good delivery on projects.   There is no single factor for this, but there are common elements in the inventory that always need assessment and application.  The most important element is structured and consistent communication.  So many projects get off to a good start when all the news is hopeful, but communication lessens when there are risks, issues and concerns that we don't like to discuss.  These are the key areas to manage that breed success.  Risk and issue management and constant focus on reasonable deliverables and scope are the key ingredients to ensure communication and delivery.  A key approach to manage this is Agile development methods.  This approach has been "rebranded" and matured over the years, but whether it is called XP, SCRUM, Rapid Application Development, Iterations, Rapid Prototyping or some other name, a key focus in all these development approaches is delivery of working code and architecture early with strong communication and involvement with the customer.  Even in waterfall implementations, verification of key architecture and technology early in the process with key business functions is key to mitigate risks.  This done with collaboration on POC's (proof of concept) to review and manage high risk areas of the project have proven to be one of the most important factors for success.

    Requirements and scope management through iterations and agreement with the customer is another factor that is essential for success and to verify expectations.  All requirements are not equal and a balance of key business ROI and technical risk for initial iterations ensure the technical and business stakeholders have a clear understanding of priorities and why we are working certain features first.  This also allows for an earlier baseline system and the inherent benefits of a tangible design (a working system) that can evolve with significant user input and excitement vs. specifications on paper.  A working specification (code) is what we strive for.

    Good sound principals such as clear definition of roles and responsibilities, project planning and milestones, risk management, and scheduled progress reviews are fundamentals that we always employ to ensure communication.  These processes and related deliverables vary depending on the project needs and complexity, but experience on what techniques to use and flexibility in our development process depending upon the needs are what makes each project challenging and interesting.  In the RUP (Rational Unified Process), this process is part of the Environment Workflow.  This flow includes setup of the environment for infrastructure, development, testing, and equally important the management and process configuration approach and deliverables/artifacts needed to manage the project.

    Although we start with a common process for projects, experience and collaboration are the two key factors to provide the insight and flexibility that every project needs.  Experience with varied projects, industries, understanding varying levels of risk and needed controls, and collaboration techniques all come into play to set the stage for solid execution and delivery.  An extensive framework and the experience to use it is essential to balance controls and consistency with the flexibility on each project and customer.

    Full story

    Comments (0)