Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

Posted in Uncategorized | 1 Comment

Bathroom etiquette

Most of my travel time is spent in a terminal, waiting for my plane, making a connection or departing a plane.  It is here that we observe the oddest of behaviors when it comes to the species of homosapien-travelerous.  This first letter is to someone who exhibits the nastiest of all deeds; the non-bathroom-hand-wash.

Dear pee-pee hand guy,

I wanted to drop you note to let you know that the act of going to the urinal, reliving yourself, shaking your pecker and returning your apparatus into your pants has consequences.  If you walk out of the bathroom wiping your hands on your pants, then you have pee-pee on your hands.  Pee-pee on you r hands means that you need to wash them because urine has germs and germs are bad.  If you extend your hand to shake mine, I am trusting that you have washed with soap and water or at least waved your hand under the sink to give off the illusion of good hygiene.

And another thing; if you go in the stall and dent the porcelain with your poop-shooter, and you happen to wipe, that too has consequences. Wash your hands you nasty person.  You just touched you butt and I do not want to touch your butt too.  I beg you; rinse the poop smell from your hand.

One time, my Texan friend tried to walk out of the bathroom without rinsing.  I tried to call him on it and he said, with a straight face mind you as if he were convinced that he was right; “My mother taught me not to piss on my hands”.   Rule of thumb-if you pee, you touch it, you shake it, you handle it.  You must wash.  I once had a theory that stated – “if I take a shower and put on underwear right out of the shower, I have a clean pecker.  If I take it out and touch it with my hands, which are exposed to the world, then I shouldn’t I be more concerned with washing my pecker in the sink, rather than my hands?”  I haven’t tested that theory yet and I hope that after reading this, I don’t run into you testing it either.

A waiter is serving two gentlemen at a table.   He serves them their meal and one of the men drops his spoon.  Before the spoon could hit the floor, the waiter places another spoon on the table.  Wow that was fast, the man said.  Our boss wants to make sure that we can service our customers as quickly as possible, so we keep a spare set of silverware  on hand just in case.  After dinner the man went to the restroom and encountered the same waiter.  The man found it odd that the waiter pulled on a string and was urinating without holding his equipment.  How do you do that sir, asked the man?  Our boss wants us to serve our customers quickly and by using a string tied to our penis, we can pee without touching it, that way we don’t have to wash our hands and waste more time in the restroom.  This place thinks of everything…wait, how do you put it back?   That’s what the spoon is for.

Unless you carry a string tied to your manhood and a spoon to put it back, you must wash!

One of my first meetings with an executive took place in downtown Chicago.  We were early so I took the extra time to freshen up in the restroom before our meeting.  I was there to present a demonstration of a solution we had built for another client, and I was a bit nervous since I was still kind of new at consulting.  When I walked into the bathroom, I quickly noticed that someone was occupying a stall.  I took a deep breath, bellied up to the urinal, emptied the bladder and washed my hands.  While rinsing, the beast that was eliminating waste in the stall opened the door and walked towards the sink.  He then proceeded to do what I then though was the dirtiest thing I had ever seen-he fixed his hair and walked out.  Yes, walked right out of the bathroom with a newly found bounce in his step as his hair was now in place.

I rinsed, walked back to the meeting room and tried to remove what just happened from my memory.  We began the meeting with introductions, “hello, my name is blah, blah” and just then, the business sponsor walks into the room.  He is the department head for the company and recognized his finely combed quaff.  It was Mr. pooh-pooh hand guy.  Remember when I mentioned that his walking out was the nastiest thing I had seen?  I was wrong.  This guy proceeded to reach his hand out and shake everyone’s hand, including mine.  I now had poop on my hands and I touched his butt.  Eewwwww!

Posted in iTravel - My book in progress | 1 Comment

Why did I write this book?

I am on a plane as I type this.  A few moments ago, the lady next to me (she is sleeping now so she can’t read this), reached over and stole my magazine.  She never asked me if I was going to read it, didn’t ask if she could borrow it, nothing.  I was flabbergasted at the gesture especially since the only reason she wanted the magazine was to read an article that her husband was reading because her blind-ass forgot her glasses and she couldn’t read over his shoulder.  When she was done, did she bother to put it back in my seat compartment, do you think she said thank you, or here you go, I’m sorry.  No.  She slipped it into her seat back pocket as if nothing happened.  She never acknowledged the fact that the magazine was mine for the 5 hour flight from Seattle to Miami, not hers.  I bet if I reached over and took my magazine back, she would look at me as if I were crazy.
 
