Friday, February 11, 2011

Installing Drupal 7.0 Experience on Joyent SmartMachine

This is a quick note to myself regarding the installation of Drupal 7 on Joyent SmartMachine

  • Creating the database and user is done from the Webmin->Servers->MySQL_Database_Server.  Be sure that the you give the select, create, drop and insert permission to the mySQL user that you will give to Drupal
  • SSH Login as the admin user then sudo bash
  • The content of the drupal tar goes into /home//web/public so in other words in that directory, you should have install.php
  • PDO may be disabled (it was in my case). To enable it, edit /opt/local/etc/php.ini and uncomment pdo.so and pdo_mysel.so uncomment to mean to remove the semicolon.
  • From the shell reboot the machine by tying in "reboot"  This will activate the PDO (there are other ways to do this, this is one of the quick ways to do it.)

Sunday, February 06, 2011

Annoyed by: System.Xml: The node to be inserted is from a different document context?

 Symptom:

You try to copy one or more XML Nodes (usually elements though) from one XMLDocument and another, and you get the following error:


System.Xml: The node to be inserted is from a different document context.

My Fix, Hint:

(Note from 1/21/2012: Try using the XDocument class and LINQtoXML, it's much easier to deal with!)

There is an official way to fix this using clone, import and InsertBefore or After. But that's too difficult to figure out, in my case I still get the above mentioned exceptions. I often do not know which node to insert (you are supposed to find the parent node then insert) or afraid to insert something at a wrong node level.

Rather than wasting a whole lot of time, I do this entirely in text using StringBuilder and such. You will find the following methods very handy.

XmlNode.OuterXML

  • This contains the Text representation of XML including the node itself and all of the children.

XmlNode.InnerXML

  • This contains the Text representation of XML node of all its children.

You know that you can build up a string using StringBuilder.Append(string) you can form the basis for the new XML document which some of the node data copied from another XML document WITHOUT having any issues with copies being prohibited between two documents.

As an added bonus, you can see exactly the new XML document being formed since it is in the string form.

Once you form the destination XML, there is a handy function LoadXML(string), and you are back to have the new XMLDocument. There absolutely is no need to create a StringReader or stream of any kind.



XmlDocument xd = new XmlDocument();
var sx = sDoc.ToString();
xd.LoadXml(sx);

Hope I gave you enough hint here, but if you need a more complete coding example, please post a comment and next time I come back here I will write one up for you.
 

Thursday, August 19, 2010

Notes on Amazon EC2 Image Creation Fails for Windows Machines

Disclaimer:
  • This is my notes on the topic and not necessarily a complete solution. In fact, probably it contains some very inaccurate information (but you can help to rectify this via your comments.)
  • This article also pertains to EBS Backed Windows EC2 running instances.
One of the things all of us should do is that once we have a stable machine running, we'd want to save the image of it so that if, for some reason, we completely trash the running image, we have something to go back to without spending a lot of time putting the machine back from the scratch.

Obviously I have tried this with varying degree of success and information on this is scattered around the Amazon AWS forums and on the web. The most common of the errors would be that the Image creation begins and then after a long while it says "Failed" but without much explanations why. Some people on the net are saying the success rate is 40%. I was actually relieved to find this because I thought it was just me that's suffering this much failure rate!

The Amazon documentation is not very clear to me as to what and how to do these things. It seems to require you have gained some more "under-the-hood" knowledge of this. And as a just a casual user of the system I expect that I should not need to learn everything to use it.

In addition to that as a "basic" user, I don't get any direct support from Amazon. That's at least $100/mo or much more for silver or gold support privilege even in these kind of the situations when the failure (even just to explain what to do) is on their side.

I also highly suggest you install Elasticfox on your browser. Since the following descriptions will be based on how I'd do things on Elasticfox.

My Findings on Creating a Copy of Running Image
  • To do this on Elasticfox, go to the Instances list, right click and select Create Images (AMI) item.
  • Many people reported that when creating a copy from the running image, it will stop and restart the instance. This does happen. Worse yet, it will be stopped for the entire duration of when it is taking the snapshot, depending, this could be 10s of minutes. You'd probably want to schedule a down time. I should have done this just as soon as I have created the initial instance before went into production. Elasticfox does have a menu item not to reboot the instance I have not yet tried this.
  • Some people say it has to be a Running instance, but that seems to be not true. I can image from a stopped instance as well and I have made images successfully this way via Elasticfox. In fact, that has more success rate than doing it on a running instance.

Some of The Issues I Have Discovered That Cause Failures
  • Again, copying the running instance will cause a restart, so be prepared for the downtime.
  • If you have already stopped the instance, it is at least more likely the imaging will succeed. A few caveats on this are that, at least in my case, the Elastic IP will get disassociated with the instance as shutting down the instance will detach the Elastic IP (wish they did not, at least for a short time), and also the machine's local addresses will change after restarting. This means that if you are locally pointing systems, for example, SQL, then the that address have to be re-configured in each application.
  • Processes like SQL or other high I/O or CPU consumer items should be stopped. In fact, you should pare down the services to essentials (like SQL, agents, browser etc.) before taking the image copy. The one exception to this is not to stop the Amazon's EC2 services that came with the original Windows image whichever they exist.
  • If you have other volumes mounted that also leads to a failure. Stop all services and applications you don't need to be running then dismount any "drives" and then make the image copy. This seems not be an issue if you are imaging a stopped instance.
Well, good luck and if you find this article correct or wrong, please let me know in the comments so that I can actually improve it.



Wednesday, August 18, 2010

IIS 6: Installing Duplicate Certificates to Multiple IIS 6 Servers For Server Farm Implementation

Symptom:

You have more than one servers that are hosted through a load-balanced router. The external address is assigned to (obviously) a single Fully Qualified Domain Name (FQDN). You want to install the same server certificate that represents the same domain name across all your IIS 6 based servers.

Procedure:

First off, yes you can do this. The procedure is very clearly explained in this Microsoft article:


Just in case we lose above article, here is the gist of how it is done.
  • Request and install the cert on the first server as you would normally do. Don't do the request from other servers, if you do, remove any pending cert requests.
  • Open the MMC and add the Certificate module.
  • Open the Computer Account then Personal certificate folder.
  • Navigate down to the Web Certificate you want to export.
  • Right click tasks and Export.
  • In the wizard select to include the Private Key and include all certificates in the path in the next page.
  • Copy the exported result to another server
  • Do the same MMC stuff
  • Import the stuff you exported into the Personal store
  • From the IIS certificate section of the Directory Security, do the "Assign an Existing Certificate"
That's basically all you need to do.



Getting an XmlNode (or XmlElement) Out of XPathNodeIterator (C#)

Symptom:

You have a code you iterate through a group of Xml Nodes (for most people that's XmlElement). You have however noticed that once you get to a specific spot, there is no easy way to perform the complete node operations against the iterator since Casting of the iterator to XmlElement results in a compilation error.

So, you cannot cast the Current of the iterator like

XmlNode node = (XmlNode) i.Current;

(I really think this is a poor design myself since it goes against all our intuition.)

Solution:

Well, there actually is a way to "cast" this to an element, but the syntax is a bit more involved.

XmlNode node = ((IHasXmlNode) i.Current).GetNode();

Or in most cases you can cast this to XmlElement by

XmlElement node = (XmlElement) ((IHasXmlNode) i.Current).GetNode();

Get a Permission Error When Creating A New Scheduled Task

Symptom:

You tried to create a new Scheduled Task on Windows XP (may be other version of Windows) and you get a Permission Denied error even though you are logged in as the local administrator.

Fix:

The Schedules are stored under C:\Windows\Tasks Unfortunately if you try to alter the permission on the specific folder you may not be able to.

In order to get around this, you can 'Mount a Network Drive" of the path \\[YourComptuerName]\c$\Windows\Tasks

Be sure that Tasks is the top level of the share.

Now you can right mouse click the mounted drive and you can change the permissions.

Friday, July 23, 2010

The Difference Between XmlNode and XmlElement

Symptom:

You are confused why there are XmlNode and XmlElement classes.

Answer:

I was confused by this too. The confusion stems from the fact that if we deal with XML text (especially coming from the understanding of HTML and editing them with Notepad or whatever), what we normally deal with in XML are XmlElements. But in the Xml Standard, even the attributes within an element is a Node.

The detail is that XmlElements are the ones that has tags.

The second source of confusion is that just about everything in Xml is a subclass of XmlNode. That includes attributes in an XmlElement.

We should also note that in System.Xml namespace, XmlElement is a subclass of XmlLinkedNode class which is worthwhile examining in the Microsoft document.

All of this stems from the fact that Xml DOM (Document Object Model) dictates that everything is derived from the single Node class and System.Xml class classes closely follow this hierarchy.





Sunday, July 18, 2010

Creating XMLDocument from Program Embedded String in C#

Problem:

You want to quickly create a simple XML document without needing to write data to a file.

Solution:

Use StringReader class and feed that into the Load() function.

 Example Code:
XmlDocument doc = new XmlDocument();
doc.Load(new StringReader("<myNode>Hello</myNode>"));


Update: Well, that was doing too much, Load(string) would have worked just as well.

How To Use InsertAfter() in XmlDocument and Copy Nodes from another XmlDocument

Symptom:

You tried to insert an element (actually it has to be an XmlNode) using InsertAfter() or InsertBefore() method as doing so results in an exception with "The reference node is not a child of this node."

You also want to do the same but take a node from one XmlDocument to another.

Personally I feel that the Xml classes in the .NET Framework is not very intuitive. If you approach them as if they are regular List or Tree class type collection, then you will get a bunch of exceptions.

In terms of InsertAfter() type operations, this is a Node based operation and you normally cannot run InsertAfter() against the XmlDocument object. You must at least go down to the first child of the document, then invoke InsertAfter() at the node with the new node data (to be inserted) and the reference node location. This is most puzzling to me but that's what you need to do.

In terms of copying the data from a node in one document to another, all the nodes created or inserted in one XmlDocument have the membership to that XmlDocument. This is why new nodes must be created from the originating document using CreateElement() type calls. If you are familiar with creating a new row from the DataTable class, then you also know that you have to add that row to the table later is similar to this approach.

To confuse the matter, there are Clone type functions in XmlNode (see note below*). In this context they seem to be of no use (again that's not intuitive to me, since I tend to think if you clone it, I would say you created a detached instance.)

In actuality though, it is an error condition if you simply copy the node to another XmlDocument. This is also separate from where the node resides in overall tree of the nodes. ImportNode() simply buys the membership in another XmlDocument without reserving exactly where your own seat is.

Another important point to remember is that the Node (or Element) you insert to another XmlDocument should be the one returned from the ImportNode() method and not the one you passed to ImportNode(). If you try to insert the node that you passed to the ImportNode() method, you will get an exception "The node to be inserted is from a different document context."

XmlNode useThisNode = doc.ImortNode( myOriginalNode );


Solution Example:

The following code example demonstrates how InsertAfter() should (or at least could) be used, then add yet another node from another XmlDocument (created in-line in the code).

 XmlDocument Insertion Example
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.XPath;
namespace XMLDocumentExample
{
class Program
{
static void Main(string[] args)
{
// === EXAMPLE 1: How To Use InsertAfter in XMLDocuments ========================
XmlDocument doc1 = new XmlDocument();
// This XPathNavigator creates a convenient way to Write out the tree on the console.
// we don't use it for nothing else in this example.
XPathNavigator nav1 = doc1.CreateNavigator();
// This creates the root document, which all XML documents will need.
// i.e. <doc1></doc1>
XmlElement e = doc1.CreateElement("doc1");
doc1.AppendChild(e);
// Everything in thid document are the child of the root. I will purposely make a
// Mistake here so that I don't have doc1.2.0 element. I will demonstrate inserting
// doc1.2.0 using InsertAfter.
/*
*
* <doc1>
<doc1.0.0 />
<doc1.1.0 />
<doc1.3.0 />
</doc1>
*
*/
XmlElement c = doc1.CreateElement("doc1.0.0");
e.AppendChild(c);
c = doc1.CreateElement("doc1.1.0");
e.AppendChild(c);
c = doc1.CreateElement("doc1.3.0");
e.AppendChild(c);
Console.WriteLine(nav1.OuterXml); // Will show you you have doc1.0.0, doc1.1.0 and doc1.3.0 now.
// Now we will try to add the missing doc1.2.0 and just as a bonus I will attach doc1.2.1 as the
// child of doc1.2.0
// First let's get to the node AFTER where we will insert doc1.2.0, so that will be doc1.1.0
// Note you can either use /doc1/doc1.1.0 or //doc1.1.0 as the XPath query.
XmlNode nod1_1_0 = doc1.SelectSingleNode("//doc1.1.0");
// This block of code assembles doc1.2.0 node and its child doc1.2.1
XmlElement n2 = doc1.CreateElement("doc1.2.0");
XmlElement n2c = doc1.CreateElement("doc1.2.1");
n2.AppendChild(n2c);
// This is the most tricky important part. You have to ask the parent node to InsertAfter, and not
// directly with doc1.
//XmlNode myParent = nod1_1_0.ParentNode;
//myParent.InsertAfter(n2, nod1_1_0);
XmlNode mp = doc1.FirstChild;
mp.InsertAfter(n2, nod1_1_0);
// The result would look like this:
/*
<doc1>
<doc1.0.0 />
<doc1.1.0 />
<doc1.2.0>
<doc1.2.1 />
</doc1.2.0>
<doc1.3.0 />
</doc1>
* */
// Write the tree out on the console.
Console.WriteLine(nav1.OuterXml);
// === EXAMPLE 2: Copy A Node from One XMLDocument to Another ==============
// Create the Second XmlDocument, and then copy a node in the second
// document into the first document.
XmlDocument doc2 = new XmlDocument();
doc2.AppendChild(doc2.CreateElement("doc2"));
doc2.FirstChild.AppendChild(doc2.CreateElement("doc2.0.0"));
XPathNavigator nav2 = doc2.CreateNavigator();
Console.WriteLine(nav2.OuterXml);
XmlNode node_2_0_0 = doc2.SelectSingleNode("//doc2.0.0");
// Note that this does not append the node, it simply says that
// a foreign node can now belong to the first document.
XmlNode importableNode = doc1.ImportNode(node_2_0_0, true);
doc1.SelectSingleNode("/doc1/").AppendChild(importableNode);
Console.WriteLine(nav1.OuterXml);
Console.ReadLine();
}
}
}



*Note: Cloning of a node is required when you need to make a copy of a node and insert that back into the same XmlDocument. It appears that you cannot make a reference to a node and insert that (of course, if you can do that then there is a side effect of both node data changing if you edit the content of one node.)


Handling Customer or Press Complaints of Issues

Symptom

Customers are equivocally complaining about some aspect of your product.

Solution:

I just watched the 15-minute video of Steve Jobs iPhone 4 July 16th Press Conference and I was very impressed the way he handled the situation. So next time something like that happens to me I am going to note what I've learned from this lesson.

Before you contact the customer the following preparation should be made:
  • Gather as much facts and historical information about the performance of the product, for example issue call or email history from the customer or other customers, and the same for other similar customer set. Note: This is why you should rigorously record all issues using some type of database.
  • Know the workarounds. In other words, don't even contact the customer or give a conference before you know the workarounds.
  • Be prepared with the software patch but do not release it before you contact the customer. Since visibility of your effort is important, do not install it until the customer can expect to see the improvements.

While contacting the customer:
  • First, create a less stressful and friendly atmosphere. Tell jokes, other stuff.
  • Begin with a positive tone by saying that your product is the best available, worked hard on it by best people and if you do have good reviews and so forth, tell them about that.
  • Next, indicate that you are puzzled why the customer is making such claims to the best product available.
  • But show that the customer is always right, so you say that "we have started to look into it."
  • First, say: "Nothing is Perfect. You know that, and I know that."
  • With not-so-surprised expression, talk about similar situations on other similar products. Tell customers that it is not just "our" product that is having the issue. Bring up the facts by video or verifiable statistics.
  • With a surprised expression (if your number is actually lower), explain about the claim by other verifiable (or at least authentic) figures such as previous dissatisfaction statistics (number of issue tickets, number of returns).
  • If you have a patch, inform the customer about it and then release or install it.
  • Deny most of allegations, but admit a little
  • Offer workarounds until the issue is completely solved, including refunds if that's possible.

Saturday, July 17, 2010

Unable to switch the encoding at System.Data.SqlClient.SqlConnection

Symptom:

You have done the following:
  • You have set up an SQL table with XML data type in it.
  • You have a Strongly Typed DataSet
  • You try to write XML from a C# String
  • You get the following error
You have a DataSet unable to switch the encoding at System.Data.SqlClient.SqlConnection

What Fixed It For Me

The part of the original XML which went into the string had


in the XML heading

by simply switching this to


That fixed the problem.

Note:
  • In my case the real issue was that the actual strung was encoded in Unicode (UTF-16) but the XML header said utf-8. That mismatched.
  • In your case the actual string may be encoded in some other format such as utf-8. Be sure to check. If the real encoding is the issue then you could re-encode your string from what you have into UTF-16. Look for System.Text.Encoding class on MSDN for further information.


Tuesday, July 13, 2010

Finding Uptime Using 'net statistics server' on Windows 2008 Server Does Not Work

Symptom:

You type in to a CMD.exe the following command,

net statistics server

and it was showing the uptime of the server on your Windows 2003 server, but when you tried this on a 64-bit Windows 2008 Enterprise R2, it does not show correct time.

Fix:

Though bizarre, try

net statistics workstation


Please note that in my situation the server is 2008 R2 SP2 but it still does not work with 'net statistics server' Since the workstation command works, I am OK by it.

Saturday, July 10, 2010

Ignoring .MySCMServerInfo in Visual Studio Web Project

Problem:
  • You are using Microsoft Visual Studio 2005, 2008, or 2010 with Seapine SurroundSCM.
  • When you are working with Web project you see annoying .MySCMServerInfo file in each directory and furthermore, VisualStudio make you check them in when SurroundSCM does not want you to check them in. You don't get this issue when you are working on non-Web (e.g., "desktop" or class library) projects.
Solution:


Just in case the answer link is lost in the future, the idea is to add the Ignorable File Key (yes, Key with the name of the file(s) you want to ignore and not the Data) with file names you want to ignore from the source control. It works on Version 8.0 (VS 2005), Version 9.0 (VS 2008) and Version 10.0 (VS2010).

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Packages\
{8FF02D1A-C177-4ac8-A62F-88FC6EA65F57}\IgnorableFiles\.MySCMServerInfo]

Monday, July 05, 2010

ASP.NET MVC2 New Project Fails To Build with 'The type or namespace name 'Controllers' does not exist in the namespace..."

Symptom:

You have just created a brand new MVC2 Web project and tried to compile and run without anything modified and you get the following error:

The type or namespace name 'Controllers' does not exist in the namespace

What Fixed For Me:

The Unit Test project does not have the reference to the Main project. Just go to the Reference folder of the Unit Test Project and make a reference to the Main project.


Tuesday, June 08, 2010

Windows Server Hosts File Ignored or Not Looked Up

Our Symptom:

We often need to circumvent customer/client's DNS or supplement them since FQDN is a very stringent requirement for Microsoft SQL Server Mirroring technology.

One of the tricks we use is to edit the local hosts file C:\Windows\System32\Drivers\Etc\Hosts to yield correct FQDN internally.

At one point I have noticed that no matter what I enter the information there, they are ignored.

Also you may have noticed this when the SQL Server Management Studio takes a long time to come up especially in a closed network where there is actually no "outside" route. As I have posted previously, this is due the fact that SQL Server Management Studio performs Certificate Revocation List (CRL) lookup. We usually add

127.0.0.1 crl.microsoft.com

in our local Hosts file so that CRL lookup will purposely fail in order to get the SSMS to come up quicker.


What Worked for Me:

Quick Test: Try to see in your service controller if "DNS Client Service" that is running. If you turn it off, the system starts to look up names in the local Hosts file.

Next you should look your Windows registry.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

In there you will find the value

UseDomainNameDevolution

If this is set to 1, your Hosts wont' work. Just reset this to zero (0)

For additional information on this, find here: http://technet.microsoft.com/en-us/library/cc766230(WS.10).aspx








Friday, June 04, 2010

Google App iPhone Calendadar Does Now Show All Shared Calendars

Symptom:

You are syncing to the Calendar on iPhone, and you want to see all of the shared calendars. You have accepted the invitations to new shared calendars and you do and can see them while you are using a desktop web browser.

Solution:

Go to the following page, with (yourdomain) replaced with your actual domain, for example, "example.com"

https://www.google.com/calendar/hosted/(yourdomain)/iphoneselect

Monday, May 31, 2010

You get [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified on 64-bit Windows

Symptom:

When you try to connect to an SQL Server on Windows 2008 64-bit server running 32-bit application you get the following error

[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

And you cannot also find the DSN in the list of ODBC DSNs

Cause:

You must configure the 32-bit ODBC driver. You have been configuring the 64-bit ODBC driver all along. This is not very clear to you (or me), and there is no explicit control panel items for both.

To start a 32-bit ODBC driver,

C:\Windows\SysWOW64\odbcad32.exe


HP ILO 100 KVM Invalid username/password Error

Symptom

You have an HP DL Series server such as DL150. You did purchase and installed the KVM license key, it did work for some time but now whenever you connect you get

"Invalid username/password. You have been disconnected"

Cause


Something has gone wild in the ILO Flash memory.


Fix

ssh as an admin into the ILO interface. For most cases you should use putty program which is free and downloadable.

Then type in the following commands:

show map1 license
(just to play it safe and copy and paste this into a suitable text file on your computer)
reset map1 license

Session will then hang.

Log back into the web utility and the KVM feature should now work.


Originally Appeared on: http://forums13.itrc.hp.com/service/forums/questionanswer.do?admit=109447627+1275318554605+28353475&threadId=1404325


Friday, May 28, 2010

IMAP Problem with iPhone or iPOD for Google App

Symptom:

You are hosting your domain with Google App and allowing people to get emails via IMAP.

You get a complaint from a user stating that:
  • They can read their email on the web
  • They cannot suddenly access their email on iPhones even though IMAP and POP are enabled in their profile.
  • May get "Cannot Connect Using SSL" message.
Possible Root Cause:
  • Google has disabled IMAP (and POP) access probably due to some security issues such as repeated IMAP access with incorrect password.
  • If this is the cause you won't be able to access your Google App email via IMAP or POP either, but most iPhone users don't realize this is happening since they may never use IMAP or POP clients on their home computers.
Fix:
  • Try doing "reset Captcha" and this should re-enable IMAP or POP thereby allow the access from iPhone or iPod Touch
To do this, use the following url by replacing with your own domain.

Wednesday, October 14, 2009

Communicating with Busy People

Symptom:

You email someone or leave a message and the person blows you off often.

Solution:

I have been on both sides of the fence, more recently on the busy person's side. As a software developer you do need to communicate with people, and often engineering types neglect the understanding of the aspect of psychology and emotions involved in human communications. Dealing with busy people, especially communicating with them effectively, requires some "soft" understanding skills of human behavior. So here I am sharing some of the things that I discovered that is working for me.

Here I am talking about truly busy people. If you ask most people in work situations, most people say they are busy but they are actually not that busy. In fact, most people who say that they are busy tend to be not busy and really busy people are too busy to mention that they are busy. Get it? It takes years of personal training to be truly busy, on demand from people and on a mission to improve whatever you are doing! It requires both focusing and time management skills. But I digress, I will write more about that later on.

Now consider this typical scenario:
  • You send out a email to someone, say your manager asking a question. You have written 70 to 100 lines explaining everything she needs to know in a great detail so that she does not have to ask for more information.
  • You feel that you have done everything right and wrote a courteous and detailed message. You also feel that you have chosen email as a courtesy as you know the person is really busy.
  • You get no response, not even an acknowledgement. Now you feel that she is a jerk.
Sounds familiar, right?

Now consider you are at the other end of the fence receiving this lengthy email message just a time you are ready to go to another 2-hour customer meeting.

From the recipient side the following thing comes to mind:
  • "Gosh, another lengthy email from a colleague. I need to read it and understand what I need to do."
  • First reaction, "Oh shit, another work to do on my list of things to do."
  • But then she feels; "I know he is a hard worker and he means well, I don't want hurt his feeling."
  • So, she decides: "I will respond to him when the meeting is over." (fat chance!)
And as she get out of that meeting, and try to hit a restroom on the way to another meeting, 2-3 people stop her on the way and asks. "I need to see you..." "Where is...." By the time she ends the second meeting, another 5 email messages are also waiting in her in-box some of them are from a potential customer that she needs to give the top priority to. By the end of the day, she has totally forgotten about your email she got in the morning. It has scrolled off the visible part of her Outlook or Gmail window. (Side Note: I used to have a co-worker who would ambush me at the bathroom exit. Her cube was on the way from my cube to the bathroom. As I went she senses, wait for 3 minutes and then stands by the door to get a hold of me. This worked for her, she got a lot of my attention, and she had a courtesy for not catching me on the other direction, that would made me mad!)

Now you know the both sides of the equation. There is a few things to note.
  • You have actually succeeded in reaching out to her by sending an email just before she went into a long meeting. Actually this timing plays a role in an effective communication.
  • You did not know but you also acted like a jerk for sending a lengthy message, leaving her to interpret the email.
  • You did not know what she thought about you when she opened the email. She actually did appreciate the work you put in, but then she felt like "how can I make this person more independent."
  • You did not even know that she did not want to hurt your feelings. (This is actually very important psychology that you need to swallow.)
  • You have made a request to her and that you have added extra work for her to do, one of them is to interpret this lengthy email.
  • She is probably more motivated to this customer meeting than your email.
  • She knows you so she is implicitly permitted to blow you off but not the customer. Not correct way of thinking but that's how it works.
Finally Some Tips:

Now that I have laid out the background, giving the tips is actually quite easy.
  • Write shorter messages and more often (but not too often). These days "chat" style of emailing is quite acceptable. My emails messages are usually not longer than 140 characters in length and for more info, I create a shared document and put a URL to it. I find it a bit of challenge in cramming in all the info in that space.
  • Earlier part of the message, especially the Subject line of email is the most important part of the message.
  • Do not compose a message that give a lot of work or interpretation on the recipient's part. As much as possible write a message saying exactly one thing she needs to do.
  • Yes, one thing at at time! Never ever put more than one request in a message. Send a separate message at the right timing for the second stuff.
  • If the action will benefit ultimately in her reputation or pay include that info too. It is mostly all about the motivation that drive people to do things.
  • To this effect, I often use "Call For Action" keywords in the Subject line. In fact many of my email messages are complete message crammed in the subject line like: "Sarah: Sign the Check for ACME today." "Mike: Let's do Lunch Today at 12:00?" This way the recipient knows email is TO them and know exactly what to do. The message is right in front of email list and no need to open it, and action is right in the subject too. The message stands out clearly and talking to the person what needs to be done. To study Call For Action style communications, I recommend you read Google AdWords advise. Yes, basically you want a one click action and response from your recipient out of 100s of competing emails in her box!
  • If it involves emotional discussions or expressions (for example, you are angry or concerned), do not write email. Call and leave a voicemail message. Voice can convey your emotions.
  • Know that most other people may not manage their email box or voicemail box as well as you do. Emails are lost, buried or simply not looked at.
Some Tips on Motivation

I used to get mad when my boss sent me a request and I responded I got an instant response from the boss but he blew off most of my messages I sent earlier, and that comes down to the part of understanding the motivation.

When someone send you a message, the person is motivated, and motivated about the subject matter at the time.

This is actually a big opportunity to get a time slot from the person who send you the message. But remember that you are dealing with a busy person so the person's motivation changes very quickly and moves on to something else in a few minutes.

One strategy that works is this. When you get an email message, do not respond to that topic, but write another (short) message about what you want the other person to do (most). What this does is that the recipient in now in a motivated state to communicate with you and you can ride on that bandwidth. Don't do that too much but it often works. You also get pretty much one chance to do this.

In Summary
  • Busy people are exactly that, they do not have time, so don't expect to get more time out of them.
  • Busy people think the best way to deal with some things are to just leave them undone and not responding since by a response this will cause more work and responsibility to them.
  • Emotions, Behaviors, and Motivations play a key role in the dynamics of human communications. This is where your the courtesy protocol that your parent taught you breaks down leaving you feeling like an neglected idiot. Of course you are not.
  • Always communicate in short and exactly down to the point method of messaging often including "call for action" style messages. Do not write any more than 2 paragraphs. If there is more information, attach it as a file or point to a URL to your own blog or file download page... whatever technology you got.
  • With emotional topics, use voicemail or better yet, talk directly to the person.
  • People have been doing their people thing for at least 20, 30 or 40 years. Fat chance their behavior changes over-night. The best way to get through to people is to understand individual's motivation to me.
  • Sometimes it does simply not work. In that case consider abandoning, move to another department, another customer, or another job.
  • Finally, swallow the fact that neglecting is not personal, but people are simply just stretched to the max and do not have time. It is even be thought of as a friendly gesture not to hurt your feelings and an indication of trust that you won't get mad (or at least you won't express it immediately.)