It is people like her and others that I have encountered in my 5+ years of being on the road, which inspired me to write this book.  Someone needs to call attention to them if they don’t realize it themselves.  This is not to say that everyone I encounter in the road is bad.  There are people I have met that have touched me (the way complete strangers should be touched, get your mind out of the gutter) told me stories, entertained me, bored me but overall made the journey enjoyable.
 
I have collaborated with several other road warrior friends and collected many stories of bad travel days, rude people, good people, great conversations and just overall funny stories that took place while traveling for business.  We spend a lot of time on planes, in terminals, on shuttles and in taxis and we meet many characters on the road from all walks of life.  I hope you find these stories as funny as I find them but I also hope that you are not one of the personalities we write letters to.  However, if you find yourself on the receiving end of one of our dear “wacko” letters, do not be offended.  Understand that as hard as it is to believe, you are not alone when you travel.  Something like, oh I don’t know, millions of people travel every day!  Be aware that you are being watched and we care about you.  So please put my fuckin’ magazine back.
Posted in iTravel - My book in progress | Leave a comment

Introduction and Thank You’s’

Business travel is a necessary evil that gladly, only a handful of us have to endure.  Being on the road takes its toll on our bodies, our mind, and especially our families.  While traveling, we encounter so many differnt people with personalities that could be studied for years without ever being figured out.  We leave out homes and somewhere between the front door that cheeked-in line, we forget that there are other people traveling with us.  We morph into another species of animal in cases where we should really have some manners and some common courteously.  We are happy in the mall, the grocery store, and the pool but while traveling, we become, well different.
 
This book is about the strangeness that is business travel.  It is about the types of people that exist in the wacky world of travel and how we interact with each other.  I hope that you read it and laugh as loud as I did when I wrote it.  I also hope that you have experienced some the same things I have and wondered about them like I do.  If you don’t, please amuse me.  I know that I am alone in my little world of rants and complaints.  If you are one the people I write a letter to, use this a way to become more self-aware regarding the pains you cause us. I would like to thank my wife for listening to me when I encounter a wacko on the road and stress-out over people walking in front of my car or being lost in a strange city, or when I lose my car in the airport for the 100th time.  Thank you for dropping off and picking up my dry cleaning, being home with a smile when I arrive tired from a red-eye and waking up to hug me when I leave for the airport again at 4am.  You are the wife that other wives look up to.  You rock and you should wear your super-wife outfit proud (no capes though, they are out of style).
 
I would also like to thank all of the great friends I have made throughout the years in the several cities across the US.  Without you my world is only in my head and I would have no one to share it with.  You make travel bearable and fun.  Thank you all for picking up the phone when I call and tell you that I am in your city.  Thank you for taking the time to spend a few hours with me.  That seemingly small effort means more to me than you will ever know.
Posted in iTravel - My book in progress | Leave a comment

iTravel – The endless search for an working outlet

I’ve spent alot of time on planes over the last 5 years traveling for business and during that time, I have accumulated a fair share of miles, books, magazines, pounds, and best of all, stories.  I was going to put these stories together into a book and get it published but  I just don’t have the time to consolidate them all.  But instead of keeping all of my stories to my self, i decided to share them here.  Enjoy!
Posted in iTravel - My book in progress | Leave a comment

Building navigation controls with .NET and Microsoft Content Management Server – Part 2

To complete my navigation controls toolbox, I needed two other types of controls; global navigation and footer.  When building the other types of navigation controls – side navigation and breadcrumbs – the content was accessible and could be iterated easily by using a foreach loop because of their location in the same channel.  For global and footer navigation, sometimes this is not the case.  Some other approaches I have used to solve this problem in the past include:

  • Creating a channel called _footer and _global that is excluded from the regular navigation in published mode.  The problem with this approach is that the results show up in the URL if the user selects an item in this channel.
  • Ensure that the information architecture accounts for the footer content in the root and can be easily pulled using a custom property (something like “DisplayInFooter = True” or “DisplayInGlobalNav=True”).  Problems include too many items in the navigation, or content contributors selecting the wrong items to be displayed.  This also presents problems when you are using multiple channels and/or large content stores since a custom property search is across the entire repository and cannot be scoped initially.
  • Create an admin posting that contains a list of links and text to display.  This approach creates a training issue since the content contributors need to know the structure of the site.  The template also has to be modified in order to add a new link item.

You may have used some of these approaches or even some not mentioned here.  The fundamental truth of this type of navigation is that it doesn’t change often and content contributors should not be allowed to alter the structure of the site.  If business users need that much flexibility, then maybe one the aforementioned approaches’ is feasible for your site.  If not, then the technique detailed in this post may be useful.

Defining the layers

To keep with the typical 3-tier application design; the layers for this type of navigation are represented by:

  • Data layer– A list of channels or postings to display in the navigation
  • Business layer – My navigation item
  • Presentation layer – HTML and an ASP.NET DataList

The data layer

In .NET, there is a class in the System.Configuration namespace called the NameValueFileSectionHandler.  This class exposes some generic methods that allow us to access configuration data stored in web.config as a namevalue collection.  A sample of the syntax is displayed below.

 

<configuration>

   <configSections>

    <!–     Application settings    –>

    <section name="Your section name here" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089"/>

</configSections>

More settings …

</configuration>

 

I will use this to store my three different navigation specifications; global, secondary and footer.  The definition of my configuration data is listed in the Config section of web.

 

<configuration>

   <configSections>

    <!–     Application settings    –>

    <section name="GlobalNavigation" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089"/>

    <section name="SecondaryNavigation" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089"/>

    <section name="FooterNavigation" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089"/>

                …Other settings

</configuration>

 

Now that I have specified the configuration sections, I can add my items that I need to display.  I use the syntax:

 

<[Section Name specified above]>

    <add key="[Unique key for this item]" value="[The value to store.  In my case the path to the item"/>

                More keys and values…

</[Section Name specified above]>

 

I will add data for the three sections declared:

 

 <GlobalNavigation>

    <add key="Login" value="/channels/_auth/login"/>

     <add key="Register" value="/channels/_forms/register/"/>

</GlobalNavigation>

 

<SecondLevelNavigation>

    <add key="Shop" value="/channels/cmsdemo/shop"/>

    <add key="BrowseCategories" value="/channels/cmsdemo/categorylist/"/>

    <add key="Subscibe " value="/channels/cmsdemos/subscribe/"/>

</SecondLevelNavigation>

 

<FooterNavigation>

    <add key="AboutUs" value="/channels/cmsdemo/about/"/>

    <add key="PrivacyPolicy" value="/channels/cmsdemo/policies/findclass/"/>

    <add key="SiteMap" value="/channels/cmsdemo/sitemap"/>

</FooterNavigation>

 

I have defined the sections and the data to display, now let’s build the business layer.

The Business Layer

 In the post Building CMS Navigation Controls-Part 1 I built a class called NavigationItem.  This class contained the basic properties I needed in order to construct hyperlinks.  I will modify the class to add an overloaded constructor to allow us to quickly set all of the necessary properties in one call.

 

public NavigationItem (string displayName, string url, string description)

{

                _displayName = displayName;
                _url = url;
                _description = description;

}

 

I define a strongly typed collection of navigation items to store my items for display.  This allows me to “data bind” and display the data quickly.  Note:  This requirement will go away with .NET 2.0 through the use of generics, but until then, I have to create my own custom collection by inheriting from System.Collections.CollectionsBase.

 

public class NavigationItemCollection : System.Collections.CollectionBase

{

                // Restricts items that can be added to the collection to Channel types

                public void Add(NavigationItem n)

                {

                                List.Add(n);

                }

                public void Remove(int index)

                {

                                // Makes sure there is an object at the supplied index before trying to remove it.

                                if (index < Count && index > 0)

                                {

                                                List.RemoveAt(index);

                                }

                }

                public NavigationItem Item(int Index)

                {

                                // The appropriate item is retrieved from the List object and

                                // explicitly cast to the specified type, then returned to the

                                // caller.

                                return (NavigationItem) List[Index];

                }

}

 

The presentation layer

All of the heavy lifting is complete and now all that is left to do is display my data.  I will use a DataList with the repeat direction set to “Horizontal” as the presentation container and use item templates to specify each hyperlink.

 

<asp:DataList id="globalNavDisplay" runat="server" RepeatDirection="Horizontal" RepeatLayout="table" >

                <ItemTemplate>

                <a href='<%# DataBinder.Eval(Container.DataItem, "Url") %> ‘ title='<%# DataBinder.Eval(Container.DataItem, "Description") %>’><%# DataBinder.Eval(Container.DataItem, "DisplayName") %></a>

                </ItemTemplate>

                <SeparatorTemplate>

                &nbsp; &nbsp;| &nbsp; &nbsp;

                </SeparatorTemplate>

</asp:DataList>

 

To avoid adding duplicate code to each of the code-behind files for each navigation type, let’s declare a generic helper method that will allow us to access the data stored in the configuration.

 

using System;

using System.Configuration;

using System.Collections.Specialized;

using Microsoft.ContentManagement.Publishing;

 

Namespace and constructor delcaration for the NavigationHelper class…

 

public static NavigationItems GetNavItemsFromConfig(string ConfigSection)

{

                //Get the channels that belong in the footer and bind to DataList

                NameValueCollection thisConfig = System.Configuration.ConfigurationSettings.GetConfig(ConfigSection) as NameValueCollection;

                NavigationItemCollection  navColl = new NavigationItemCollection();

                Searches cmsSearch  = CmsHttpContext.Current.Searches;

 

                foreach (String s in curSettings)

                {

                                //Create a new nav item and fill in the details

                                if (n!= null)

                                {             

                                                HierarchyItem cmsHItem = cmsSearch.GetByPath(curSettings[s].ToString());

                                                if (cmsHItem != null)

                                                {

                                                                //Cast the heiarchy item to a channel item to access the correct properties

ChannelItem cmsCItem = cmsHItem as ChannelItem;

                                                                //Create the navigation item

                                                                NavigationItem n = new NavigationItem(cmsCItem.DisplayName; cmsCItem.Url; cmsCItem.Description

                                                                navColl.Add(cmsCItem);

                                                }

                                }

                }

                return nc;

}

 

With the helper function declared, I can set the DataSource property of the DataList and bind to the data for display.

 

globaNavl.DataSource = NavigationHelper.GetNavItemsFromConfig(“section name”);

globalNav.DataBind();

 

Repeat the code the above code for the global and the secondary navigation controls, replacing the GetNavItemsFromConfig(“section name”) with the correct section name then add the controls to each of the MCMS templates.  For performance, you can also add ASP.NET caching to each of these controls.

Conclusion

By adding this new technique to my MCMS development tool box, I can quickly build MCMS managed sites that have a lot of flexibility and are less fragile to change, especially in the UI.  By separating the presentation from the code-behind, I can quickly skin my site with minimal to no impact to the code base.

 

Posted in Content Management Server | Leave a comment

CMS2k2 – Default styles that should be implemented for authors

Here are the OOB styles and the matching HTML tags that should be implemented on every CMS engagment.  They are used by CMS to allow content contributors to format text when adding content.  They are also used to format the display of the content when it is copied from another source such as Word.  You should override all of these styles by specifying the presentation in the style sheet to ensure site consistency.

CMS authoring style CSS Style
Normal = BODY {}
Paragraph = P{}
formatted = PRE{}
address = ADDRESS{}
h1 = H1{}
h2 = H2{}
h3 = H3{}
h4 = H4{}
h5 = H5{}
h6 = H6{}
Numbered list = OL{}
1. numbered list item = LI{}
Bulleted list = UL{}
Bullet list item = \*Same as LI*Directory List = DIR{}
Directory List Item = \*Same as LI*Definition term = DT{}
definition = DL{}
Menu = MENU{}
Bold = STRONG{}
Italic = I{}
Underline = U{}
Hyperlink = A:link{}
= A:active{}
= A:visited{}
= A: Hover{}

Posted in Content Management Server | Leave a comment