
<rss version="2.0">
	<channel>
		<title>KeyLimeTie RSS Feed</title>
		<link>http://keylimetie.com</link>
		<description>KeyLimeTie RSS Feed</description>
		<language>en-us     </language>
		<image id="_image">
			<title>KeyLimeTie</title>    
			<link>http://www.keylimetie.com/Blog/</link>
			<url>http://www.keylimetie.com/Common/Images/custom/KLT-Logo.gif</url>
			<width>220</width>
			<height>80</height>
		</image>
		
				<item>
					<title>Help Nate Raise Funds for his 10th Birthday to Benefit St. Baldrick’s Foundation</title> 
					<link>http://keylimetie.com/blog/2013/2/26/help-nate-raise-funds-for-his-10th-birthday-to-benefit-st-baldricks-foundation/</link> 
					<description><![CDATA[<p>
    <img alt="" src="/Common/Images/custom/blog/nate-and-mikayla-st-baldricks.jpg" style="width: 333px; height: 266px;
        float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" />Nate Pautsch, son of KeyLimeTie Co-Founder & CEO Chris Pautsch,  has participated in the <a href="http://www.stbaldricks.org/participants/mypage/580458/2013" target="new">St. Baldrick's Foundation</a> Shave-a-thon for the last four years in honor of his friend Mikayla Sweeney. Nate met Mikayla, who was diagnosed with kidney cancer at the age of 5, at school, and the pair became fast friends. Since then, Nate continues to shave his head to raise money for St. Baldrick’s Foundation, which raises funds for life-saving childhood cancer research.
</p>
<p>
<strong>Mikayla says that “because of organizations like St. Baldrick’s, I have been in remission for four years.”</strong>
</p>
<p>
    Nate is once again raising money for all the children suffering from cancer. Nate will shave his head on March 8 in recognition of Mikayla and in culmination of raising funds for St. Baldrick’s.
</p>
<p>
    <strong>Today, February 26, is Nate’s birthday. And all Nate wants for his birthday is to raise funds for childhood cancer research on behalf of Mikayla and for St. Baldrick’s Foundation.</strong>
</p>
<p>
<strong>Will you make a $10 donation on behalf of Nate’s 10th Birthday for Mikayla and St. Baldrick’s Foundation? Your $10 donation could help a child suffering with cancer enter remission from life-saving research and celebrate their 10th birthday: <a href="http://www.stbaldricks.org/participants/mypage/580458/2013">View Nate's Donation Page</a></strong>
</p>
<p>
Nate is not asking you to shave your head. He will take one for the team. All he wants is for you to donate the cost of two grande vanilla lattes to help fund life-saving childhood cancer research.</p>
<p>
Nate’s parents, Chris and Tricia, could not be more proud of their son, Nate, and what he has done for his friend Mikayla and St. Baldrick’s Foundation. On May 10, 2013, Nate will receive the <a href="http://www.afpchicago.org/awards-luncheon" target="new">Outstanding Youth in Philanthropy Award from the Association of Fundraising Professionals </a>(Chicago Chapter). This is a huge honor! Nate will receive his award alongside Kerry and Sarah Wood, BMO Harris Bank, and other leading Chicago philanthropists.
</p>
<p>
The staff of KeyLimeTie would like to congratulate Nate on his award and we hope you can support this fabulous cause. Congrats, Nate!</p>
]]></description> 
					<pubDate>Tue, 26 Feb 2013 20:17:49 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2013/2/26/help-nate-raise-funds-for-his-10th-birthday-to-benefit-st-baldricks-foundation/</guid>
				</item>
			
				<item>
					<title>Mobile Voting for the 2012 Chicago Innovation Awards Powered by KeyLimeTie</title> 
					<link>http://keylimetie.com/blog/2012/9/9/mobile-voting-for-the-2012-chicago-innovation-awards-powered-by-keylimetie/</link> 
					<description><![CDATA[<p>In the spirit of its namesake, the <strong>Chicago Innovation Awards</strong> has partnered with interactive design agency <strong>KeyLimeTie</strong>, to introduce a free iPhone app to facilitate mobile voting for this years <strong>The People’s Choice Award</strong> – an award category designed to allow the public to cast their votes for their favorite innovation of the year. </p>

<img alt="Chicago Innovation Awards iPhone App by KeyLimeTie" src="/Common/Images/custom/blog/Chicago-Innovation-Awards-iPhone-App.png" style="width: 560px; height: 360px; float: none; margin:0px" />

<p>“We’re excited to be able to open up the voting to more people with this state-of-the-art mobile app developed by KeyLimeTie,” said Luke Tanen, Executive Director of the Chicago Innovation Awards, “It’s wonderful to have something so innovative be used to vote on things that are also so innovative.”</p>

<p>For the 11th consecutive year, the Chicago Innovation Awards will celebrate the creative spirit of the Chicago region by honoring its most innovative new products and services. Past winning organizations ranged in size from small to large, were both for-profit and not-for-profit, and came from high tech, low tech or no tech.  All previous winners shared a common commitment to innovation.</p>

<p>“The Chicago Innovation Awards app was designed with the intent to provide the nominees with access and exposure to a much larger voting audience than others have had in the past,” said Chris Pautsch, Co-Founder and CEO of KeyLimeTie, “We were delighted and honored to share in the announcement of its availability during last weeks Nominee Reception at the House of Blues, and excited for those who will use it to submit their vote for this year’s Peoples Choice Award.”</p>

<p>Voting for the 2012 People’s Choice Awards is open through October 5, 2012.  The 2012 Chicago Innovation Awards presentation will take place on October 22, 2012 at the Harris Theater in Chicago. <a href="http://www.chicagoinnovationawards.com/events/2012-chicago-innovation-awards/">Tickets</a> are on sale now for the event. </p> 

<p>To view this years list of nominees and cast a vote for your favorite innovation, download the 2012 Chicago Innovation Award iPhone app from <a href="http://itunes.apple.com/us/app/chicago-innovation-awards/id554300200?mt=8">iTunes App Store</a>.</p>
]]></description> 
					<pubDate>Sun, 09 Sep 2012 18:56:11 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2012/9/9/mobile-voting-for-the-2012-chicago-innovation-awards-powered-by-keylimetie/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Named by Inc. Magazine as One of America&amp;quot;s Fastest Growing Companies </title> 
					<link>http://keylimetie.com/blog/2012/8/29/keylimetie-named-by-inc-magazine-as-one-of-americas-fastest-growing-companies/</link> 
					<description><![CDATA[<p>
    <img alt="" src="/Common/Images/custom/blog/Inc-5000.jpg" style="width: 200px; height: 115px;
        float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" />Inc.
    Magazine recently named KeyLimeTie to its 2012 Inc. 5000 List, an exclusive ranking
    of the nation's fastest-growing private companies in the US. Ranked at No. 2171,
    KeyLimeTie joins 240 other Chicago area-based companies, including customers Authentify,
    PLS Financial Services, Parts Town and Meatheads, among other<a name="_GoBack"></a>
    prominent brands featured on this year’s list.
</p>
<p>
    “Being recognized by Inc. Magazine is a significant accomplishment and designation
    that we aspired to achieve when we started KeyLimeTie 5 years ago” said Chris Pautsch,
    Co-Founder and CEO of KeyLimeTie. “We are proud to be included with the other companies
    on the list who have achieved similar, accelerated growth over the past few years.”
</p>
<p>
    For the 3-year period, KeyLimeTie achieved a 119 percent revenue growth rate putting
    it ahead of the median growth rate of 2012 Inc. 5000 companies of 97 percent.
</p>
<p>
    “Our company’s growth is directly attributable to our talented staff and our outstanding
    clients who continue to trust in our insight and expertise to elevate their brands
    and reputations through technology and innovation,” said Brian Pautsch, Co-Founder
    and President of KeyLimeTie. “Being ranked amongst the Inc. 5000 is an incredible
    honor for us and a great acknowledgement of our hard work.”</p>
<p>
    Complete results of the Inc. 5000 List, including company profiles and an interactive
    database that can be sorted by industry, region and other criteria, can be found
    at <a href="http://www.inc.com/5000">www.inc.com/5000</a>.</p>
<p>
    Read the press release here: <a href="http://www.prweb.com/releases/2012/8/prweb9850221.htm ">
        www.prweb.com/releases/2012/8/prweb9850221.htm</a>.</p>
]]></description> 
					<pubDate>Wed, 29 Aug 2012 19:47:40 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2012/8/29/keylimetie-named-by-inc-magazine-as-one-of-americas-fastest-growing-companies/</guid>
				</item>
			
				<item>
					<title>One of Chicago&amp;quot;s Premier Workplaces for the 3rd Year in a Row</title> 
					<link>http://keylimetie.com/blog/2012/8/15/one-of-chicagos-premier-workplaces-for-the-3rd-year-in-a-row/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 150px;">
<img src="/Common/Images/Custom/blog/blog-best-brightest-2012.png" alt="101 Best & Brightest Companies to Work For" />
</div>
<p>For the third consecutive year KeyLimeTie has been named one of Chicago's 101 Best and Brightest Companies to Work For™ by the National Association for Business Resources (NABR). The award recognizes Chicago-area businesses that display a commitment to excellence in their human resources practices and employee enrichment.</p>
<p>“We are delighted and honored to be included in this list of Chicago’s premier workplaces,” said Chris Pautsch, Co-Founder and CEO of KeyLimeTie. “Being recognized as a best place to work is significant because it’s decided by our employees, and they are the people who make the difference in our business every single day.”</p>
<p>The Best and Brightest Companies to Work For competition is a program of the National Association for Business Resources and is presented annually throughout the United States. Organizations are assessed based on categories such as communication, work-life balance, employee education, diversity, recognition, retention and more.</p>
<p>"The selection, recognition and awarding of Chicago's 101 Best and Brightest Companies to Work For™ allows businesses to showcase their best practices and demonstrate why each of them would be an ideal place for employees to work. This year's winning companies represent high standards and are an example for other companies to emulate," said Jennifer Kluge, NABR President. "We are proud to honor this year's 101 winners."</p>
<p>“As a growing company, we continually seek to attract and hire the best candidates in our industry,” said Christen Blaze, Director of Human Resources at KeyLimeTie. “This recognition from NABR provides a sense of validation and reassurance to both our current employees and those looking to join KeyLimeTie, that this is a place they want to work.”</p>
<p>Read the Press Release here:<a href="http://www.prweb.com/releases/2012/8/prweb9801892.htm">http://www.prweb.com/releases/2012/8/prweb9801892.htm</a></p>
]]></description> 
					<pubDate>Wed, 15 Aug 2012 19:55:39 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2012/8/15/one-of-chicagos-premier-workplaces-for-the-3rd-year-in-a-row/</guid>
				</item>
			
				<item>
					<title>MojoBistro launches on KeyLimeTie&amp;quot;s 5th Year Anniversary</title> 
					<link>http://keylimetie.com/blog/2012/5/4/mojobistro-launches-on-keylimeties-5th-year-anniversary/</link> 
					<description><![CDATA[<p>Today, on our 5th anniversary at KeyLimeTie, we’re excited to announce another excellent product. MojoBistro, built especially for restaurants, lets individuals and<img alt="" src="http://keylimetie.com/Common/Images/custom//Blog-MojoBistro.png" style="float: right; margin-left: 10px; " /> organizations create and maintain their own customer-centric mobile apps and websites.</p>
<p>
Have you considered an iPhone, Android, or Windows app or mobile website for your restaurant? Today, in May 2012, there’s more reason than ever to join the mobile revolution.<br />
<br />
Specifically designed with restaurants in mind, our unique set of features showcases the menu, increases reservations, offers an ordering solutions, connects users with your location wherever they are, and interacts with your and their already existing social networks such as Yelp, Facebook, Twitter and Foursquare.<br />
<br />
Launching on May 5-8, 2012 at the National Restaurant Association, KeyLimeTie is proud to announce this industry-changing product that’s already garnering national attention even before its launch.</p>
<p>Attending the NRA Show 2012? Visit us at Booth #7173 in the North Hall.</p>
<p>Throughout the coming months, we’ll highlight upgrades to MojoBistro and other happy news that you will definitely want to pay attention to. Of course, you can expect that at KeyLimeTie, we’re making waves in designing, developing and delivering high-quality interactive solutions.</p>
<img alt="" src="/Common/Images/custom/MojoBistro_Logo.png" style="width: 200px; margin-left: 10px; margin-top: 10px; float: right; " />
<p></p>
<p>
MojoBistro isn’t successful until you are, so we’ve produced a series marketing tools to make restaurants’ app a success--online and off. Also follow our social media channels to get constant recommendations for marketing your apps. ‘Like’ us on <a name="MojoBistro Facebook">Facebook</a> and follow us on Twitter <a name="MojoBistro Twitter">@MojoBistro</a> for our latest tools, features and new developments.</p>
]]></description> 
					<pubDate>Fri, 04 May 2012 19:27:45 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2012/5/4/mojobistro-launches-on-keylimeties-5th-year-anniversary/</guid>
				</item>
			
				<item>
					<title>Native v. Web Applications: Why Both Help Connect Your Company With Consumers</title> 
					<link>http://keylimetie.com/blog/2012/3/22/native-v-web-applications-why-both-help-connect-your-company-with-consumers/</link> 
					<description><![CDATA[<div>Is your company considering creating a web or mobile application? Whether you’re in the beginning or end stage of the mobile development process, with the proper outreach, you’re poised to connect with mobile and smartphone users across the US and internationally. More and more, customers are looking for solutions to daily challenges that your business may be able to fulfill.</div>
<br class="Apple-interchange-newline" />
<a href="http://techcrunch.com/2012/03/06/comscore-more-than-100m-u-s-mobile-subscribers-now-use-smartphones-android-and-ios-market-share-up/"><img alt="" src="http://keylimetie.com/Common/Images/custom//comscore.jpg" style="width: 365px; height: 332px; float: right; " /></a>
<div><br />
</div>
<div>In this article, we’re going to untangle the debate on native v. web applications and consider how mobile advertising could affect your business. Also, we provide insight into why these two mobile options are essential in connecting with your mobile consumers using recent analyses. </div>
<div><br />
</div>
<div>What’s the difference?</div>
<div><br />
</div>
<div><a href="http://nomadmobileguides.com/making-an-app/frequently-asked-questions/difference-between-mobile-websites-and-native-apps/ " target="_blank" class="ApplyClass">There are several major differences between native and web applications.</a> The most significant difference is that web applications are like mobile websites, whereas native applications have to be downloaded on the phone.  Downloadable native applications often have a more rich user experience, may be slightly quicker, doesn’t always require cellular coverage, and may offer more multimedia content. </div>
<div><br />
</div>
<div>Who’s mobile? </div>
<div><br />
</div>
<div>Smartphone penetration now represents between 30-50% of mobile users depending on country (currently around 35% in the USA). There are <a href="http://ansonalex.com/infographics/smartphone-usage-statistics-2012-infographic/ " target="_blank">100MM smartphone users</a> in the United States alone, with around 1.1 billion of the 5 billion mobile phones being smartphones. Of those users, 9 of 10 use their phone on a daily basis. </div>
<div><br />
</div>
<div>According to <a href="http://techcrunch.com/2012/03/06/comscore-more-than-100m-u-s-mobile-subscribers-now-use-smartphones-android-and-ios-market-share-up/ " target="_blank">TechCrunch</a>, “as mobile phone useage increases and smartphone adoption grows, more and more consumers are using their mobile for functions other than phone calls.” This shows, as application downloads continues to increase, now at around 49% of subscribers downloading applications, and 48.5 using browsers. That’s a lot of opportunity to connect with your target audience where they’re interested in learning more about your product or service! </div>
<div><br class="Apple-interchange-newline" />
<a href="http://adage.com/article/digital/mobile-ad-spending-projected-reach-2-61b-2012/232334/"><img alt="" src="http://keylimetie.com/Common/Images/custom//0125-us-mobile-ad-spending.jpg" style="width: 350px; height: 250px; float: left; " /></a>
</div>
<div>Are other companies investing in mobile?</div>
<div><br />
</div>
<div>Increasingly, companies across the spectrum are starting to consider mobile as part of their marketing strategy. Mobile ad spending has increased significantly since 2007, and is projected to continue to nearly double year on year. In 2012, mobile-ad spend (including banner, rich media and video) is projected to grow 80% to $2.61 billion. This is because as <a href="http://adage.com/article/digital/mobile-ad-spending-projected-reach-2-61b-2012/232334/" target="_blank">eMarketer </a>notes, “as mobile devices become a remote control for our lives… the more they’re being used for search, to browse the web and use applications and the more that drives up impressions and overall activity.” </div>
<div><br />
</div>
<div>For CIOs, mobile technology and consumerization are an important focus. In a 2012 study by Atenna, 43% of companies are currently working on a mobile app for their customers, 42% for their employees and 32% are currently working on hybrid web-apps for their customers (28% for their employees).  However, in <a href="http://www.cbronline.com/news/business-to-double-mobile-technology-spends-in-2012-21-2-12" target="_blank">that same study</a>, research showed only 45% of businesses have mobile compatible websites for their customers. </div>
<div><br />
</div>
<div>What’s the debate about? </div>
<div><br />
</div>
<div>In <a href="http://www.globalintelligence.com/insights-analysis/white-papers/native-or-web-application-how-best-to-deliver-cont/GIA%20Industry%20White%20Paper%202_2010_Native%20or%20Web%20App_How%20Best%20to%20Deliver%20Content%20and%20Services%20to%20Your%20Audiences%20over%20the%20Mobile%20Phone_Apr-10.pdf" target="_blank">another 2012 report </a>on Native v. Web Applications by Global Intelligence, which found that each had their own advantages. Overall, however, as the Nielsen report also shows, publishers see higher user adoption and usage volume on native applications versus web applications. Web apps are more likely to be developed in-house, and take longer to create. </div>
<div><br />
</div>
<div>On the other hand, <a href="http://www.readwriteweb.com/archives/web_vs_native_mobile_app_forrester_says_do_both.php" target="_blank">Forrester in 2011</a> notes that mobile applications—native or web—are not going anywhere. “As mobile useage increases worldwide, both side of the equation will grow with it and become valuable aspects of product roadmaps,” according to ReadWriteWeb. </div>
<div><br />
</div>
<div>Conclusion </div>
<div><br />
</div>
<div>Whether your company is considering a mobile or native application, you’re taking the first step in the important transition to creating mobile opportunities. </div>
<div><br />
</div>
<div>Contact us!</div>
<div><br />
</div>
<div>As a leader in mobile and web application development, we’d be simply tickled to answer any of your questions on developing your own custom application. We want to get to know your needs! To get in touch with us directly, contact our CEO & co-Founder Chris Pautsch at <a href="mailto:sales@keylimetie.com" class="ApplyClass">sales@keylimetie.com</a>.</div>
<div><br />
</div>
<div>Author: Erica Grigg is Director of Marketing at KeyLimeTie. With nearly a decade experience using traditional and digital tools for marketing, Erica is constantly exploring the mobile and social landscape for KeyLimeTie. Prior, Erica came from an agency background where she was Partner and Director of Marketing & Digital for clients like the UN and WWF. Erica has presented extensively on digital marketing, and co-authored a book on Facebook marketing. </div>
<div><br />
</div>
<div>Follow Erica on Twitter <a href="http://twitter.com/ericagrigg" target="_blank">@ericagrigg</a> or on <a href="http://linkedIn.com/in/ericagrigg" target="_blank">LinkedIn</a>. Erica also tweets for <a href="http://twitter.com/keylimetie" target="_blank">@keylimetie</a> and posts regularly on the KeyLimeTie Facebook Page.</div>
]]></description> 
					<pubDate>Thu, 22 Mar 2012 20:40:10 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2012/3/22/native-v-web-applications-why-both-help-connect-your-company-with-consumers/</guid>
				</item>
			
				<item>
					<title>Lucas Oil - On the Edge application for the iPhone</title> 
					<link>http://keylimetie.com/blog/2012/1/27/lucas-oil-on-the-edge-application-for-the-iphone/</link> 
					<description><![CDATA[<div>Can’t get enough extreme sports?  Always looking to go faster?  <img alt="" src="/Common/Images/custom//OntheEdge.png" style="width: 150px; height: 293px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px; " /> Well now you can have the rush in the palm of your hand.   Keylime Tie is proud to announce, in partnership with <a href="http://www.lucasoil.com/" target="_blank" class="ApplyClass">Lucas Oil</a>, the release of On the Edge for the iPhone platform. </div>
<div><br />
</div>
<div>On the Edge is an edgy, exciting show that exposes SPEED viewers to a plethora of motorsports that do not usually have a chance to air on national television. The show features stock car racing, figure 8 racing, rock crawling, snowmobile racing on grass, wheel stand competitions, stock car train racing, Speed Truck's "Driven to Rock" and street drag racers reaching speeds of 200 miles per hour. </div>
<div><br />
</div>
<div>This new app allows users the ability to catch up on previous episodes from past seasons or have quick access of the upcoming show schedule.  They can also learn more about the cast through the bios section or purchase official On the Edge merchandise.</div>
<div><br />
</div>
<div>Click here to download the <a href="http://itunes.apple.com/us/app//id492494416?mt=8" target="_blank">On the Edge application from iTunes</a>.     </div>
<div><br />
</div>
]]></description> 
					<pubDate>Fri, 27 Jan 2012 15:43:25 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2012/1/27/lucas-oil-on-the-edge-application-for-the-iphone/</guid>
				</item>
			
				<item>
					<title>SOPA and PIPA Reaction - The Day the Web Went Black</title> 
					<link>http://keylimetie.com/blog/2012/1/20/sopa-and-pipa-reaction-the-day-the-web-went-black/</link> 
					<description><![CDATA[<div>While <a href="http://en.wikipedia.org/wiki/Stop_Online_Piracy_Act" target="_blank" class="ApplyClass">SOPA (StopOnline Piracy Act)</a> and <a href="http://en.wikipedia.org/wiki/PROTECT_IP_Act" target="_blank">PIPA (Protect IP Act)</a> are not new topics,
much of the general public was newly introduced to these terms Wednesday,
January 18th 2012, as thousands of websites took a stand against the
proposed legislation.</div>
<br />
<h4>SOPA / PIPA Overview</h4>
<div>At a high level SOPA
and PIPA are proposed legislation, in the U.S. House of Representatives and
Senate respectively, that would require search engines, advertisers, ISPs and<img alt="" src="/Common/Images/custom//Google-blackout.jpg" style="width: 200px; height: 150px; float: right; margin-top: 10px; margin-left: 10px; margin-bottom: 10px; " />
other internet entities to regulate content and be responsible to remove
allegedly infringing content. In theory,
the ideas behind both bills are important and are recognized by many to be
necessary in the fight against piracy, but the current versions are very broad.</div>
<br />
<div>CNN has a great
article, <a href="http://money.cnn.com/2012/01/17/technology/sopa_explained/" target="_blank">SOPA Explained: What it is and Why it Matters</a>, while Marketing Land
shares, <a href="http://marketingland.com/what-all-marketers-need-to-know-about-sopa-1677" target="_blank">What All Marketers Need To Know About SOPA - The Stop Online Piracy Act</a>. In addition to the
above articles, <a href="http://www.khanacademy.org/video/sopa-and-pipa?playlist=American%20Civics" target="_blank">KhanAcademy.org</a> and <a href="http://vimeo.com/31100268" target="_blank">fightforthefuture.org</a>, created videos to
help illustrate the bills in more detail and what could happen if the current
versions are passed into law.</div>
<br />
<h4>Online Protest</h4>
<div>Wednesday, many major
sites went dark to protest the anti-piracy bills and get the attention of the
public, showing what could happen to some of the web’s favorite sites, if these
bills are passed. Google blacked out their logo and linked to an information
page that encouraged users to sign a <a href="https://www.google.com/landing/takeaction/" target="_blank">petition</a>.</div>
<br />
<div>Other sites like
Wikipedia, Craigslist, Wordpress, Flickr, and Reddit.com took similar stands
and provided information on how to contact your local congressman or
woman.  Social media sites like Facebook <img alt="" src="/Common/Images/custom//wiki_blackout.jpg" style="width: 320px; height: 150px; float: right; margin-top: 10px; margin-left: 10px; margin-bottom: 10px; " />
and Twitter were flooded with the SOPA/PIPA related posts and were likely large
contributing factors to the widespread movement that took place Wednesday.</div>
<br />
<div>Although Facebook
didn’t join other web giants and go dark, Mark Zuckerberg, posted a status
about SOPA and linked it to the page that explains <a href="https://www.facebook.com/FacebookDC?sk=app_329139750453932" target="_blank">Facebook’s stance</a>.  In addition, Facebook
also joined other internet companies earlier this month in backing an alternative
to SOPA, the <a href="http://www.allfacebook.com/facebook-piracy-bill-2012-01" target="_blank">Online Protection and Enforcement of Digital Trade Act (OPEN)</a>.</div>
<br />
<h4>Was the Protest a Success?</h4>
<div>SOPA and PIPA related searches trended very high on Google all day.  Below is the list of the top 20 trending searches from Wednesday, January 18th, and 6 of the top 20 relate to online piracy.  If users did not immediately sign the petitions, at the very least, it sparked some interest to educate them about the proposed legislation.  <img alt="" src="/Common/Images/custom//googletrends.JPG" style="width: 125px; height: 260px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px; " />Google says more than 7 million people signed the <a href="https://plus.google.com/116899029375914044550/posts/WyqtYzsuJMT" target="_blank">anti-SOPA petition</a>, while Twitter reported 2.4+ million SOPA-related Tweets in a 4 hour span.  More than 162 million people saw the <a href="http://en.wikipedia.org/wiki/Wikipedia:SOPA_initiative/Learn_more" target="_blank">Wikipedia blackout page</a>.  It’s evident that the protest had a positive influence on the online and social media communities, but did the ‘decision makers’ get the message? </div>
<br />
<div>According to an email from fightforthefuture.org to its supporters, Wednesday's actions made an impact.  </div>
<br />
<div><blockquote>"Approaching Monday's crucial Senate vote there are now 35 Senators publicly opposing PIPA.  Last week there were 5.   And it just takes just 41 solid "no" votes to permanently stall PIPA (and SOPA) in the Senate.  What seemed like miles away a few weeks ago is now within reach.”</blockquote></div>
<br />
<div>For a summary on where various representatives stand on the two bills, ProPublica has put together a <a href="http://projects.propublica.org/sopa/" target="_blank">page</a> to easily keep track.  The next Senate vote for PIPA is scheduled for January 24<sup>th</sup>
and while many things can change in the next couple of days, it seems that Wednesday’s message had some initial effects in Washington. </div>
<div><br />
</div>
<div>POSTSCRIPT:  This morning Senate announced to<a href="http://gigaom.com/2012/01/20/senate-postpones-pipa-vote-your-move-web/" target="_blank"> postpone the scheduled  vote on PIPA</a>.  No official date has been annoucned.</div>
<p class="MsoNormal"> </p>
]]></description> 
					<pubDate>Fri, 20 Jan 2012 18:28:51 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2012/1/20/sopa-and-pipa-reaction-the-day-the-web-went-black/</guid>
				</item>
			
				<item>
					<title>New Facebook Insights for Page Admins</title> 
					<link>http://keylimetie.com/blog/2011/11/22/new-facebook-insights-for-page-admins/</link> 
					<description><![CDATA[<p class="MsoNormal">If you haven’t noticed already, Facebook has quietly introduced a new set of insight analytics for Facebook Page admins, which provides better detail on how well their stories engage their audience.
</p>
<img alt="" src="/Common/Images/custom/blog/facebook-settings.JPG" style="float: right; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; " />
<p class="MsoNormal">The update makes it easier for users to interpret the data and includes great visuals to display user interactions and total reach of the content.   One of the new data points ‘People Talking About This’, informs page admins the number of people who created a story about your page. </p>
<p class="MsoNormal">Upon initial login, page admins will be alerted to take a 5 step tour of the new layout and get themselves familiar with the new data.  If you have already “skipped” the tour or want to take it again it is always available to you from the settings dropdown in the top right corner.   </p>
<p class="MsoNormal">Below is a quick snapshot of some of the new data and graphs that Facebook provides. <br />
When a page admin initially logs into Facebook Insights the ‘Important Metrics’ are displayed with a graphical representation below.</p>
<p class="MsoNormal"><img alt="" src="/Common/Images/custom/blog/facebook-important%20metrics.JPG" style="width: 550px; height: 300px; float: left; " /></p>
<br />
<p class="MsoNormal">Like the old Insights, the basic metrics will continue to be displayed, but modified with cleaner and easy to comprehend graphs.   New data and graphs include how many people are talking about your page and the viral reach that the content is creating. </p>
<br />
<p class="MsoNormal"><img alt="" src="/Common/Images/custom/blog/facebook-how%20people%20talk%20about%20your%20page.JPG" style="width: 550px; height: 300px; float: left; " /></p>
<p class="MsoNormal">Like in the previous version, users are still able to export their data, but only as far back as July 19th and users can only filter data for a span of 89 days.  It’s still uncertain if the date range will expand going forward, but either way the updated reports are a nice feature to allow admins a way to verify their social media efforts are targeting the right audience.</p>
<img alt="" src="/Common/Images/custom/blog/facebook-export%20insight%20data.JPG" style="width: 300px; height: 200px; float: left; " />
<div style="clear: both; "></div>
<p class="MsoNormal">If you have any stories or tips on using the new Insights, please share them in the comments section below.</p>
]]></description> 
					<pubDate>Tue, 22 Nov 2011 20:19:19 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/11/22/new-facebook-insights-for-page-admins/</guid>
				</item>
			
				<item>
					<title>How We Made a Fun Plush Angry Birds Game</title> 
					<link>http://keylimetie.com/blog/2011/9/23/how-we-made-a-fun-plush-angry-birds-game/</link> 
					<description><![CDATA[<p>
We recently facilitated an on-site hackathon at a client's office, where the KeyLimeTie team came in and produced the event for them and served as facilitators while their employees developed their ideas.  We decided to have a bit of fun with it, knowing that everyone needs a break after long hours of intensive coding and brainstorming.
</p>

<h4>What if Angry Birds were real?</h4>

<p>
Angry Birds has been called 'the new Super Mario Bros.'  I'm hard pressed to find someone with a smartphone who hasn't played it.  Since Rovio sells the plush Angry Bird characters, we decided to make the game a reality.
</p>

<div class="BlogImageCenter" style="width: 580px;">
<img src="/Common/Images/Custom/blog/blog-angrybirds-3.png" alt="" />
</div>

<p>
The setup is surprisingly simple, though it took me a little searching to get it right.  Instead of building a slingshot, we opted for a three person water balloon launcher.  To make the bricks, we first bought 1/2'-thick foamcore from a craft store, but it proved to be too flimsy when we put the relatively heavy plush pig on top of it.  Since we wanted the game to be a bit of a challenge, we had to find something else.
</p>

<div style="width: 300px;" class="BlogImageRight">
<img src="/Common/Images/Custom/blog/blog-angrybirds-1.png" />
</div>

<p>
While walking at the Yorktown Mall near our office, I found <a href="http://www.brilliantskytoys.com/" target="new">Brilliant Sky Toys & Books</a>.  They happened to carry exactly what I was looking for; <a href="http://www.amazon.com/Melissa-Doug-Deluxe-Cardboard-Blocks/dp/B000A12YBW" target="new">Melissa & Doug Jumbo Cardboard Blocks</a>.  These blocks are similar to ones I remember in play areas when I was little.
</p>

<p>
These blocks are heavy enough to pose a challenge when struck by a plush bird launched from a distance.  In addition to the difficulty of hitting a narrow target (you're essentially playing a 2D game in a 3D world), this means that our Angry Birds game isn't a walk in the park.  It's more fun because of the challenge.
</p>

<div style="width: 300px;" class="BlogImageLeft">
<img src="/Common/Images/Custom/blog/blog-angrybirds-2.png" />
</div>

<p>
We set up the large Angry Birds course at the client, and for about an hour took turns hurling plush birds at plush pigs.  A lot of shots missed, and the participants experimented with different techniques of holding the birds, different strengths on the slingshot, and other techniques.  We even tried to spread out the target to make it wider, but that actually made the game more difficult.  In the end it appears that it's easier to focus on one target than it is to have several in front of you.
</p>

<h4>Here's What You Need</h4>

<p>
Want to build your own Angry Birds game?  Here are links to the products we used to assemble it.
</p>

<ul>
	<li><a href="http://shop.angrybirds.com/" target="new">Plush Angry Birds & Pigs</a></li>
	<li><a href="http://www.amazon.com/gp/product/B002JCC1J0/ref=pd_lpo_k2_dp_sr_2?pf_rd_p=486539851&pf_rd_s=lpo-top-stripe-1&pf_rd_t=201&pf_rd_i=B000QFDKYM&pf_rd_m=ATVPDKIKX0DER&pf_rd_r=1PSCHW346GX8EXBM4FVM" target="new">90 Yard Water Balloon Launcher</a></li>
	<li><a href="http://www.amazon.com/Melissa-Doug-Deluxe-Cardboard-Blocks/dp/B000A12YBW" target="new">Melissa & Doug Jumbo Cardboard Blocks</a></li>
</ul>

<h4>Did you build your own?  Tell us!</h4>

<p>
If you try this or another version of a physical Angry Birds game, we'd love to know!  Tweet us at @<a href="http://twitter.com/keylimetie">KeyLimeTie</a> or email us at <a href="mailto:info@keylimetie.com">info@keylimetie.com</a>.
</p>]]></description> 
					<pubDate>Fri, 23 Sep 2011 22:02:07 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/9/23/how-we-made-a-fun-plush-angry-birds-game/</guid>
				</item>
			
				<item>
					<title>How to Implement Social Sign-In - Summary From SocialDevCamp Chicago </title> 
					<link>http://keylimetie.com/blog/2011/9/1/how-to-implement-social-sign-in-summary-from-socialdevcamp-chicago/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<img alt="Chris Grove" src="/Common/Images/Custom/blog/blog-grove-sdcchi-2011.png" />
Chris Grove, CTO
</div>


<p>
This past weekend, I spoke at SocialDevCamp Chicago with developers about how to integrate social sign-in features into their webistes and apps.  Here are some of the key points from the talk.
</p>

<h4>What is 'social sign-in?'</h4>

<p>
Social sign-in features enable your website visitors to register for your website or application using an existing login of their choice, such as their Facebook, Google, or Twitter profile.  As a web developer, you can leverage a third party as an identity provider and at the same time you can reduce 'login fatigue' for your users.
</p>


<p>
Some benefits of using social sign-in on your website include:
</p>

<ul>
	<li>Increased conversion rate</li>
	<li>Better contextual data as you gain access to the user's profile information</li>
	<li>Less effort to implement (do you really want to write Yet Another Authentication Service?)</li>
	<li>Increased security by leveraging the third-party provider's security features</li>
</ul>



<p>
As a website owner, you face the challenge of designing a compelling enough experience to make users want to register and dig deeper.  Just 25% of users are generally willing to complete a registration, and 76% give incorrect or incomplete information when signing up for a new service.  People are more willing to return to (and purchase from) sites that automatically recognize users.
</p>

<h4>Why Not Social Sign-In?</h4>

<p>
However, there are some cases in which you would not want to implement social sign-in.  You need to be comfortable handing off critical site functionality to a third party (if you are in a regulated industry, this may be prohibited due to security requirements).
</p>

<p>
When implementing social sign-in, there's a tradeoff: use a convenient service such as JanRain and you are charged once usage exceeds a certain threshhold, whereas if you implement yourself, your effor to implement (also a cost) increases.
</p>

<p>
Further, know that at any point, Identity Providers (IDPs) like Facebook and Google can change their API, breaking your site functionality and forcing you to immediately stop and adapt your code for the changes.  When you use social sign-in, you trade convenience for control and dependency on a third party's system.
</p>

<h4>Best Practices</h4>

<p>
To get the most out of social sign-in, you'll want to use the social network's branding, which lets your users know that the process of creating a new account will be quick, painless, and trusted.  Also, make sure to offer multiple identity providers (e.g. Google, Facebook, OpenID, Twitter) so the user can choose which service they prefer.  You can streamline your user's registration by pulling profile data from the third party service, and always give a clear indication of when registration is a success.
</p>
	
<h4>Providers and APIs</h4>	

<ul>

	<li>Identity Providers include: <A href="https://developers.facebook.com/docs/authentication/" target="new">Facebook</a>, <a href="https://dev.twitter.com/docs/auth" target="new">Twitter</a>, <a href="http://code.google.com/apis/accounts/docs/OpenID.html" target="new">Google</a>, <a href="http://developer.linkedin.com/documents/sign-linkedin" target="new">LinkedIn</a>, <a href="http://www.programmableweb.com/api/windows-live-id-web-authentication" target="new">Microsoft</a>, <a href="http://developer.yahoo.com/social/sdk/" target="new">Yahoo</a>, <a href="http://openid.net/developers/"target="new">OpenID</a>, <a href="http://developer.myspace.com/wordpress/" target="new">MySpace</a>, <a href="http://www.flickr.com/services/api/" target="new">Flickr</a>, etc.</li>
	<li>Stand-alone APIs include: <a href="http://hybridauth.sourceforge.net/" target="new">HybridAuth</a> (PHP), <a href="https://github.com/intridea/omniauth" target="new">OmniAuth</a> (Ruby), <a href="http://code.google.com/p/socialauth/" target="new">SocialAuth</a> (Java, .NET)</li>
	<li>Service APIs include: <a href="http://janrain.com" target ="new">JanRain</a>, <a href="http://www.gigya.com/" target="new">Gigya</a>, <a href="http://www.windsoc.co/ target="new">Windsoc</a></li>

</ul>
]]></description> 
					<pubDate>Thu, 01 Sep 2011 22:46:07 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/9/1/how-to-implement-social-sign-in-summary-from-socialdevcamp-chicago/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie&amp;quot;s Chris Grove to speak at SocialDevCamp Chicago on Social Sign-in</title> 
					<link>http://keylimetie.com/blog/2011/8/15/keylimeties-chris-grove-to-speak-at-socialdevcamp-chicago-on-social-sign-in/</link> 
					<description><![CDATA[<div style="width: 200px;" class="BlogImageRight">
<img alt="Chris Grove" src="/Common/Images/Custom/blog/blog-grove-200.jpg" />
Chris Grove, CTO
</div>

<p>
Chris Grove will be teaching developers how to build login sequences for applications using Twitter, Facebook, Google and other popular services. People suffer 'login fatigue;' they've grown tired of being required to create a new username and password for each service they join. Grove's talk will show just how easy it is for developers to relieve their users' pain by giving them an option to use an existing account.
</p>

<p>
SocialDevCamp Chicago is a weekend conference for entrepreneurs and developers who build social web applications. Several KeyLimeTie employees are a part of the team that produces this annual event, which draws several hundred attendees and has featured speakers from companies including Google, Facebook, Groupon, and the W3C.
</p>

<p>
See Chris Grove and others at the event July 26-28.  <a href="http://sdcchi.com" target="new">Visit the SocialDevCamp website</a> for more information and to get your tickets.
</p>
]]></description> 
					<pubDate>Mon, 15 Aug 2011 17:36:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/8/15/keylimeties-chris-grove-to-speak-at-socialdevcamp-chicago-on-social-sign-in/</guid>
				</item>
			
				<item>
					<title>Weighing Importance of SEO Factors - Periodic Table of SEO Elements</title> 
					<link>http://keylimetie.com/blog/2011/8/10/weighing-importance-of-seo-factors-periodic-table-of-seo-elements/</link> 
					<description><![CDATA[<p>
We receive our fair share of questions regarding Search, SEO, and Google. How can we get our site to rank higher? What is the most important SEO factor?  There are many ideas, opinions, and explanations of what factors into the algorithms.
</p>
<div style="width: 300px; " class="BlogImageRight">
<a href="http://searchengineland.com/seotable" target="new"><img alt="Periodic Table of SEO Elements" src="/Common/Images/Custom/blog/blog-seotable.png" /></a>
View the full Periodic Table of SEO Elements on Search Engine Land
</div>
<p>
A couple of months ago, the guys over at Search Engine Land put together this <a href="http://searchengineland.com/seotable" target="new">Periodic Table of SEO Elements</a>.  It’s a high level overview highlighting the most important factors in Content, HTML, Architecture, Linking, Social, Trust, and Personal, and also notes things not to do to avoid negative consequences.
</p>
<p>
Instead of hard-and-fast lists of SEO "DOs" and "DO NOTs," this infographic assigns a weight to each element and breaks out the chart into multiple categories (On Site, Off Site, Violations, and Blocking) and sub categories (Content, HTML, Social, etc).  This makes it easier to note the relative impact an action will have on your overall SEO rankings.
</p>
<p>
It also emphasizes that fresh, high quality, engaging content is among the leading drivers for the search engines and ultimately the user, which is just with what Google has been stressing <a href="http://googlewebmastercentral.blogspot.com/2011/05/more-guidance-on-building-high-quality.html" target="new">in recent news and through the Google Panda update</a>.  The chart underscores that no single factor will guarantee results. Over 20 other factors go into search rankings (both positive and negative).  Most “on page” factors, elements like Titles, Headers, Meta Tags, and URLs, have been common in the SEO industry for years.  Whereas, some "off page" elements are new to the practice and might take some time to develop.  Practitioners have been focusing efforts on elements like Shares, Social Media, and Reputation over the last 12 months.
</p>
<p>
Finally, there are elements that are usually associated with "black hat" tactics, such as Stuffing, Hidden tags, Link Spam, and of course thin content.  These will result with a negative impact on the website.
</p>
<p>
This infographic is a great resource for both people new to the SEO world and people that work in the industry on a daily basis.  It’s a great source to refer to when creating new content and web pages.  <a href="http://searchengineland.com/seotable" target="new">Search Engine Land</a> did a great job of simplifying how these complex concepts are communicated. The Periodic Table of SEO Elements makes it easier to both practice good SEO and communicate good SEO practices to clients.
</p>
]]></description> 
					<pubDate>Wed, 10 Aug 2011 17:46:13 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/8/10/weighing-importance-of-seo-factors-periodic-table-of-seo-elements/</guid>
				</item>
			
				<item>
					<title>Reframing the Mobile App vs. Mobile Web Debate</title> 
					<link>http://keylimetie.com/blog/2011/8/4/reframing-the-mobile-app-vs-mobile-web-debate/</link> 
					<description><![CDATA[<div style="width: 300px; " class="BlogImageRight">
<img alt="Mobile Apps vs. Mobile Web" src="/Common/Images/Custom/blog/blog-scale.png" />
</div>

<p>
It's a debate that's raged since the first smartphones hit the market: should you develop native mobile applications, or web sites that are optimized for mobile devices?  The answer seems as elusive as ever.  The fact that we're still having the debate is itself something of an answer though; both are viable solutions.
</p>

<p>
The debate is so often framed in either-or terms, however there's no reason you can't do both.  If you expect that you have customers who will download a mobile app, then you also have customers who will find your web site on a mobile browser.  A mobile-optimized web site is increasingly important for most businesses, and should be a starting point for anyone asking the question to begin with.
</p>

<h4>Ask the Right Question</h4>

<p>
But the real question, from a technology perspective, is how to expose more sophisticated functionality to your mobile customers.  Native apps will usually be more fluid, be able to access all of the features of the device, will conform to the experience the user expects for their specific device, and will usually perform better than web sites.  They will also usually cost more to develop and will be limited to just those devices on the selected platform (iOS, Android, etc.)
</p>

<p>
A web-based application, on the other hand, will run on any smartphone (more or less).  But, you won't get access to all of the hardware features of the device, and the interface will not look like the native apps that it will run alongside.  Another downfall that's often overlooked is that it is harder for potential users to discover web applications, as compared to browsing a centralized app store.  On the flip side, there are a lot more developers out there who can work with web technologies than with the native development environments, and they are often cheaper.
</p>

<p>
This is just touching the surface, and there are no hard and fast rules.  It might seem, for instance, that gaming is best done as a native app - and this is undoubtedly true for games that rely on high-framerate 3D graphics.  But games that are suitable for Flash or HTML5 may work very well as a mobile web app.  So spend some time up front, and ask some questions.

<ul>
<li>What technologies are feasible?</li>
<li>What are your potential users' expectations?</li>
<li>How critical is performance?</li>
<li>How will you market and distribute the app?</li>
</ul>

<p>
Every project is unique, so don't let anyone tell you there is only one answer.  Your project will drive the answer that's right for you.
</p>

<h4>Interested in your own mobile app?</h4>
<p>
If you are interested in developing an app, or extending an app you already have to multiple platforms to reach a wider range of users, contact KeyLimeTie at 630.598.9000 or <a href="mailto:sales@keylimetie.com">sales@keylimetie.com</a>.
</p>]]></description> 
					<pubDate>Thu, 04 Aug 2011 20:00:28 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/8/4/reframing-the-mobile-app-vs-mobile-web-debate/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie CEO Chris Pautsch Quoted in Crain&amp;quot;s Chicago Business</title> 
					<link>http://keylimetie.com/blog/2011/8/2/keylimetie-ceo-chris-pautsch-quoted-in-crains-chicago-business/</link> 
					<description><![CDATA[<p>
We're thrilled that our CEO, Chris Pautsch, was quoted in two separate Crain's Chicago Buisness articles surrounding mobile apps.  Crain's approached Chris to comment on what works about the business applications area CEOs such as Billy Dec of Rockit Ranch Productions, Helmut Jahn (Murphy/Jahn), and Justin Seidenberg (Kiqstart Music) swear by.
</p>

<p>
Here are the quotes, with links to articles:
</p>

<p>
'A (video chat) app like Skype provides an extra layer of interaction that helps reinforce your message. If you have to air a grievance or a concern, a visual rendering can carry a lot more weight,' says Chris Pautsch, CEO of KeyLimeTie LLC.' <i>Quoted in: <a href="http://www.chicagobusiness.com/article/20110716/ISSUE02/307169991/the-apps-skype-googdocs-the-user-justin-seidenberg-owner-kiqstart-music" target="new">The apps: Skype, GoogDocs || The user: Justin Seidenberg, owner, Kiqstart Music</a>.</i>
</p>

<p>
'An app like that allows (Mr. Jahn) to work directly in the same digital medium he uses to present his work,' says Chris Pautsch, CEO of the Downers Grove app-development firm KeyLimeTie LLC.  'There's also something to be said for not carrying around all that paper.'  <i>Quoted in <a href="http://www.chicagobusiness.com/article/20110716/ISSUE02/307169995/helmut-jahn-meets-ipad-the-very-best-apps-for-small-business" target="new">Helmut Jahn meets iPad: The very best apps for small business</a>.</i>
</p>

<h4>Interested in your own mobile app?</h4>
<p>
If you are interested in developing an app, or extending an app you already have to multiple platforms to reach a wider range of users, contact KeyLimeTie at 630.598.9000 or <a href="mailto:sales@keylimetie.com">sales@keylimetie.com</a>.
</p>]]></description> 
					<pubDate>Tue, 02 Aug 2011 21:34:17 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/8/2/keylimetie-ceo-chris-pautsch-quoted-in-crains-chicago-business/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Recognized as one of Chicago&amp;quot;s 101 Best and Brightest Companies to Work For</title> 
					<link>http://keylimetie.com/blog/2011/7/14/keylimetie-recognized-as-one-of-chicagos-101-best-and-brightest-companies-to-work-for/</link> 
					<description><![CDATA[<div style="width: 100px; " class="BlogImageRight">
<img alt="101 Best & Brightest Companies to Work For" src="/Common/Images/Custom/blog/blog-best-brightest-2011.png" />
</div>
<p>
For the second year in a row KeyLimeTie has been named as one of "Chicago’s 101 Best and Brightest Companies to Work For" by the National Association for Business Resources (NABR).  Here's a link to the <a href="http://www.prnewswire.com/news-releases/keylimetie-recognized-as-one-of-chicagos-101-best-and-brightest-companies-to-work-for-98319274.html?utm_source=twitterfeed&utm_medium=twitter" target="new">press release we just issued about the honor</a>.</p>
<p>
Receiving this award again further validates for us KeyLimeTie’s continued commitment to fostering a positive work environment where employees feel valued and can develop to their full potential.  Results were determined based on the responses our employees gave to the survey distributed by NABR.  As CEO and Co-Founder, I'm happy knowing employees expressed their enjoyment of working at KeyLimeTie in such a way that allowed us to receive this award again.
</p>
]]></description> 
					<pubDate>Thu, 14 Jul 2011 17:58:18 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/7/14/keylimetie-recognized-as-one-of-chicagos-101-best-and-brightest-companies-to-work-for/</guid>
				</item>
			
				<item>
					<title>My First Hackathon - A Day at the Ji-V Hack with Team KeyLimeTie</title> 
					<link>http://keylimetie.com/blog/2011/6/29/my-first-hackathon-a-day-at-the-ji-v-hack-with-team-keylimetie/</link> 
					<description><![CDATA[<div style="width: 300px; " class="BlogImageRight">
<img alt="Andy presenting Team KeyLimeTie's app at the Ji-V Hack" src="/Common/Images/Custom/blog/blog-andy-jivhack.png" />
Presenting Team KeyLimeTie's app at the Ji-V Hack
</div>
<p>
This past weekend I attended my first hackathon: the <a href="http://www.facebook.com/pages/Ji-V-HACK/231957313495190?sk=wall" target="new">Ji-V Hack</a>. After a long day and a lot of fun, our team came in 2nd place. I learned a lot in the process and hope to participate in another hackathon soon.
</p>
<p>
In the morning when I arrived, I first walked around and talked with a few of the other participants. Our team then assembled and we listened to the organizers describe what we needed to do. Team KeyLimeTie consisted of Richie (senior software engineer), Jennifer Wittman (designer) and me (software engineer). At the last minute, the organizers assigned us a new member—a beginner developer named Austin. Austin is in high school and participates in the <a href="http://21cyp.com/" target="new">21st Century Youth Project</a>, a program that teaches students mobile development. We got the opportunity to mentor him as we built our app, and he was a helpful addition to our team.
</p>
<div style="width: 300px; " class="BlogImageLeft">
<img alt="Team KeyLimeTie building their apps" src="/Common/Images/Custom/blog/blog-jivhack-2.png" />
Our team building our apps (Clockwise from top left: Jennifer, Richie, Andy, Austin).
</div>
<p>
This hackathon challenge was to develop a mobile website and app that benefitted <a href="http://www.giveforward.com" target="new">GiveForward</a>, a company that helps people raise funds for loved ones in medical need.  The website and the app actually had two different purposes.  The mobile site would show a profile, easily accept donations, and let people share using social media. The mobile app was to be a tool for the fundraiser manager, who is often a loved one championing a sick person’s cause. GiveForward’s staff suggested the app let managers update the fundraiser news page, see who has donated, send thank you notes to donors, and offer a social media sharing tool.
</p>
<p>
Once we got started, our team discussed our approach. Richie and I have C# .NET experience, so we decided to create the mobile website in MVC3.  Richie built the website, and I built the mobile app for Windows Phone 7. As Austin was learning Java programming on Android, we decided to give him a crash course in C# so he could help me develop the WP7 app.
</p>
<div style="width: 300px; " class="BlogImageRight">
<img alt="Andy with Motorola Product Manager Jinnan Sun" src="/Common/Images/Custom/blog/blog-jivhack-3.png" />
Me posing with Motorola Product Manager Jinnan Sun, who awarded me my new Droid Pro phone.
</div>
<p>
Austin took to C#/WP7 development quite well.  I asked questions to make sure he had a good understanding of what I was showing him. Once his developer tools were all set up, I asked him to create a page for the mobile app and to ask me questions.
</p>
<p>
By the end of the day, Richie and Jennifer had a prototype mobile website up in MVC3. Austin had created a few pages for our mobile app, and I showed him how his pages would integrate into mine. I was chosen to present to the judges and other teams, then it was time to wait. I watched the other presentations and a martial arts performance that was held while the judges deliberated.
</p>
<p>
At long last, the staff announced the winners, and we won 2nd place!  We also received a surprise award for the team that did the most to mentor their student teammate.  I was excited to receive a special mention for helping Austin along with a Droid Pro phone. Austin won a Blackberry Pearl for being the first student to show a prototype of a mobile app he helped develop.
</p>
<p>
Overall, I had a fun experience at the Ji-V Hack and I’m really looking forward to more hackathons in the future.
</p>

<p>
Update: <a href="http://community.developer.motorola.com/t5/MOTODEV-Blog/Chicago-Ji-V-Hackathon/ba-p/16278" target="new">MotoDev posted this article outlining the Ji-V Hack on their blog, and kindly mentioned KeyLimeTie and me</a>. 
</p>
]]></description> 
					<pubDate>Wed, 29 Jun 2011 22:29:01 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/6/29/my-first-hackathon-a-day-at-the-ji-v-hack-with-team-keylimetie/</guid>
				</item>
			
				<item>
					<title>What&amp;quot;s New in iOS5?</title> 
					<link>http://keylimetie.com/blog/2011/6/9/whats-new-in-ios5/</link> 
					<description><![CDATA[<div style="width: 200px;" class="BlogImageRight">
<img alt="" src="/Common/Images/Custom/email-newsletter/wwdc.jpg" />
</div>

<p>
Greetings from San Francisco! Chris Grove and I are at the <a href="http://developer.apple.com/wwdc/" target="new">Apple WWDC conference</a> all week learning about all of the new features coming out from Apple very soon. In <a href="http://events.apple.com.edgesuite.net/11piubpwiqubf06/event/" target="new">Monday’s Keynote</a>, several things were announced including details on the new Lion OS, iOS5 and iCloud. As a participant of the conference, we received access to the iOS5 beta and there’s a lot of great new features. Here are some of the ones that are of particular interest.
</p>

<h4>Notification Center</h4>

<p>
The current notification system on the iPhone is pretty weak. There’s no way to review or respond to them individually and they interrupt whatever you’re doing (e.g. playing a game). With iOS5, all of your alerts are now in one place, including new emails, texts, friend requests and more. In addition, you can have stock quotes and weather displayed. From anywhere on the phone, simply swipe down from the top of the screen to enter Notification Center. When new notifications come in, they briefly display at the top of your screen without interrupting what you’re doing. When the phone is off, the Lock screen displays notifications as they come in, and you can interact with them with just a swipe.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/01-Notification-Center.jpg" style="float: none; margin: 0 15px 0 0;" />
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/01-Notification-LockScreen.jpg" style="float: none; margin: 0px;" />
</div>

<h4>iMessage</h4>

<p>
iMessage is a new messaging service that replaces the old Text Messaging system. You can now send as many text messages as you want from your Apple device to anyone with an Apple device. You can send text, photos, videos, locations, and contacts and as you can now track messages with delivery receipts and read receipts. When in a conversation with someone, you can see when someone’s typing similar to instant messaging applications. Because all messaging is stored in iCloud, you pick up where you left off on any of your other Apple devices.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/02-iMessage.jpg" style="float: none; margin: 0px;" />
</div>

<h4>Newsstand</h4>

<p>
Newsstand is a new built-in app that manages your magazine and newspaper subscriptions. Whenever you buy new newspaper and magazine subscriptions from the App Store, they will be accessible in this new app. Apple has deals with the six major publishers and with the rise of online publications, whatever your read should be available in this new app.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/03-Newsstand.jpg" style="float: none; margin: 0px;" />
</div>

<h4>Reminders</h4>

<p>
Up until now, you had to create calendar appointments to create reminders. iOS5 introduces the new Reminders app for organizing tasks with due dates and, optionally, locations. If you opt to use locations, you can be reminded based on your location. For example, the reminder could be “Call Tracy when you leave work”. When you leave work, Reminders will detect the location change and alert you. Reminders also works with iCal, Outlook, and iCloud, so changes you make update automatically on all your devices and calendars.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/04-Reminders.jpg" style="float: none; margin: 0px;" />
</div>

<h4>Twitter</h4>

<p>
When Twitter first came out, I didn’t get it. It took awhile for me to really see benefits, but now I check out Twitter pretty much every day. Whether you like it or not, Twitter is huge and not going away. In fact, it’s only getting bigger…so big, it’s now completely integrated into iOS5. You only need to setup your profile once under Settings, and then you can tweet directly from Safari, Photos, Camera, YouTube or Maps.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/05-Twitter.jpg" style="float: none; margin: 0px;" />
</div>

<h4>Camera</h4>
<p>
My kids are in just about every sport possible...baseball, soccer, swimming, hockey…you name it. I like taking lots of pictures and because the iPhone camera is so good, I use it more often than my Canon SLR. Sometime I need that camera ready in 2 seconds and it’s a real pain when you have to click the On button, slide the unlock slider, maybe exit the current app, find the camera app and click it. That can take a good 10 seconds…add a few more seconds if you have to type in an unlock code. No more! With iOS5, you can open the Camera app right from the Lock screen even if you have a lock code. Also, the camera screen now has grid lines, pinch-to-zoom gestures, and single-tap focus and exposure locks. And do you hate the button on the screen to take photos? Now you can press the volume-up button to snap your photo. And if you have Photo Stream enabled in iCloud, your photos automatically download to all your other Apple devices.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/06-Camera1-LockScreen.jpg" style="float: none; margin: 0 15px 0 0;" />
	<img alt="" width="320" src="/Common/Images/custom/Blogs/iOS5/06-Camera2-Gridlines.jpg" style="float: none; margin: 0 0 60px 0;" />
</div>

<h4>Photos</h4>

<p>
One of Apple’s main goals was to eliminate the need for a computer (see next feature for more). With iOS5, you can now crop, rotate, enhance and remove red-eye without leaving the Photos app. With iCloud, you can automatically push new photos to all your iOS devices. It’s automatic...nothing for you to do. And it’s free!
</p>
<p>
In the example below, I took a picture taken on my iPhone from my daughter's ballet recital, clicked the Enhance button to bring out the colors and then cropped it. Only three taps of my finger and it looks so much better.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="320" src="/Common/Images/custom/Blogs/iOS5/07-Photos1-Before.jpg" style="float: none; margin: 0 15px 30px 0;" />
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/07-Photos2-After.jpg" style="float: none; margin: 0px;" />
</div>

<h4>PC Free</h4>

<p>
Wasn’t it annoying when you opened up your iPhone for the first time and the first thing it showed is that you need to plug it into your computer? With iOS5, you no longer need a computer. Now you can activate and set up your device wirelessly, right out of the box. And with iCloud, back up and restore your device automatically.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/08-PC-Free.jpg" style="float: none; margin: 0px;" />
</div>

<h4>Wi-Fi Sync</h4>

<p>
If you’re like me, you have multiple Apple devices. My wife and I have iPhones, we have an iPad, and my work laptop is a MacBook. Sometimes I buy music or apps on my iPhone, sometimes on my Mac, sometimes my wife buys stuff…how do we keep it all in sync? We have to constantly sync our devices on the Mac each taking turns to centralize everything and then re-sync…a nightmare. iOS5 ends that! You will soon be able to wirelessly sync your device to your Mac or PC over a shared Wi-Fi connection. Every time you connect your device to a power source (e.g. overnight for charging), it automatically syncs and backs up any new content to iTunes.
</p>

<h4>iCloud</h4>

<p>
What is iCloud? In a nutshell, iCloud is an online storage system where all your music, apps, latest photos, email, contacts, calendars, etc. are stored so it’s always accessible from your devices. By utilizing iCloud, all your devices stay in sync without manually syncing! Oh, and it’s free!

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/10-iCloud2-Settings.jpg" style="float: none; margin: 0 15px 0 0;" />
	<img alt="" width="240" src="/Common/Images/custom/Blogs/iOS5/10-iCloud3-AppStore.jpg" style="float: none; margin: 0px;" />
</div>

<h4>iTunes Match</h4>

<p>
I saved possibly the best for last. Do you rip your old CDs and load them onto your Apple devices? Or maybe buy MP3s from other websites? That’s a lot of work and isn’t it a pain how they are treated differently from iTunes songs. iTunes Match solves all of that. iTunes Match allows you store your entire music collection in iCloud for just $24.99 a year! But instead of taking hours (or days for those of you with a huge music collection), it only takes minutes. iTunes already has pretty much every song every recorded (over 18 million so far) and can match your files to theirs. It only needs to upload the few they don’t have. And as a bonus, all the music iTunes matches plays back at 256-Kbps iTunes Plus quality even if your original copy was of lower quality.
</p>

<div style="text-align: center; margin: 20px 0 20px 0;">
	<img alt="" src="/Common/Images/custom/Blogs/iOS5/11-iTunes-Match.jpg" style="float: none; margin: 0px;" />
</div>]]></description> 
					<pubDate>Fri, 10 Jun 2011 05:45:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/6/9/whats-new-in-ios5/</guid>
				</item>
			
				<item>
					<title>Windows Phone Rapidly Growing, App Development Opportunities </title> 
					<link>http://keylimetie.com/blog/2011/6/9/windows-phone-rapidly-growing-app-development-opportunities/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 200px;">
<img alt="" src="/Common/Images/Custom/blog/blog-wp7.png" />
</div>

<p>
Consumers are showing increased interest in Windows Phone 7 devices, known for their fresh, intuitive user interfaces with a clean design.  Microsoft is well poised as a contender in the smartphone market dominated by Apple and Google.  At KeyLimeTie, we're seeing growing interest from clients as well, and are engaged in several projects to take existing iOS and Android apps and build WP7 versions of them.
</p>

<p>
Analysts have projected that WP7 <a href="http://www.zdnet.co.uk/blogs/jacks-blog-10017212/windows-phone-7-to-overtake-iphone-says-idc-10022092/" target="new">could overtake the iPhone's marketshare as early as 2015</a>.  Today the WP7 app marketplace is still in its infancy, so getting an app in the Marketplace now allows for more visibility, and there's really an opportunity for the best apps to ride the platform to success as it grows.  Microsoft is even offering co-marketing opportunities to promote popular or name brand apps.  With the 'Mango' update expected in the fall, '<a href="http://thenextweb.com/microsoft/2011/05/17/the-mango-update-to-wp7-is-set-to-revolutionize-the-platform/" target=
"new">WP7's capabilities will be on par with iOS and Android</a>,' says Peter Morano, CIO at KeyLimeTie.
</p>

<p>
Another advantage of Windows Phone is the rich developer tools Microsoft provides; these tools allow for rapid development of WP7 apps, which means these apps can cost significantly less to develop than their iOS and Android counterparts.  Microsoft invited KeyLimeTie COO Brian Pautsch (@<a href="http://twitter.com/brianpautsch" target="new">brianpautsch</a>) and CIO Peter Morano (@<a href="http://twitter.com/petermorano" target="new">petermorano</a>) to attend an intensive, week-long Windows Phone development accelerator where Microsoft made their WP7 developer trainers available to assist with projects, with the aim of releasing apps to the store that week.  With Microsoft pushing development on the platform aggressively, KeyLimeTie is seeing more opportunity to reach customers on this intuitive platform that is a natural extension of the team's .NET development capabilities.
</p>

<h4>Need Windows Phone Development?</h4>

<p>
If you are interested in your own Windows Phone app, please contact KeyLimeTie at 630.598.9000 or <a href="mailto:sales@keylimetie.com">sales@keylimetie.com</a>. Follow us on Twitter at @<a href="http://twitter.com/keylimetie" target="new">KeyLimeTie</a>.
</p>]]></description> 
					<pubDate>Thu, 09 Jun 2011 19:31:37 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/6/9/windows-phone-rapidly-growing-app-development-opportunities/</guid>
				</item>
			
				<item>
					<title>New Windows Phone 7 App for Naperville Running Company </title> 
					<link>http://keylimetie.com/blog/2011/6/8/new-windows-phone-7-app-for-naperville-running-company/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<a href="zune://navigate?phoneAppID=dae71a35-ce8a-e011-986b-78e7d1fa76f8" target="new"><img alt="NRC Runner Windows Phone App" src="/Common/Images/Custom/blog/blog-nrcwindows-200.png" /></a>
<br />
<a href="zune://navigate?phoneAppID=dae71a35-ce8a-e011-986b-78e7d1fa76f8" target="new"><img alt="Download the App" src="/Common/Images/Custom/blog/blog-wp7-download.png" style="margin: 20px 74px 10px 74px;" /></a>
</div>

<p>
We're thrilled to announce the release the Naperville Running Company app for Windows Phone, <a href="http://www.keylimetie.com/blog/2010/7/20/naperville-running-company-app-in-itunes-store/">based upon our earlier iOS version</a>.  The Naperville Running Company app allows users to calculate their run pace, view recent store news, upcoming events, and receive alerts on things related to the store.  If you have Zune installed on your PC, you can <a href="zune://navigate?phoneAppID=dae71a35-ce8a-e011-986b-78e7d1fa76f8">download the app from the Marketplace</a>.
</p>

<p>
Microsoft invited KeyLimeTie COO Brian Pautsch (@<a href="http://twitter.com/brianpautsch" target="new">brianpautsch</a>) and CIO Peter Morano (@<a href="http://twitter.com/petermorano" target="new">petermorano</a>) to attend an intensive, week-long Windows Phone development accelerator where Microsoft made their WP7 developer trainers available to assist with projects, with the aim of releasing apps to the store that week.  With Microsoft pushing development on the platform aggressively, KeyLimeTie is seeing more opportunity to reach customers on this intuitive platform that is a natural extension of the team's .NET development capabilities.
</p>

<h4>Need Windows Phone Development?</h4>

<p>
If you are interested in your own Windows Phone app, please contact KeyLimeTie at 630.598.9000 or <a href="mailto:sales@keylimetie.com">sales@keylimetie.com</a>. Follow us on Twitter at @<a href="http://twitter.com/keylimetie" target="new">KeyLimeTie</a>.
</p>]]></description> 
					<pubDate>Wed, 08 Jun 2011 19:15:18 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/6/8/new-windows-phone-7-app-for-naperville-running-company/</guid>
				</item>
			
				<item>
					<title>Peter Morano to Present at American Press Institute in Washington, DC </title> 
					<link>http://keylimetie.com/blog/2011/6/6/peter-morano-to-present-at-american-press-institute-in-washington-dc/</link> 
					<description><![CDATA[<div style="width: 200px;" class="BlogImageRight">
<img alt="Peter Morano" src="/Common/Images/Custom/blog/blog-morano-200.jpg" />
Peter Morano, CIO
</div>

<p>
KeyLimeTie CIO Peter Morano is scheduled to present his talk, 'Developing a Successful Mobile Strategy' at the American Press Institute's 'Mobile Media: Opportunities on the Move' conference July 18-19 in Washington, DC.
</p>

<p>
Pete's talk will discuss the inevitability of adopting a mobile strategy for your business.  A successful mobile strategy must have reaching your customers and your market as its central goal (and this doesn't necessarily require developing a native application). Pete will share several important elements to consider when developing a mobile strategy, including methods for connecting with a mobile audience, effective audience engagement, mobile platform differences and the impact this can have on market reach.
</p>

<p>
As applications continue to migrate toward the web, mobile devices are becoming inextricably linked with our everyday lives. According to The Mobile Internet Report released by Morgan Stanley, within five years, more users will connect to the web via mobile devices than desktop computers.
</p>

<p>
Mr. Morano has been a featured speaker for the Knapp Entrepreneurship Center’s Lecture Series at the Illinois Institute of Technology in Chicago. He is a graduate of DePaul University with a B.S. degree and an M.A. degree in economics.
</p>]]></description> 
					<pubDate>Mon, 06 Jun 2011 22:12:48 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/6/6/peter-morano-to-present-at-american-press-institute-in-washington-dc/</guid>
				</item>
			
				<item>
					<title>Recap: Cross-Platform Mobile Development at the Mobile Visionary Roundtable </title> 
					<link>http://keylimetie.com/blog/2011/6/6/recap-cross-platform-mobile-development-at-the-mobile-visionary-roundtable/</link> 
					<description><![CDATA[<div style="width: 200px; " class="BlogImageRight">
<img alt="Chris Grove" src="/Common/Images/Custom/blog/blog-grove-200.jpg" />
Chris Grove, CTO
</div>
<p>
KeyLimeTie CTO Chris Grove served as a panelist this past month at the Mobile Visionary Roundtable for the <a href="http://illinoistech.org" target="new">Illinois Technology Association</a>.  The roundtable focused on "cross-platform" app development, or developing apps for multiple operating systems including iPhone, Android, Windows, BlackBerry and others.
</p>
<p>
In today's mobile ecosystem, developers have the option of developiong either "natively," (in the specific development environment and language for the corresponding poatform), or using a cross-platform development environment where the app is written in a single codebase and compiled for each target operating system.  Both have their advantages, and the choice comes down to how suited the type of app being developed is for each.  Cross-platform environments are best suited for simple apps and apps that have an entirely customized user interface and do not rely on the phone's built-in user interface components.  Conversely, apps that use deeper features of the phones/OSes might require coding in the native environment.
</p>
<p>
Another possibility when considering developing for cross-platform use is to create a native app or a mobile website.  This decision comes down to use case.  It's worth noting that native apps are six times more popular on the iPhone than mobile websites, but less popular on tablets, <a href="http://www.readwriteweb.com/mobile/2011/05/Apps-6-times-more-popular-than-web-on-phones-less-popular-on-tablets.php" target="new">according to this ReadWriteWeb article</a>.
</p>
<p>
The bottom line here is that mobile sites have different use cases than native apps.  Apps are stronger when it's necessary to use native features of the phone (such as the camera, location services, accelerometer, or light), where websites shine when it's more important that the user find the information they need quickly and efficiently.
</p>
<p>
Cross-Platform applications have inherent risks.  First and foremost, by nature the developer becomes dependent on the vendor that created the specific cross-platform Integrated Development Environment (IDE).  With iPhone developers already undertaking risk of an app tied to Apple's ever-changing rules and control over the App Store, for some, adding risk to a new vendor in a fast-moving marketplace constitutes unnecessarily high risk.  Roundtable participants drew parallels between cross-platform app development today and the choice to develop in Java vs. HTML/JavaScript on the web in the late 1990s.  At the time, companies poured resources into the cross-platform environments of the day, while as the web evolved, only a couple survived.  Before investing in a cross-platform envirionment, it's important to evaluate where the vendor is likely to be three to five years out.
</p>
<p>
Finally, with cross-platform development, there's always the added cost of additional project management.  "The more platforms an app will support," adds Grove, "the more groundwork you have to lay, and the more emphasis you have to put on quality assurance."  Each additional platform adds a level of complexity; user interfaces are different, some devices have physical buttons where others have touch screens, and some have standard navigation elements.
</p>
<h4>Interested in your own mobile app?</h4>
<p>
If you are interested in developing an app, or extending an app you already have to multiple platforms to reach a wider range of users, contact KeyLimeTie at 630.598.9000 or <a href="mailto:sales@keylimetie.com">sales@keylimetie.com</a>.
</p>
]]></description> 
					<pubDate>Mon, 06 Jun 2011 16:31:21 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/6/6/recap-cross-platform-mobile-development-at-the-mobile-visionary-roundtable/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Sponsors Microsoft Web Camps</title> 
					<link>http://keylimetie.com/blog/2011/5/31/keylimetie-sponsors-microsoft-web-camps/</link> 
					<description><![CDATA[<div style="width: 300px; " class="BlogImageRight">
<img alt="Chris Grove" src="/Common/Images/Custom/blog/blog-webcamps.png" />
Microsoft Web Camp Hackathon winners holding prize check from KeyLimeTie
</div>
<p>
KeyLimeTie sponsored the <a href="http://www.webcamps.ms/" target="new">Microsoft Web Camp</a> for Chicago on May 26-27, hosted by Developer Evangelists Clark Sell and Brandon Satrom and drew over 300 attendees.  The event is a part of a national series designed to allow people to learn to build websites using ASP.NET MVC, WebMatrix, OData and other Microsoft technologies.
</p>
<p>
The first day of the Web Camp featured all-day sessions covering MVC 3.0, WebMatrix, jQuery, and HTML5.  The second day featured hands-on sessions and a 24-hour hackathon sponsored in part by KeyLimeTie.  Five teams survived the intense, 24-hour hackathon and presented to win their share of $2,500 in prizes that came from sponsors KeyLimeTie, Telerik, and Hackatopia.
</p>
<p>
For more information on future Microsoft Web Camps, <a href="http://www.webcamps.ms/" target="new">visit the Web Camps</a> site.
</p>
]]></description> 
					<pubDate>Tue, 31 May 2011 22:24:40 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/5/31/keylimetie-sponsors-microsoft-web-camps/</guid>
				</item>
			
				<item>
					<title>Twisted Maestro: Designing My First iPhone Game</title> 
					<link>http://keylimetie.com/blog/2011/5/17/twisted-maestro-designing-my-first-iphone-game/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<img alt="" src="/Common/Images/Custom/blog/blog-twisted-1-300.png" />
</div>
<p>
As a Senior Software Developer at KeyLimeTie, my day-to-day work requires me to focus on some very technical issues. A typical day may include creating a REST web service, optimizing software for thread-safety and performance, or even critiquing open-source frameworks. Although these technical challenges are satisfying, I never really need to tap into my right-brain skills which include extensive graphic arts and music experience.
</p>
<p>
In my free time I enjoy merging these technical and artistic sides and my latest project is the iPhone game I’ve branded as "<a href="http://twistedmaestro.com">Twisted Maestro</a>." This easy to learn game presents a player with a piano-like device used for testing finger dexterity and visual acuity.
</p>
<h4>Gameplay Approach</h4>
<p>
When deciding how to model the gameplay of Twisted Maestro, I first had to acknowledge that I don’t fall into the target demographic of many of today’s popular games. I frequented video arcades during the early 80’s, but over time I’ve very much drifted away from being a gamer. I evaluated recent games and found those which require unusual dexterity and movements were not very satisfying for me. So I consciously decided to take the Zen approach of "Beginner’s Mind" and disregard any presuppositions I may have about the latest gaming trends. I wanted to make a game that was attractive for its simplicity, one that was visually stunning and was appealing for its difficulty and physical challenge.
</p>
<div class="BlogImageRight" style="width: 300px;">
<img src="/Common/Images/Custom/blog/blog-twisted-wireframes-300.png" alt="Twisted Maestro early concept wireframes." />
Twisted Maestro early concept wireframes.
</div>
<h4>Design Strategies</h4>
<p>
Typically, the UX and navigation patterns of handheld games don’t follow the same guidelines as a professional business app would, designers take liberties to do whatever they can to create unique interfaces. Contrary to this trend, I wanted to follow the Apple Human Interface Guidelines (HIG) as much as I could without sacrificing creative design. For example, since the upper left corner is the sacred location for the Back button of navigation, this is where I placed the Audition button which leads back towards the keyboard home screen for performing an audition.
</p>
<p>
Another aspect I thought to be important was to target the physical needs of as many people as I could. When performing an audition on Twisted Maestro, knowing the amount of time remaining is important to get the best performance. Recognizing that the majority of the population is right-handed, I placed the time indicator where it would be least obstructed for viewing by a right-handed player. A physical limitation I also wanted to address was that of color-blindness. Original prototypes arbitrarily used green and red for gameplay indicators, but I later changed these in order to respect players with red-green color-blindness, the most common case, and give them a better experience.
</p>
<div class="BlogImageLeft" style="width: 300px;">
<img alt="" src="/Common/Images/Custom/blog/blog-twisted-2-300.png" />
Realistic-looking, oversized keyboard.
</div>
<p>
I wanted the overall graphic design of the game to be realistic and seem like you could actually be holding the auditioning device. I tested different sizes for the buttons and found that using a larger button gave the perception of a larger, more realistic device. Also contributing toward this realism are very high-resolution graphics, textures with intentionally aged effects, as well as keyboard audio recorded in a professional studio.
</p>
<h4>Gameplay Tuning</h4>
<div class="BlogImageRight" style="width: 300px;">
<img alt="" src="/Common/Images/Custom/blog/blog-twisted-3-300.png" />
</div>
<p>
The difficulty of each level and the scoring algorithm were not easy to determine and took many iterations to get correct. In order to find proper values, I gained feedback from a wide array of testers ranging from preschoolers to teenagers to senior citizens. I needed the game to be rewarding for younger and less nimble players, but also be appropriately difficult for the more advanced gamers. I find the ultimate compliment to be when a player wants to play the game “just one more time”.
</p>
<h4>Conclusion</h4>
<p>
Creating the Twisted Maestro game proved to be very challenging in many ways. I spent most of my development time in two areas - fine-tuning the gameplay and scoring  algorithms, and refining graphics to give the perception of realism. The final game has been getting great reviews worldwide and I owe its success to the many testers who contributed their honest feedback during development iterations.
</p>
<p>I enjoy my role here at KeyLimeTie and I certainly don’t strive to be a professional game developer, but this personal experience has been extremely rewarding and I’m anxious to leverage what I've learned for a KeyLimeTie customer project.
</p>
<div class="BlogImageRight" style="width: 200px;">
<a target="new" href="http://bit.ly/jvC7ye"><img alt="" src="/Common/Images/Custom/blog/blog-icon-appstore.png" /></a>
</div>
<h4>Download Twisted Maestro on the App Store</h4>
<p>
Twisted Maestro is compatible with iPhone, iTouch, and iPad
Visit <a target="new" href="http://twistedmaestro.com">www.twistedmaestro.com</a> or download from the <a target="new" href="http://bit.ly/jvC7ye">App Store</a>.
</p>
<h4>Interested in Your Own Mobile App?</h4>
<p>
If you are interested in putting the skills of developers like Patrick to use developing a mobile app for your company, please contact KeyLimeTie at 630.598.9000 or <a href="mailto:sales@keylimetie.com">sales@keylimetie.com</a>.  Follow us on Twitter at @<a href="http://twitter.com/keylimetie">KeyLimeTie</a>.
</p>
<p></p>
]]></description> 
					<pubDate>Tue, 17 May 2011 17:48:12 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/5/17/twisted-maestro-designing-my-first-iphone-game/</guid>
				</item>
			
				<item>
					<title>Chris Grove at Mobile Visionary Roundtable on Cross-Platform App Development</title> 
					<link>http://keylimetie.com/blog/2011/5/11/chris-grove-at-mobile-visionary-roundtable-on-cross-platform-app-development/</link> 
					<description><![CDATA[<div style="width: 200px;" class="BlogImageRight">
<img alt="Chris Grove" src="/Common/Images/Custom/blog/blog-grove-200.jpg" />
Chris Grove, CTO
</div>

<p>
KeyLimeTie's Chris Grove will serve on the panel for the Illinois Technology Association's Mobile Visionary Roundtable on Wednesday, May 18.  The panel, moderated by Mobile Visionary Roundtable chair Alex Bratton and also featuring Ron Franczyk of Red Foundry, will cover cross-platform app development.  Come and hear these experts discuss cross-platform development tools, native application development, and technical design concerns of building a cross-platform application.
</p>

<p>
<b>Date:</b> Wednesday, May 18, 2011<br />
<b>Time:</b> 8:30am – 10:30am<br />
<b>Location:</b> ITA/TechNexus – Conference Room A/B, 200 South Wacker 15th Floor, Chicago, IL 60606<br />
<b>RSVP Here:</b> <a href="http://www.illinoistech.org/event.aspx/3409" target="new">http://www.illinoistech.org/event.aspx/3409</a>
</p>
]]></description> 
					<pubDate>Wed, 11 May 2011 22:23:17 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/5/11/chris-grove-at-mobile-visionary-roundtable-on-cross-platform-app-development/</guid>
				</item>
			
				<item>
					<title>Google&amp;quot;s +1 Experiment Adds Social Recommendations to Search</title> 
					<link>http://keylimetie.com/blog/2011/4/29/googles-1-experiment-adds-social-recommendations-to-search/</link> 
					<description><![CDATA[<div style="width: 200px;" class="BlogImageRight">
<img alt="Google Now Goes to +1" src="/Common/Images/Custom/blog/blog-google-11.png" />
Google now goes to +1.
</div>

<p>
Three weeks ago, <a href="http://googleblog.blogspot.com/2011/03/1s-right-recommendations-right-when-you.html" target="new">Google announced the +1 button</a>, an experiment that they hope incorporates social recommendations with search results.  Since then, a portion of Google users have begun to see a +1 button next to their search results when logged into their Google accounts.  If you don’t see it immediately, <a href="http://www.google.com/experimental/" target="new">visit the Search Experiments section of Google Labs</a> and enable this option.  

<p>
The +1 button allows you to inform other people in your network about a website you like by simply clicking a button.  It works a lot like Facebook’s “Like Button,” but it does a little more.  The +1 Button also influences how these sites show up in others’ search results.  Plus, users can always undo a +1 if they didn’t mean to flag the site.
</p>

<div style="width: 566px; margin-bottom: 20px;" class="BlogImageRight">
<img alt="Google +1 Button in Search Results" src="/Common/Images/Custom/blog/plusone-1-566.png" />
The +1 button appears to the right of the search result title.  Here you<br />can see the +1 icon as it appears after you recommend a link.
</div>

<p>
The +1 button is still in an experimental stage.  If you don’t see it on Google automatically, sign in to your Google account, visit <a href="http://www.google.com/experimental/" target="new">Google Search Experiments</a>.  Select the +1 button as your Google experiment.
</p>

<p>
Now visit Google and search for something.  Click the +1 button, and you will see a confirmation screen (like the one below), which requires you to opt into the service. 
</p>

<h4>View Your +1’s</h4>

<p>
After you have joined, you will be able to control all the pages you +1’d on a “+1’s” tab from within your Google profile.  You do have the option to make this tab public through your Google profile, or keep this information private (default).
</p>

<div style="width: 568px; " class="BlogImageLeft">
<img alt="Google lists your +1's in an archive, so you can see what you've recommended." src="/Common/Images/Custom/blog/plusone-2-568.png" />
</div>

<h4>Combining Search Results with Recommendations</h4>

<p>
Google stated in their announcement, “The beauty of +1’s is their relevance—you get the right recommendations (because they come from people who matter to you), at the right time (when you are actually looking for information about that topic) and in the right format (your search results).”   
Google understands people use recommendations and reviews as part of their decision making on a daily basis; reviewing restaurants, purchasing TVs, cars, computers, cell phones, etc.   
</p>

<h4>Social Networking</h4>

<div style="width: 209px; " class="BlogImageRight">
<img alt="Google currently highlights who in your social network has previously tweeted a link that appears in a search result." src="/Common/Images/Custom/blog/plusone-3-209.png" />
Google currently highlights who in your social network has previously tweeted a link that appears in a search result.
</div>

<p>
Google has been experimenting with bringing social media into search for the last couple years; allowing users to merge Google services (Buzz and Chat) with third party sites, like Twitter and Facebook.
</p>

<p>
Google currently displays results from third-party social media sites; for example, if one of your Twitter friends has tweeted a link, that is shown in search results. 
</p>

<p>
For the time being, only users you are connected with through Google services will be the only ones that can influence the +1 matches.  These Google based services include:
</p>

<ul>
	<li>Your Gmail chat list</li>
	<li>Your 'My Contacts' group in Google Contacts</li>
	<li>People you follow in Google Reader or Google Buzz</li>
</ul>
<br />

<h4>Whats Next?</h4>

<p>
Google has plans to allow publishers to place +1 buttons on web pages, similar to Facebook’s Like button and Twitter’s Tweet button.  To be notified about when this button is available, <a href="https://services.google.com/fb/forms/plusonesignup/" target="new">sign up here</a>.
</p>

<p>
Once proven and optimized, the +1 button could be a great addition to search and a major “plus” when trying to incorporate social media into the bigger SEO picture, if done correctly.  One of the biggest obstacles for Google is going to be developing a large user base that users adapt to and use.  This is where Facebook’s Like button has a distinct advantage; they already have a massive network of users.  Will those users want to sign up for another social account that they have to create and manage?  It’s definitely going to be interesting to see how this plays out.
</p>]]></description> 
					<pubDate>Fri, 29 Apr 2011 16:03:05 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/4/29/googles-1-experiment-adds-social-recommendations-to-search/</guid>
				</item>
			
				<item>
					<title>Move Over Like Button, Facebook Releases the Send Button</title> 
					<link>http://keylimetie.com/blog/2011/4/28/move-over-like-button-facebook-releases-the-send-button/</link> 
					<description><![CDATA[<div style="width: 360px; " class="BlogImageRight">
<img alt="Facebook Send Button" src="/Common/Images/Custom/blog/facebook-send-360.png" />
</div>

<p>
Last week, <a href="http://developers.facebook.com/blog/post/494/" target="new">Facebook announced their new Send Button</a>.  Similar to the Like button seen on most up-to-date websites, the Send button connects the page you are currently visiting to your social network on Facebook.  This helps make the web more 'social' for users, and it also further secures Facebook's dominance as the most popular US website and most widely used social network.
</p>

<p>
How does the Send Button work?  It appears on a website just like the Like button.  Instead of publishing a 'Like' to your news feed, the Send Button allows you to send any Facebook friend group a private message with a link to the current web page.  For website owners, the Send Button makes it much easier for visitors to share your content directly with the people who are most interested.
</p>

<p>
KeyLimeTie is integrating the Send button on applicable websites moving forward.  Can you think of ways your web visitors could benefit from this new feature?  If it's been a while since you have refreshed your website, and you're looking to take advantage of social sharing and social media to promote your offerings, give KeyLimeTie a call at 630.598.9016.
</p>]]></description> 
					<pubDate>Thu, 28 Apr 2011 17:29:48 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/4/28/move-over-like-button-facebook-releases-the-send-button/</guid>
				</item>
			
				<item>
					<title>Parts Town Nominated for ITA CityLIGHTS Awards</title> 
					<link>http://keylimetie.com/blog/2011/4/19/parts-town-nominated-for-ita-citylights-awards/</link> 
					<description><![CDATA[<p>
KeyLimeTie is thrilled to announce that client <a href="http://www.partstown.com" target="new">Parts Town</a> has been named a finalist for the Best Strategic Use of Technology category of the <a href="http://www.illinoistech.org/page.aspx/citylights" target="new">Illinois Technology Association CityLIGHTS Award</a>!
</p>
<p>
Voting is now open, so please <a href="http://svy.mk/gXTHFt" target="new">visit the CityLIGHTS awards voting</a> survey and cast your vote for Parts Town within the "Best Strategic Use of Technology" category before voting ends on April 29, 2011.  Winners will be determined based on a composite score of judges' rankings and community voting and will be announced at the ITA CityLIGHTS Awards Gala May 12.  We hope to see you there!
</p>
<h4>Why Parts Town?</h4>
<p>
In 2010, Parts Town was recognized by Crain’s Chicago Business as the 9th fastest growing company in the Chicago area.  Over the past five yeras, Parts Town has boasted a 953% growth rate, placing them near the top of the prestigious Crain’s Fast 50 list.  The company was also named to the Inc. 5000 list for the second year in a row, and were the #1 ranked restaurant parts distributor on the list and the 28th fastest growing Food and Beverage industry contender overall.
</p>
<h4>Ahead of the Pack with Mobile App</h4>
<p>
As the number one OEM restaurant equipment parts distributor, Parts Town is constantly looking ahead to find new ways to differentiate.  In 2010, they launched the industry's first ever mobile application, "<a href="http://partstown.com/app" target="new">Mobile Equipment Manuals</a>" available for iPhone and Android (<a href="http://bit.ly/erGttN" target="new">read the press release</a>).  The Mobile Equipment Manuals app allows restaurant technicians with iPhones and Android phones to find and download the manual associated with any one of thousands of equipment models while in the field.  This saves valuable time for the technician and the restaurant, helping them diagnose problems, identify parts, order replacements and make repairs more quickly.
</p>
<div style="width: 575px; " class="BlogImageRight">
<a href="http://www.partstown.com/app" target="new"><img alt="PartsTown iPhone App" src="/Common/Images/Custom/blog/blog-partstown.png" /></a>
</div>
<p>
Parts Town's website also features a robust e-commerce site that provides users with easy access to restaurant equipment parts, offering same-day shipping on all orders placed before 8PM EST.  They're truly committed to the success of their restaurant and repair technician customers, and seek to continuously innovate through use of technology.  This allows Parts Town to stand head-and-shoulders above competitors in an industry not known for being cutting edge.
</p>
<p>
KeyLimeTie believes Parts Town should be nominated for the Best Strategic Use of Technology award because they use technology to put their customers' needs first.  They are proactive and stay out in front of their industry, this in turn allows them to provide superior service while fueling their growth.
</p>
<h4>About the CityLIGHTS Awards</h4>
<p>
A panel of more than 40 judges representing the Who’s Who in Illinois technology reviewed nominations and selected the finalists for the Illinois Technology Association CityLIGHTS awards. Judges hail from major organizations including Microsoft, University of Chicago Booth School of Business, New World Ventures, and World Business Chicago, and newer entities including Technori, Viewpoints.com, Marchie Enterprises, Inc., SmartSignal and midVentures.   The list of past winners includes companies like The Point (now known as Groupon), GrubHub.com, NAVTEQ, Model Metrics, Smart Signal, Mayor Richard M. Daley, and Jack Noonan.
</p>
]]></description> 
					<pubDate>Tue, 19 Apr 2011 16:29:09 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/4/19/parts-town-nominated-for-ita-citylights-awards/</guid>
				</item>
			
				<item>
					<title>SXSW Report: Radical Openness: Growing TED by Giving It Away</title> 
					<link>http://keylimetie.com/blog/2011/4/4/sxsw-report-radical-openness-growing-ted-by-giving-it-away/</link> 
					<description><![CDATA[<p>
TED provides a forum to disseminate 'Ideas worth spreading.'  In recent years, TED has grown leaps and bounds in popularity thanks to the organization making 'TED Talks'&mdash;attention-grabbing and inspiring 18-minute videos by their renowned list of speakers&mdash;freely available on the web for anyone around the world to view.
</p>

<p>
June Cohen, executive producer at TED, gave a talk at SxSW entitled <a href="http://schedule.sxsw.com/events/event_IAP000026" target="new">Radical Openness: Growing TED By Giving it Away</a>.  She outlined the counter-intuitive steps that TED has taken over the past several years to open up the elite, private conference to the world.  While conventional wisdom told them to treat the TED brand like a luxury and keep it scarce, they were driven by their singular goal of spreading ideas.  Instead of devaluing the brand, opening TED content yielded some surprising results.
</p>

<iframe title="YouTube video player" width="560" height="349" src="http://www.youtube.com/embed/h3vZw08oP50" frameborder="0" allowfullscreen></iframe>

<p style="margin-top: 20px;">
Cohen discussed three distinct phases of opening up TED: making TED Talks available freely online, allowing independently produced TEDx Events, and the TED Open Translation Project.  Throughout the talk, Cohen emphasized TED's singular goal of spreading ideas.  They used this goal to guide their decision-making, especially when ideas were controversial and it was easy to back down.
</p>

<p>
One key motivator behind releasing TED Talks online was to relieve some of the demand for the conference itself.  However, the very next year TED sold out quicker than it had before (one week) even though the registration fee increased by 50% to $6,000, and had a 1,000 person waiting list.  Today, the 900 TED Talks have been viewed over 400,000,000 times around the world.
</p>

<h4>Content Accessible on Any Platform</h4>

<p>
TED set out to reach people everywhere with online TED Talks.  They factored in geography and changing media consumption habits, which change quickly and vary based on the time of day.  In this way, they didn’t think about releasing “web video," but rather video content that is accessible via any platform (computer, mobile, tablet, set-top box, etc.) and adapt as habits change.  They embraced an open model and released the talks under a Creative Commons license, allowing people to do anything they wanted to (non-commercially) with the video.
</p>

<h4>Designing an Emotional Connection</h4>

<p>
TED Talks aim to evoke contagious emotions, elevate the viewer and make them feel lifted above themselves through human storytelling.  The videos begin with a compelling attention-grabber, foregoing speaker intros from an emcee, so they can grab people within the first five seconds.  These fundamentals dictate how the content is shot, edited, and delivered.  Most viewers watch TED Talks via a mobile phone, so speaker close-ups and tight edits are a must as they help create the emotional link between the viewer and the speaker.
</p>

<h4>An Accidental Global Team</h4>

<p>
Two years ago, TED created the TEDx events as a way for independent organizers to host their own TED events.  These events adhered to strict branding, content, and operations rules including the stipulation that TEDx organizers could not make a profit; this ensured that the goal behind each TEDx was consistent with TED’s overall goal of spreading ideas.
</p>

<p>
Though they launched thinking there would be a couple dozen TEDx events, in the first two years people around the world have hosted over 1500 events in 96 countries and in 35 languages, ranging from the world-class TEDxAmsterdam to TEDxAmazonia in the rainforest and <a href="http://blog.ted.com/2009/08/19/tedxkibera/" target="new">TEDxKibera in the largest squatter city in Africa</a>.  TEDx transformed a global audience into a global team, creating volunteers who have become truly invested in the same mission as the parent organization.  As each organizer has their own personal mission, they aren’t only giving but also getting something back in return.
</p>

<h4>TED openAPI: The Next Open Frontier</h4>

<p>
As Cohen outlined the progression of open projects at TED and how the impact of each has surprised them, <a href="http://blog.ted.com/2011/03/13/announced-at-sxsw-ted-to-open-api/" target="new">she then announced the TED open API</a> as the next wave of openness.  The API will focus first on giving app builders access to TED’s video content library and metadata (topic, ratings, speaker, date, etc.), allowing developers with great ideas the ability to re-package and re-distribute TED content in new and engaging ways.  Why open up the API?  According to Cohen, every time TED has opened their community, they’ve been 'utterly moved, awed, inspired, delighted, and pushed further.'  They’re waiting to be surprised by developers, and believe the best ideas are the ones they haven’t thought of yet.
</p>

<h4>What makes openness work?</h4>

<p>
The steps toward openness outlined in this talk are counter-intuitive, especially for an organization with roots as a premium, exclusive brand.  Openness works for TED because people generally desire to be a part of something larger than themselves.  Cohen insisted that openness can work for other organizations, and to do so, she gave a few steps to help enable that openness:
</p>

<ul>
	<li>Draw on a passionate user base (it doesn’t have to be large)</li>
	<li>Put forward a clear goal that inspires that base</li>
	<li>Provide clear guidelines, with rewards and consequences for desirable and undesirable actions</li>
	<li>Allow your community to police itself through karma, moderators, and an open feedback loop; the community is the best enforcer of any rules</li>
<li>Make your contributors, speakers, developers, and others into rockstars by  recognizing them any way possible</li>
</ul>

<p>
Cohen concluded that openness isn’t easy, that it takes time and goes against human instinct to stay closed and protect things one is close to.  It’s difficult to fight against this tendency in an organization, and these battles weren’t foreign to TED.  To make openness a success, one must go beyond the fear of pushback and get out of one’s comfort zone.
</p>

<h4>Like this article?</h4>

<p>
Let us know in the comments, and please share it using the buttons below!
</p>]]></description> 
					<pubDate>Mon, 04 Apr 2011 16:20:44 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/4/4/sxsw-report-radical-openness-growing-ted-by-giving-it-away/</guid>
				</item>
			
				<item>
					<title>SxSW Interactive 2011 Attendee Recap and Discussion April 6th at Illinois Technology Association</title> 
					<link>http://keylimetie.com/blog/2011/3/29/sxsw-interactive-2011-recap-discussion-april-6th-at-illinois-technology-association/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px; margin-bottom: 10px;">
<img alt="" src="/Common/Images/Custom/blog/blog-sxsw-stairs.png" /></a>
</div>

<p>
SxSW Interactive has received more than its fair share of press coverage in the past several weeks.  The blowout conference is billed as the "hip" place to be for new media companies, entrepreneurs, designers, developers, UX architects and social media mavens.
</p>

<p>
Please join KeyLimeTie on Wednesday, April 6th from 3:00-5:00pm at the Illinois Technology Association, 200 S. Wacker Dr., 15th Floor for a <a href="http://illinoistech.org/event.aspx/4291" target="new">SxSW Interactive 2011 Attendee Recap and Discussion</a> by area attendees of SxSW Interactive in Austin, TX.  To attend, please <a href="http://illinoistech.org/event.aspx/4291" target="new">RSVP on the ITA website</a>.
</p>

<h4>KeyLimeTie Presents:<br />SxSW Interactive 2011 Attendee Recap and Discussion</h4>

<p>
Sponsored by Illinois Technology Association
</p>

<p>
<b>Synopsis:</b> <br />
If you attended SxSW, this is your chance to meet with fellow attendees, compare notes, and reinforce what you learned.  If you did not attend, come hear firsthand accounts from people who went.  Share your opinions and hear others thoughts.  Is SxSW worth attending next year?  Is it 'over,' or just evolving?  What are the key takeaways?  How are Chicago companies taking what they have learned and applying it to their businesses?  This session will feature both a moderated panel and an open discussion.
</p>

<p>
<b>Panelists:</b> <br />
Tim Courtney, Director, Marketing & Brand Strategy, <a href="http://keylimetie.com" target="new">KeyLimeTie</a> (@<a href="http://twitter.com/timcourtney" target="new">timcourtney</a>)<br />
Barbara Maldonado, Social Media Strategist, <a href="http://legacymp.com" target="new">Legacy Marketing Partners</a> (@<a href="http://twitter.com/bmaldonado" target="new">bmaldonado</a>)<br />
Brad Flora, CEO, <a href="http://nowspots.com" target="new">NowSpots</a> & <a href="http://windycitizen.com" target="new">WindyCitizen</a> (@<a href="http://twitter.com/bradflora" target="new">bradflora</a>)<br />
Scott Robbin, Code & Development, <a href="http://weightshift.com" target="new">Weightshift</a> (@<a href="http://twitter.com/scottrobbin" target="new">srobbin</a>)
</p>

<p>
<a href="http://illinoistech.org/event.aspx/4291" target="new">Click here to RSVP</a>
</p>

<p>
Special thanks to our hosting sponsors, the <a href="http://illinoistech.org" target="new">Illinois Technology Association</a> and our participating panelists.
</p>]]></description> 
					<pubDate>Tue, 29 Mar 2011 20:36:34 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/3/29/sxsw-interactive-2011-recap-discussion-april-6th-at-illinois-technology-association/</guid>
				</item>
			
				<item>
					<title>SXSW Report: User Experience and Cross Platform App Development </title> 
					<link>http://keylimetie.com/blog/2011/3/18/sxsw-report-user-experience-cross-platform-app-development/</link> 
					<description><![CDATA[<p>
At SXSW Interactive, Carlo Longino (@<a href="http://twitter.com/caaarlo" target="new">caaarlo</a>), Community Manager for the <a href="http://www.wipconnector.com/" target="new">Wireless Industry Partnership (WIP)</a>  talked about designing the user experience across platforms.  You can <a href="http://www.slideshare.net/caaaarlo/sxsw-2011-user-experience-and-crossplatform-apps" target="new">View Carlo Longino's slides on Slideshare</a>.
</p>

<p>
'Cross-platform' today means more than the difference between an iPhone and an Android phone.  There are many device types, ranging from desktops, laptops, smartphones, tablets, TVs/set tops, GPS units to cars.  True cross-platform UX means accounting for all of the various ways users will access your content.  Longino said, 'There are two choices; ignore multiple devices (which many are doing), or you can account for them.'  It isn't simply about adapting content to specific screen sizes.
</p>

<h4>Devices, Users, and Context</h4>

<p>
Longino smartly broke down the topic into three realms of understanding; devices, users and context.  User behavior varies between devices thanks to a plethora of factors including screen size, weight, input options, and wireless options.  Users will behave differently with a heavy device that they have to lug around than they would with a smartphone or a tablet that are relatively easy to carry and hold.  Developers should seek to understand the users themselves.  Who are they?  Do they have certain characteristics or tendencies?  Will those attributes affect how they want to use your app?
</p>

<div class="BlogImageCenter" style="width: 580px;">
<img src="/Common/Images/Custom/blog/blog-contextualapps.jpg" alt="User Experience persists across contexts." />
</div>

<div style="width: 580px; margin: 0 0 20px 0; text-shadow: none;" class="QuoteBlock Right">
Device + User + Situation = Context<br style="text-shadow: none;">
</div>

<p>
Longino defines context as 'device + user + situation.'  When designing for a particular context, ask three questions; who is using the device/service, what are they doing, and how are they doing it?  For example, when TED released its talks to the web, they considered the various ways people watched video on the web based on time of day, and changed their thinking from delivering web video to delivering engaging video content in the medium of the user's choice.
</p>

<h4>Architecting for Multiple Contexts</h4>

<p>
Longino focused strictly on UX, but at KeyLimeTie we understand that cross-platform considerations extend into application architecture.  For one large client, KeyLimeTie CTO Chris Grove architected a full web service and REST API with the business logic living on the server.  The website, which became the first application to use the service, existed as a thin client that called the API.  This works for many types of applications, though it's worth noting that it is difficult to implement on apps like interactive games that require a significant amount of processing on the device.
</p>

<p>
Building an API first offers developers the most flexibility for designing and developing cross-platform apps that serve a variety of contexts.  It becomes easy to implement new apps&mdash;even for device types that don't yet exist.
</p>

<h4>Summary</h4>

<p>
Consider that multiple devices, user types, and situations exist.  Be aware of the various contexts through which people will use your app.  Remember that users are real people with real needs, behavioral predispositions and stories, so you can design apps that maximize utility for them.  Once you move to development, architect your application so you can develop interfaces for multiple devices efficiently; consider building an API and web service so the business logic can run server-side and create thin clients for the web and various mobile devices.
</p>

<p>
If you are looking to build a mobile app or cross-platform experience, call KeyLimeTie at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>]]></description> 
					<pubDate>Fri, 18 Mar 2011 22:38:40 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/3/18/sxsw-report-user-experience-cross-platform-app-development/</guid>
				</item>
			
				<item>
					<title>SXSW Report: Federating the Social Web Panel</title> 
					<link>http://keylimetie.com/blog/2011/3/17/sxsw-report-federating-the-social-web-panel/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px; ">
<a target="new" href="http://schedule.sxsw.com/events/event_IAP5513" target="new"><img alt="" src="/Common/Images/Custom/blog/blog-sxsw-fsw.jpg" /></a>
Panelists at the Federating the Social Web panel at SxSW 2011
</div>

<p>
Last weekend at SxSW, I attended the panel entitled <a href="http://schedule.sxsw.com/events/event_IAP5513" target="new">Federating the Social Web</a>, moderated by Evan Prodromou (<a href="http://status.net/" target="new">StatusNet</a>) and featuring Monica Wilkinson (<a href="http://www.socialcast.com/" target="new">SocialCast</a>), Kevin Marks (<a href="http://microformats.org" target="new">MicroFormats.org</a>), and Dan Peterson (<a href="http://www.opensocial.org/" target="new">Open Social</a>, Google).  They held a robust discussion about the standards and practices that are enabling interoperability between disparate social websites.
</p>

<p>
The fundamental definition of a “federated" social web is that there is no single source of anyone’s social data, rather sites and services interoperate through standard protocols.  This removes development barriers and allows for easy syndication of social data.
</p>

<h4>It’s About Creating a Fluid Experience</h4>

<p>
Why work to enable interoperability across the social web?  Wilkinson says it’s about creating a fluid experience, a continuum that allows you to bring your social network with you as you move throughout the web and from app to app.  The Facebook platform already does this well, as we’ve seen Facebook capabilities become embeddable into other sites (i.e. the Like button, Facebook Comments, etc.).  In the enterprise, <a href="http://activitystrea.ms" target="new">ActivityStrea.ms</a> allows business app developers to shatter the clunky iFrame and create meaningful workflows between apps.
</p>

<p>
Peterson stated up front that he does not “work on social for social’s sake," instead his desire is to enable work with the technologies, and within that lies the real staying power.  Looking back, email was developed within the academic, military, and enterprise communities and then crossed over into everyday life.  The social web is taking the exact opposite approach; first the social web established itself among consumers, and now social technologies are transitioning to the workplace.
</p>

<p>
Kevin Marks sees social as an “integration point between a lot of different systems."  That is to say, the common denominator between business apps is people and the tasks they perform.  Open social is about making previously incompatible islands interoperable.  It covers both technology interoperability and policy interoperability.  Software developers, he asserts, are better at the former than the latter.  The real opportunity lies in permitting Company A to exchange social and work data with Company B, and enabling granular permissions to be determined on a per-transaction basis.
</p>

<h4>Federating: Top-Down or Bottom-up?</h4>

<p>
Some groups tackling this topic are attempting all-in-one solutions, while others favor more incremental and organic approaches.  Top-down approaches that dictate standards to others have been known to experience slower adoption.
</p>

<p>
Microformats add context to data that can be intelligently read by other services, providing a more incremental approach.  For example, an <a href="http://microformats.org/wiki/hcard" target="new">hcard</a> denotes a person or place, and a <a href="http://microformats.org/wiki/rel-me" target="new">rel="me"</a> attribute indicates that the target URL is another page about the same person, and so forth.
</p>

<p>
<a href="http://code.google.com/p/pubsubhubbub/" target="new">PubSubHubbub</a> further enables bottom-up federation by making it easier to subscribe to RSS and Atom feeds, still a standard for syndicating data across the web.  PubSubHubbub is an open protocol that uses web hooks and semantics around the exchange of the subscription to lower the requirements for pulling a lot of content from different places.  Instead of writing code that polls all of the various feeds to which you are subscribed, it allows your site to become a passive listener, lowering the effort to develop a federated social platform.  “If you are using Pubstubhubub enabled activity streams," Prodromou said, “you are at a good base level to participate in the social web as it is evolving."
</p>

<h4>How to Start: Focus on Your Core Business</h4>

<p>
As you take steps to integrate enterprise or social activity, the overwhelming takeaway from the panel was to focus on your experience over the various technologies.  It is imperative to know why you want to federate.  What behaviors do you want to enable?  “Federating" your social activity is not simply enabling one massive protocol; there is no single stack to implement and then you are done.  For this reason, build your experience and your workflows first, and look for protocols that enable the outcomes you are looking to achieve.
</p>

<p>
For more information on federated social websites, check out the following posts and resources:
</p>

<ul>
	<li>Evan Prodromou’s post: <a href="http://status.net/2010/07/13/what-is-the-federated-social-web" target="new">What is the federated social web?</a></li>
	<li>And his follow-up: <a href="http://status.net/2010/07/14/features-of-a-federated-social-web" target="new">Features of a federated social web</a></li>
	<li>Microformats.org article on <a href="http://microformats.org/wiki/process" target="new">how to develop a new microformat</a></li>
<li>Google Code specification on <a href="http://code.google.com/web/ajaxcrawling/docs/specification.html" target="new">Making AJAX applications crawlable</a></li>
</ul>

<p>
If you are looking to build a website or enterprise application that is socially-enabled, call KeyLimeTie at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>]]></description> 
					<pubDate>Thu, 17 Mar 2011 18:19:36 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/3/17/sxsw-report-federating-the-social-web-panel/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie at SXSW Interactive 2011</title> 
					<link>http://keylimetie.com/blog/2011/3/10/keylimetie-at-sxsw-interactive-2011/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px; margin-bottom: 10px;">
<a target="new" href="http://www.keylimetie.com/blog/2010/3/15/sxsw-reach-customers-in-new-ways-via-the-ipad/"><img alt="" src="/Common/Images/Custom/blog/blog-sxsw-2010.jpg" /></a>
iPad Session from SxSW Interactive 2010
</div>

<p>
KeyLimeTie is attending <a href="http://sxsw.com" target="new">SxSW Interactive</a> for the second year in a row, to immerse ourselves in the latest technologies, meet with clients and partners, grow our business, and have a good time.  This year, we're particularly interested in learning the latest in mobile and tablet user experience, social media as the field matures, and game theory.
</p>

<h4>We'll be Live Tweeting</h4>

Yep, like everyone else, we'll do our best to live-tweet the sessions we attend.  If you're not attending SxSW and want a glimpse, <a href="http://twitter.com/keylimetie">follow @KeyLimeTie</a> this weekend for tidbits of what we're experiencing.
</p>

<h4>Who do we want to meet?</h4>

<p>
CEO Chris Pautsch and Director of Marketing Tim Courtney will be attending sessions and parties in full force, and we look forward to meeting you.  We especially want to meet you if you are an <b>advertising, marketing or interactive agency who needs amazing mobile and web app developers.</b>  We approach our client relationships as true partnerships (we're not just saying that, ask us for references) and love working with creatives.
</p>

<h4>Connect with us!</h4>

<p>
The absolute best way to reach us it to send us a tweet.  Follow @<a href="http://twitter.com/chrispautsch">ChrisPautsch</a> and @<a href="http://twitter.com/timcourtney">TimCourtney</a> and ping us to meet up.
</p>

<p>
See you at SxSW!
</p>]]></description> 
					<pubDate>Thu, 10 Mar 2011 23:39:57 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/3/10/keylimetie-at-sxsw-interactive-2011/</guid>
				</item>
			
				<item>
					<title>Support Nate Pautsch in fundraising for St. Baldrick&amp;quot;s (and make Chris shave his head)</title> 
					<link>http://keylimetie.com/blog/2011/3/8/support-nate-pautsch-fundraising-st-baldricks/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 200px; ">
<a target="new" href="http://www.stbaldricks.org/participants/NatePautsch"><img alt="" src="/Common/Images/Custom/blog/blog-nate-before.jpeg" /></a>
Nate before shaving his head for St. Baldrick's.
</div>
<p>
<a target="new" href="http://www.stbaldricks.org/participants/NatePautsch">My nephew Nate is shaving his head again this year for the St. Baldrick's event</a> at the Downers Grove High School on Friday, March 11.  He's been growing his hair out since August and now is raising money from family and friends to donate to cancer research.
</p>
<p>
When Nate's friend Mikayla was just 5 years old, she was diagnosed with a Wilms tumor, a form kidney cancer. During her treatment to overcome disease, she temporarily lost her hair, prompting Nate to volunteer his head for St. Baldrick's. This is the second time Nate is participating in this charitable event.
</p>
<h4>Make Chris shave his head, too!</h4>
<p>
Nate is just over halfway to his goal of raising $3,000; if you need some extra encouragement, Chris Pautsch, my brother and co-founder of KeyLimeTie, has agreed to shave his head if his son Nate reaches $3,000.  Click the
</p>
<p>
You can <a target="new" href="http://www.stbaldricks.org/participants/NatePautsch">donate online via Nate's St. Baldricks' Foundation page</a> or by calling 888.899.BALD.
</p>
]]></description> 
					<pubDate>Tue, 08 Mar 2011 20:29:45 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/3/8/support-nate-pautsch-fundraising-st-baldricks/</guid>
				</item>
			
				<item>
					<title>Naperville Running Company iPhone App featured on Naperville Community Television (NCTV) </title> 
					<link>http://keylimetie.com/blog/2011/2/7/naperville-running-company-iphone-app-featured-on-naperville-community-television-nctv/</link> 
					<description><![CDATA[<div style="width: 319px; " class="BlogImageRight">
<a href="http://www.nctv17.com/napervillenews17/article.php?id=689" target="new"><img alt="" src="/Common/Images/Custom/blog/blog-nrc-tv.png" /></a>
</div>
<p>
Kris Hartner of Naperville Running Company was interviewed by Naperville Community Television in a spot about mobile apps for retail.  The segment featured the store's iPhone app, built by KeyLimeTie.
</p>
<p>
Hartner describes how the app features an events calendar, links to register for an event, and has plans to add mobile shopping.  The app receives 20-30 downloads per week—an impressive number for a local store.
</p>
<p>
Watch the interview featuring <a href="http://www.nctv17.com/napervillenews17/article.php?id=689" target="new">Kris Hartner and the Naperville Running Company iPhone app by KeyLimeTie</a> on the Naperville Television 17 website.
</p>
<h4>Need an app for your company?</h4>
<p>
We're happy to discuss how you can use a mobile app to help boost your brand by providing users entertaining content and fun experiences.  Give us a call at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>
]]></description> 
					<pubDate>Mon, 07 Feb 2011 21:22:21 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/2/7/naperville-running-company-iphone-app-featured-on-naperville-community-television-nctv/</guid>
				</item>
			
				<item>
					<title>Reflections from UX4Good, a Designers&amp;quot; Hackathon to Solve Social Problems</title> 
					<link>http://keylimetie.com/blog/2011/2/2/reflections-from-ux4good-a-designers-hackathon-to-solve-social-problems/</link> 
					<description><![CDATA[<div style="width: 300px; " class="BlogImageRight">
<a href="http://www.flickr.com/photos/ux4good/5398103437/" target="new"><img src="/Common/Images/Custom/blog/blog-ux4good-loosetooth.png" /></a>
Graphic Facilitation of the UX4Good concept by <a href="http://www.loosetooth.com" target="new">Brandy Agerbeck</a>
</div>

<p>
Last weekend I had the privilege of participating in <a href="http://ux4good.com" target="new">UX4Good</a>.  <a href="http://www.keylimetie.com" target="new">KeyLimeTie</a> enthusiastically signed on as the Livestream Sponsor, and I worked with the social media team that produced the livestream and liveblogging.
</p>

<p>
UX4Good is self-described as a 'wildly ambitious effort to design systemic solutions for some of the most vexing social challenges.'  Produced by our agency partners <a href="http://www.manifestdigital.com" target="new">Manifest Digital</a>, the weekend brought together 40 top user experience designers and 10 gifted visual designers to participate in a weekend challenge to design solutions for five nonprofits who are tackling large-scale social problems; <a href="http://www.streetwise.org/" target="new">Streetwise</a>, <a href="http://www.ceasefirechicago.org/" target="new">CeaseFire Illinois</a>, <a href="http://www.thethirdteacher.com/" target="new">Third Teacher</a>, <a href="www.adler.edu" target="new">The Adler School of Professional Psychology</a> and the <a href="http://globallives.org/en/" target="new">Global Lives Project</a>.
</p>

<h4>A Hackathon for UX Designers</h4>

<p>
This idea appeals to me personally because of my history with the 'hackathon' concept; hackathons are generally short (24-48 hour) all-night developer contests pitting people and teams against each other to design and code the most innovative app in a short period of time.
</p>

<p>
KeyLimeTie has taken the 'hackathon' concept into clients with considerable success, positively affecting innovation culture in large organizations and giving employees greater voice and visibility (if this idea appeals to you, we should talk).  In the community, KeyLimeTie CIO Peter Morano produces the hackathon at <a href="http://www.socialdevcampchicago.com" target="new">SocialDevCamp Chicago</a> and consistently supports other peoples' hackathons, which over the past couple years has fostered a growing hackathon culture among regional developers.
</p>

<p>
While hackathons are mostly developer-centric, UX4Good was like a hackathon for UX designers.  Teams had 24 hours to learn about their organization, its goals and challenges, and then propose and present a solution that would affect large scale change for the problem if implemented.
</p>

<div style="width: 300px; " class="BlogImageLeft">
<a href="http://www.flickr.com/photos/ux4good/5396114931/" target="new"><img src="/Common/Images/Custom/blog/blog-ux4good-thirdteacher.png" /></a>
The Third Teacher team scopes out the problem in classic UX designer style: Post-It Notes!</a>
</div>

<p>
This approach seems far-fetched at first.  Friday afternoon I sat in on the CeaseFire team as they began dissecting their challenge.  A common discussion thread was 'who are we as designers to tell these organizations what they should do differently?'  As the team dove into their chalenge and learned about how people involved with CeaseFire confront violence day after day, there was profound respect for those in the trenches&mdash;and a bit of internal combustion as they negotiated their role <i>vis &agrave; vis</i> the CeaseFire volunteers who would be coming on Saturday to talk with the team.  For more, <a href="http://www.ux4good.com/2011/01/28/ux4good-urban-violence-team-defines-their-approach-for-ceasefire-2/" target="new">read my post covering the experience of sitting through CeaseFire team discussions</a>.
</p>

<h4>So, how <i>can</i> UX designers affect change?</h4>

<p>
In any organization, nonprofits included, often people involved get so close to a set of problems they lose the ability to see things from an outside perspective.
</p>

<div style="width: 300px; " class="BlogImageRight">
<img src="/Common/Images/Custom/blog/blog-ux4good-animalhouse.jpg" /></a>
The Social Media command center 'Animal House'
</div>

<p>
<i>
'We can't solve problems by using the same kind of thinking we used when we created them.'</i><br /><br />
&mdash;Albert Einstein
</p>

<p>
UX designers have training and experience in applied behavioral and motivational psychology and can offer perspective to help cause-focused groups achieve their aims.  UX4Good is pioneering the notion that one doesn't have to volunteer at a soup kitchen or donate large sums of money to affect change, rather, they can offer their unique intellectual skills that can also have an impact.  The proof, is in the long-term impact, in seeing the solutions applied and measuring the results.  That will take cooperation and collaboration from the nonprofit beneficiaries and the volunteers and designers who help implement the solutions.
</p>

<h4>View Photos & Learn More About UX4Good</h4>

<div style="width: 168px; " class="BlogImageRight">
<a href="http://www.ux4good.com/" target="new"><img src="/Common/Images/Custom/blog/blog-ux4good-logo.jpg" /></a>
</div>

<p>
Learn more about UX4Good on the <a href="http://ux4good.com" target="new">UX4Good website</a>.  Check out the <a href="http://ux4good.com/blog" target="new">event blog</a> for writeups and the <a href="http://flickr.com/ux4good" target="new">UX4Good photostream on Flickr</a>.  UX4Good 2012 is planned for New Orleans.  For details and to get involved, contact the team via <a href="http://ux4good.com" target="new">the UX4Good website</a> and <a href="http://twitter.com/ux4good" target="new">follow UX4Good on Twitter</a>.
</p>

<p>
Special thanks to Chris Pautsch, CEO at KeyLimeTie, for getting the company involved.  Also, I'd like to thank Jim Jacoby, Jason Ulaszek, Jeff Leitner and Bryan Campen of our agency partner Manifest Digital for welcoming me on the volunteer team.
</p>]]></description> 
					<pubDate>Wed, 02 Feb 2011 17:53:27 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/2/2/reflections-from-ux4good-a-designers-hackathon-to-solve-social-problems/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Live at UX4Good Designing Solutions for Social Problems</title> 
					<link>http://keylimetie.com/blog/2011/1/29/keylimetie-live-at-ux4good-designing-solutions-for-social-problems/</link> 
					<description><![CDATA[<div style="width: 168px; " class="BlogImageRight">
<a href="http://www.ux4good.com/" target="new"><img src="/Common/Images/Custom/blog/blog-ux4good-logo.jpg" /></a>
</div>

<p>
KeyLimeTie is live at <a href="http://ux4good.com/" target="new">UX4Good</a> as sponsors and participants.  UX4Good is a 'wildly ambitious effort to design systemic solutions for some of the most vexing social challenges'.  40 top user experience (UX) designers and 10 gifted visual designers are gathered at Chicago's Adler School of Professional Psychology for day two of tackling 'problems that matter' in the first-ever design competition of its kind (Check out our very own Creative Director, Kevin Mech <a href="http://www.ux4good.com/2011/01/28/ux4good-sketches-out-the-streetwise-experience/" target="new">quoted in this post</a> discussing the Streetwise team's early approach).
</p>

<h4>Watch the Livestream Today</h4>

<p>
<a href="http://www.livestream.com/ux4good" target="new">Watch the UX4Good livestream sponsored by KeyLimeTie</a> with interviews from UX experts in town, talking about their experience as they go through the challenges throughout the day.  Also, <b>at 5:00pm CST, Saturday January 29 there will be a live broadcast of the teams' presentations.</b>  Don't miss them!
</p>

<h4>Follow Along on Twitter and Flickr</h4>

<p>
Follow the live tweets on Twitter.  Please re-tweet posts and write in with your comments and questions.  Use hashtags <a href="http://twitter.com/#search?q=ux4good" target="new">#ux4good</a> or <a href="http://twitter.com/#search?q=uxxu" target="new">#uxxu</a> for general conversation, and these specific hashtags for each of the challenges: <a href="http://twitter.com/#search?q=ceasefire" target="new">#ceasefire</a> <a href="http://twitter.com/#search?q=thirdteacher" target="new">#thirdteacher</a> <a href="http://twitter.com/#search?q=adlerschool" target="new">#adlerschool</a> <a href="http://twitter.com/#search?q=streetwise" target="new">#streetwise</a> <a href="http://twitter.com/#search?q=globallives" target="new">#globallives</a>.
</p>

<p>
<a href="http://www.flickr.com/photos/ux4good" target="new">Watch the Flickr stream</a> as the UX4Good social media team posts photos of the action.
</p>]]></description> 
					<pubDate>Sat, 29 Jan 2011 16:57:59 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/1/29/keylimetie-live-at-ux4good-designing-solutions-for-social-problems/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie sponsoring UX4Good</title> 
					<link>http://keylimetie.com/blog/2011/1/12/keylimetie-sponsoring-ux4good/</link> 
					<description><![CDATA[<div style="width: 168px; " class="BlogImageRight">
<a href="http://www.ux4good.com/" target="new"><img src="/Common/Images/Custom/blog/blog-ux4good-logo.jpg" /></a>
</div>

<p>
KeyLimeTie is excited to have the opportunity to sponsor the <a href="http://ux4good.com/" target="new">UX4Good conference</a> produced by <a href="http://www.manifestdigital.com" target="new">Manifest Digital</a> and the <a href="http://www.theinsightlabs.org/" target="new">Insight Labs</a>, a 'wildly ambitious effort to design systemic solutions for some of the most vexing social challenges'.  On January 28th and 29th, UX4Good will host 40 top user experience designers and 10 gifted visual designers for a weekend of tackling 'problems that matter' in the first-ever design competition of its kind.
</p>

<p>
UX4Good will pair these designers with executives from leading non-profit organizations that are addressing the social challenges of unemployment, urban violence, public education, community mental health and cross-cultural understanding.  Representatives from <a href="http://www.streetwise.org/" target="new">Streetwise</a>, <a href="http://www.ceasefirechicago.org/" target="new">CeaseFire Illinois</a>, <a href="http://www.thethirdteacher.com/" target="new">Third Teacher</a>, <a href="www.adler.edu" target="new">The Adler School of Professional Psychology</a> and the <a href="http://globallives.org/en/" target="new">Global Lives Project</a> will team up with UX4Good participants for a 24-hour focused period to build solutions to assist these organizations in furthering their respective missions.
</p>

<h4>KeyLimeTie at UX4Good</h4>

<p>
KeyLimeTie will be sponsoring the UX4Good livestream, helping connect people around the world with the goings on at the event.  We're also helping out with event social media and will be providing subject matter experts on mobile applications and usage trends to assist the teams as they build solutions for their respective nonprofit organizations.
</p>

<h4>Follow UX4Good Online</h4>

<p>
UX4Good will be livestreaming the event as well as providing updates throughout the weekend via an event liveblog.  Follow the progress of the event via the UX4Good website on January 28th and 29th, and follow @<a href="http://www.twitter.com/ux4good" target="new">UX4good</a> on Twitter.
</p>]]></description> 
					<pubDate>Wed, 12 Jan 2011 21:26:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/1/12/keylimetie-sponsoring-ux4good/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Presenting Introduction to iPhone/iOS Apps at midVentures DESIGN+DEVELOP Series </title> 
					<link>http://keylimetie.com/blog/2011/1/11/keylimetie-presenting-introduction-to-iphone/ios-apps-at-midventures-design-develop-series/</link> 
					<description><![CDATA[<div style="width: 200px; " class="BlogImageRight">
<img alt="midVentures DESIGN+DEVELOP" src="/Common/Images/Custom/blog/blog-chrisgrove.jpg" />
Chris Grove, CTO
</div>

<p>
KeyLimeTie's CTO Chris Grove will present an in-depth introduction to iPhone applications at the next <a href="http://www.midventures.com/designdevelop" target="new">midVentures DESIGN+DEVELOP workshop series</a> on January 20th between 4:45-6:00pm at the <a href="http://www.synctechcenter.com" target="new">Sync Technology Center</a>.  The talk is for both technical and non-technical people looking to:
</p>

<ul style="margin-left: 20px;">
<li style="margin-bottom: 0px;">Understand the opportunities iOS apps provide for your business or product</li>
<li style="margin-bottom: 0px;">Select the right full-time developer, development firm or freelancer</li>
<li>Market your app once it is in the iTunes Store</li>
</ul>

<p>
Guests will also gain from KeyLimeTie's insights from experience as one of the leading iPhone development firms in the Chicago area.  Visit the midVentures website to <a href="http://midventures.com/designdevelop/" target="new">learn more and register to attend the upcoming DESIGN+DEVELOP workshop</a>, and see KeyLimeTie CTO Chris Grove talk about iPhone development.
</p>

<p>
The first DESIGN+DEVELOP series was held in December and had over 150 attendees spanning the gambit between entrepreneurs, investors, designers and developers for two workshops on design and development methodologies.  This second DESIGN+DEVELOP will focus specifically on the opportunity and how-to of mobile app development for both Android and iOS.
</p>

<center>
<div style="width: 400px; " class="BlogImageCenter">
<a href="http://www.midventures.com/designdevelop/" target="new"><img alt="midVentures DESIGN+DEVELOP" src="/Common/Images/Custom/blog/blog-midventures.jpg" /></a>
</div>
</center>

<h4>About Chris Grove, CTO, KeyLimeTie</h4>

<p>
Chris Grove is KeyLimeTie's CTO and principal iOS developer.  At KeyLimeTie, Chris architects and develops mobile solutions for enterprise clients including iPhone/iPad apps, developer APIs, and server-side solutions for mobile integration.  As CTO, Chris keeps abreast of developing mobile trends across platforms and leads KeyLimeTie's mobile development team consisting of iOS, Android and Windows Mobile developers.  For more than 15 years Chris has designed and implemented custom solutions in diverse industries such as insurance, finance, publishing, energy, time tracking, and construction. 
</p>

<h4>About KeyLimeTie</h4>
<p>
KeyLimeTie is a full-service design, development & digital strategy agency, helping clients communicate more effectively and intimately with their customers through interactive marketing channels. Specializing in web and mobile technologies across a variety of platforms, KeyLimeTie provides content management, ecommerce, and custom application solutions, while also assisting customers with social media campaign and reputation management.      
</p>]]></description> 
					<pubDate>Tue, 11 Jan 2011 15:38:12 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2011/1/11/keylimetie-presenting-introduction-to-iphone/ios-apps-at-midventures-design-develop-series/</guid>
				</item>
			
				<item>
					<title>Official Lava Lamp iPhone app by KeyLimeTie now available in the iTunes Store </title> 
					<link>http://keylimetie.com/blog/2010/12/30/official-lava-lamp-iphone-app-by-keylimetie-now-available-in-the-itunes-store/</link> 
					<description><![CDATA[<p>
We're happy to announce the release of KeyLimeTie's latest iPhone app, <a href="http://itunes.apple.com/us/app/official-lava-lamp/id411895202?mt=8" target="new">Official Lava Lamp</a> by <a href="http://www.lavalamp.com" target="new">Lava Lite</a>, LLC.  The app allows you to design your own virtual LAVA® Lamp and watch the lava flow while listening to relaxing and invigorating background sounds.  App users can also save lamp designs, share them with friends on Facebook and Twitter, and even browse Lava Lite's online catalog of actual Lava Lamps for purchase.
</p>
<p>
If you have an iPhone, iPod Touch or iPad running iOS 4.0 or later, you can <a href="http://itunes.apple.com/us/app/official-lava-lamp/id411895202?mt=8" target="new">download the Official Lava Lamp app on iTunes</a>.
</p>
<div style="width: 575px; " class="BlogImageRight">
<a href="http://itunes.apple.com/us/app/official-lava-lamp/id411895202?mt=8" target="new"><img alt="PartsTown iPhone App" src="/Common/Images/Custom/blog/blog-lava-screens.png" /></a>
</div>
<p>
KeyLimeTie and Lava Lite were featured in <a href="http://www.chicagobusiness.com/apps/pbcs.dll/article?AID=9999100033699#axzz19cvamuuS" target="new">this July 19, 2010 Crain's Chicago Business article</a>, and Lava Lite's digital forays have been mentioned in industry publications including Home World Business.  KeyLimeTie is pleased to have the opportunity to collaborate with an iconic American brand like Lava Lite.
</p>
<p>
The Lava Lamp is one of the most recognizable cultural icons of the past 40 years and has become synonymous with the hippie movement of the 60s and 70s.  What the public doesn't know is that Lava Lite sells more Lava Lamps each year now than it did in the 60s and 70s combined.  Lava Lamps are more recognized and loved than ever, and have very strong brand awareness and staying power with young consumers.  An iPhone app was the next logical step for Lava Lite to extend their brand onto the popular mobile platform.
</p>
<h4>Need an app for your company?</h4>
<p>
We're happy to discuss how you can use a mobile app to extend your brand like Lava Lite did.  Give us a call at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>
]]></description> 
					<pubDate>Thu, 30 Dec 2010 21:38:41 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/12/30/official-lava-lamp-iphone-app-by-keylimetie-now-available-in-the-itunes-store/</guid>
				</item>
			
				<item>
					<title>QR Codes on Pricetags Underscores Need for Mobile Web Presence </title> 
					<link>http://keylimetie.com/blog/2010/12/21/qr-codes-on-pricetags-underscores-need-for-mobile-web-presence/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<img alt="" src="/Common/Images/Custom/blog/blog-bestbuy-rack.jpg" /></a>
QR Codes on Best Buy price tags.
</div>

<p>
QR Codes are becoming more and more visible in the world around us.  For example, Best Buy now features them on all of their price tags, linking the physical product to the product's page on their mobile website.  Scan the tag and you can view product specs, pricing information, compare with other products or share with friends.
</p>

<p>
Links to mobile product pages via QR Codes aid your customer's decision-making process.  Savvy consumers want more information at their fingertips so they can make an educated buying decision.  Offering a mobile product page could mean the difference between someone leaving your store and comparing elsewhere, or purchasing the item then and there.
</p>

<p>
Note that mobile web pages prioritize information differently than desktop webpages.  Mobile web users have shorter attention spans as they seek information while on the go.  Mobile screens are tiny, making traditional three-column desktop web designs cumbersome to browse and navigate.  Connection speeds are slow and are occasionally interrupted, and the user has little control over their environment.  Mobile users are most often focused on a single task and are not multitasking like they do on desktops or laptops.
</p>

<div style="width: 580px; margin-bottom: 20px;" class="BlogImageCenter">

	<div style="width: 200px; float: left; margin-left: 40px;">
	<img alt="" src="/Common/Images/Custom/blog/blog-bestbuy-1.png" /></a>
	A Best Buy mobile product page.
	</div>
	
	<div style="width: 200px; float: right; margin-right: 40px;">
	<img alt="" src="/Common/Images/Custom/blog/blog-bestbuy-2.png" /></a>
	An awkward Comparison screen.
	</div>
	
</div>
<br clear="all">
<br />

<h4>How Best Buy Can Improve</h4>

<p>
Best Buy tries to get the mobile browsing experience right with product comparisons, but forces too many steps to make it practical.  The Compare button takes you to a page displaying your product in one column opposite a column instructing you to search or browse for a product with which to compare.  Browsing the site's hierarchy takes 4-5 clicks to approach a similar product, and the user can't be faulted for not knowing the proper search terms.  Instead, the website should be intelligent enough to display similar products, allowing for a one-click selection to a competitive product.  The lesson here?  Help your users accomplish their goals quicker.
</p>

<h4>Making Your Mobile Web Pages Useful</h4>

<p>
Approach mobile web pages with the desire to only display the most relevant, timely information.  Your users are looking for a specific outcome based upon the context of their visit.  In the case of Best Buy, users are looking for product information, comparison data, or even to price compare on competitors' websites.  Don't be afraid of the comparison, they're in your store and ready to buy.  Facilitating competitive comparisons may be touchy, but by letting the customer be in control you're building loyalty and trust.
</p>

<h4>Tying QR Into Mobile Web</h4>

<p>
If context is king on the mobile web, you can control the context by driving visitors via a QR code.  Place QR codes within specific offers and messages, and you set your customer's expectations from the start.  Now you have a good idea of when and where the user will visit your page.  Here are a few practical applications, with examples of how the code can be used:
</p>

<table width="500" style="margin: 0 20px 20px 40px; border-collapse: collapse;">
	<tr valign="top">
		<td style="border: 1px solid black; padding: 3px;"><b>Code Location</b></td>
		<td style="border: 1px solid black; padding: 3px;"><b>Destination</b></td>
		<td style="border: 1px solid black; padding: 3px;"><b>Uses</b><br /></td>
	</tr>
	<tr valign="top">
		<td style="border: 1px solid black; padding: 3px;">Price Tag</td>
		<td style="border: 1px solid black; padding: 3px;">Mobile Ecommerce</td>
		<td style="border: 1px solid black; padding: 3px;">Price Comparison<br />
			Online Ordering<br />
			Social Sharing<br />
		</td>
	</tr>
	<tr valign="top">
		<td style="border: 1px solid black; padding: 3px;">Product Box</td>
		<td style="border: 1px solid black; padding: 3px;">Manufacturer Site</td>
		<td style="border: 1px solid black; padding: 3px;">Product Info<br />
			Model Comparison<br />
			Social Subscribe (Brand Loyalty)<br />
			Social Sharing<br />
		</td>
	</tr>
	<tr valign="top">
		<td style="border: 1px solid black; padding: 3px;">Location</td>
		<td style="border: 1px solid black; padding: 3px;">Location Website</td>
		<td style="border: 1px solid black; padding: 3px;">Location Info<br />
			Events Calendar<br />
			Social Subscribe<br />
		</td>
	</tr>
	<tr valign="top">
		<td style="border: 1px solid black; padding: 3px;">Advertisement</td>
		<td style="border: 1px solid black; padding: 3px;">Product Website</td>
		<td style="border: 1px solid black; padding: 3px;">Ad Extension<br />
			Product/Service Information<br />
			Lead Capture<br />
			Social Subscribe (Brand Loyalty)<br />
		</td>
	</tr>
</table>

<h4>Have a use for a mobile website or integrated QR codes?</h4>

<p>
If this article sparks your interest and you see a need for mobile landing pages and QR codes for your company, give us a call at 630.598.9000.  And don't forget to <a href="http://www.twitter.com/keylimetie">follow us on Twitter</a> and <a href="http://www.facebook.com/keylimetie">like us on Facebook</a>.
</p>]]></description> 
					<pubDate>Thu, 23 Dec 2010 20:15:32 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/12/21/qr-codes-on-pricetags-underscores-need-for-mobile-web-presence/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie talks Holiday Apps in Crain&amp;quot;s Chicago Business</title> 
					<link>http://keylimetie.com/blog/2010/12/8/keylimetie-talks-holiday-apps-in-crains-chicago-business/</link> 
					<description><![CDATA[<p>
KeyLimeTie's Chris Pautsch was quoted in this week's issue of Crain's Chicago Business in an article about apps for the Holidays.  The piece, <a href="http://www.chicagobusiness.com/article/20101204/ISSUE03/312049990/apps-for-the-holidays-organizing-in-a-busy-season-and-some-fun-too#ixzz17XDfVjqg" target="new">Apps for the holidays: organizing in a busy season and some fun, too</a>, highlights how people are using mobile apps to help them shop, organize, save, and even see a little more enjoyment during this special time of year.
</p>

<div style="width: 311px;" class="BlogImageRight">
<a href="http://itunes.apple.com/us/app/the-ultimate-holiday-app/id405090121?mt=8" target="new"><img alt="" src="/Common/Images/Custom/blog/holidized-photo.png" /></a>
Nate Pautsch as a reindeer in a 'holidized' photo.
</div>

<h4>Hallmark Channel Ultimate Holiday App</h4>

<p>
<a href="http://www.chicagobusiness.com/article/20101204/ISSUE03/312049990/apps-for-the-holidays-organizing-in-a-busy-season-and-some-fun-too#ixzz17XDfVjqg" target="new">The Crain's article</a> also mentions a new app in KeyLimeTie's portfolio, which we developed in partnership with <a href="http://www.manifestdigital.com" target="new">Manifest Digital</a>.  iPhone users can download the <a href="http://itunes.apple.com/us/app/the-ultimate-holiday-app/id405090121?mt=8" target="new">Hallmark Channel Ultimate Holiday App</a> to experience '365 days of holidays,' create a gift list, and the most fun feature of all, 'holidize' your photos and share them with your friends via email and Facebook.  Look for the iPad version coming soon.
</p>

<h4>Ultimate Holiday Gets it Right</h4>

<p>
Branded apps are difficult to get right, because the temptation is to advertise and be self-promotional.  The Ultimate Holiday app provides interesting content (365 days of holidays), useful features (My Gift List) and entertaining features (Holidize My Photos) in addition to promoting the Hallmark Channel's schedule and having a Coca-Cola sponsorship.  This branded app keeps the promotion light and fun, creating a positive experience for the user and affinity toward the Hallmark Channel.
</p>

<h4>Need an app for your company?</h4>

<p>
We're happy to discuss how you can use a mobile app to help boost your brand by providing users entertaining content and fun experiences.  Give us a call at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>]]></description> 
					<pubDate>Wed, 08 Dec 2010 16:19:50 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/12/8/keylimetie-talks-holiday-apps-in-crains-chicago-business/</guid>
				</item>
			
				<item>
					<title>Find any Restaurant Equipment Manual with PartsTown iPhone and Android App </title> 
					<link>http://keylimetie.com/blog/2010/11/16/find-any-restaurant-equipment-manual-with-partstown-iphone-and-android-app/</link> 
					<description><![CDATA[<p>
<a href="http://www.partstown.com" target="new">PartsTown</a> approached KeyLimeTie with a unique idea for a mobile app, and we were pleased to take the concept to reality.  PartsTown sells restaurant parts.  They stock tens of thousands of parts from hundreds of manufacturers, and turn orders around quickly so the restaurants they serve can get back to running full speed.
</p>

<p>
PartsTown chose to take the most popular feature on their website, 'Find Equipment Manuals', and turn it into a mobile app.  The web feature receives tens of thousands of hits monthly, and now anyone with an iPhone or Android phone can download over 15,000 parts diagrams and manuals for free, saving paper and getting repair professionals the information they need while in the field.
</p>

<div style="width: 575px;" class="BlogImageRight">
<a href="http://www.partstown.com/app" target="new"><img alt="PartsTown iPhone App" src="/Common/Images/Custom/blog/blog-partstown.png" /></a>
</div>

<p>
Restaurant equipment repair professionals deal with thousands of different pieces of equipment as they go throughout their jobs.  When assigned to fix a broken unit, they'll need to look up the part, order a replacement and read the manual for how to fix it.  It's impractical for repair professionals to carry with them all the manuals they need, and they can't always count on the restaurant to keep the manuals.
</p>

<p>
Rather than simply seeking to extend their brand with an app, the PartsTown Find Equipment Manuals app is truly useful to their their customers.
</p>

<p>
Download the <a href="http://itunes.apple.com/us/app/partstown/id399259573?mt=8" target="new">iPhone version</a> or <a href="market://search?q=pname:com.partstown.web">Android version</a> now.
</p>

<h4>Need an app for your company?</h4>

<p>
We're happy to discuss how you can use a mobile app to help boost your brand, increase productivity or shave cost.  Give us a call at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>]]></description> 
					<pubDate>Tue, 16 Nov 2010 17:20:36 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/11/16/find-any-restaurant-equipment-manual-with-partstown-iphone-and-android-app/</guid>
				</item>
			
				<item>
					<title>On Our Radar: Giant iPhone Surface Table</title> 
					<link>http://keylimetie.com/blog/2010/11/4/on-our-radar-giant-iphone-surface-table/</link> 
					<description><![CDATA[<p>
If you haven't yet seen the Table Connect for iPhone, this is really cool.  This caught our eye, especially as we've already reported on how user experiences are becoming fragmented across "contexts."  As surface computing emerges (see the <a href=" " target="new">Microsoft Surface</a> and the <a href="http://www.touchtastetech.com/" target="new">Touch Taste interactive table</a>) the things people are doing now on their computers, smartphones and tablets will truly make their way to the desktop.  Check out the video here:
</p>
<center>
<object style="height: 292px; width: 480px; " width="480" height="292">
<param name="movie" value="http://www.youtube.com/v/TCbSwOgNzZg?version=3">
<param name="allowFullScreen" value="true">
<param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/TCbSwOgNzZg?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="480" height="292"></object>
</center>
<br />
<br />
<div style="width: 300px; " class="BlogImageRight">
<img alt="Piano from Big" src="/Common/Images/Custom/blog/blog-big-piano.jpg" />
How about an iOS version of the piano from Big?
</div>
<p>
Some people online report that the table is fake, but the developers at <a href="http://www.tableconnect.co.cc" target="new">tableconnect.co.cc</a> are spending their time developing additional prototypes instead of debating online critics with too much time on their hands.
</p>
<p>
Of course, all we can think of is the piano in <em>Big</em> on steroids.  Just imagine what would be possible if Apple produced a high-resolution iOS that allowed for multitasking and multiple users on a surface.  While researchers are building multi-user, multitouch platforms in the lab, an iOS with these capabilities would bring the benefits of the vibrant App Store and developer community, populating a platform like this with useful apps rather quickly.
</p>
<h4>Need an app for your company?</h4>
<p>
If you're interested in building your own app, please let us know.  We're happy to discuss how you can use an iPhone, iPad, Android or Windows Phone 7 app  to help boost your brand, increase productivity or shave cost.  Give us a call at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>
]]></description> 
					<pubDate>Thu, 04 Nov 2010 20:23:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/11/4/on-our-radar-giant-iphone-surface-table/</guid>
				</item>
			
				<item>
					<title>American Nuclear Society iPad App Calculates Radiation Exposure</title> 
					<link>http://keylimetie.com/blog/2010/11/2/american-nuclear-society-ipad-app-calculates-radiation-exposure/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<a href="http://www.flickr.com/photos/keylimetie/5139591259/in/photostream/" target="new"><img alt="American Nuclear Society iPad Application" src="/Common/Images/Custom/blog/blog-ans-ipad.jpg" /></a>
</div>

<p>
On October 27th and 28th, the <a href="http://www.ans.org" target="new">American Nuclear Society</a> took one of KeyLimeTie's newest iPad applications, ANS Radiation, to the field.  While it's not a Geiger counter (oh how cool it would be if it was), ANS Radiation is a questionnaire tool they use to educate the public about their exposure to radiation around them every day.
</p>

<p>
The app prompts you with a series of questions ranging from the type of building in which you live to how many hours a year you fly and how many medical tests you undergo.  This then adds up the amount of millirems per year (1/1,000th of a rem), which is the international unit for measuring radiation.
</p>

<p>
The American Nuclear Society asked KeyLimeTie to build the app so they could better engage with guests at the <a href="http://www.usasciencefestival.org/" target="new">USA Science & Engineering Festival</a>, a festival created to re-invigorate the interest of our nation’s youth in science, technology, engineering and math.  The festival was held October 27th and 28th in Washington, DC.  The ANS staff estimated about 3,000 visitors came by the booth throughout the weekend.
</p>

<div style="width: 300px;" class="BlogImageRight">
<a href="http://www.flickr.com/photos/keylimetie/5140194194/in/photostream/" target="new"><img alt="American Nuclear Society iPad Application" src="/Common/Images/Custom/blog/blog-ans-ipad-closeup.jpg" /></a>
</div>

<p>
The American Nuclear Society is a not-for-profit, international, scientific and educational organization to unify the professional activities of those within the nuclear field.  The ANS boasts approximately 11,000 members including engineers, scientists, administrators, and educators representing 1,600 plus corporations, educational institutions, and government agencies.
</p>

<h4>Need an iPad app for your company?</h4>

<p>
If you're interested in something similar, or another application alltogether, please let us know.  We're happy to discuss how you can use an iPad application to help boost your brand, increase productivity or shave cost.  Give us a call at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>]]></description> 
					<pubDate>Tue, 02 Nov 2010 17:10:49 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/11/2/american-nuclear-society-ipad-app-calculates-radiation-exposure/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie opens Chicago office at Sync Technology Center as Preferred Mobile Partner</title> 
					<link>http://keylimetie.com/blog/2010/10/29/keylimetie-opens-chicago-office-at-sync-technology-center-as-preferred-mobile-partner/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<img alt="Allstate iPad Application" src="/Common/Images/Custom/blog/blog-klt-sync.jpg" />
A meeting at the Sync Technology Center with KeyLimeTie's new office in the background.
</div>

<p>
We're happy to announce that KeyLimeTie has opened a satellite office at the new <a href="http://www.synctechcenter.com" target="new">Sync Technology Center</a> located at 322 S. Green St. in Chicago's West Loop, an 18,000 square foot loft that is becoming a 'Merchandise Mart' of sorts for tech business needs in Chicago.  The Sync Technology Center features hand-picked service provider partners that collectively provide services most companies need including mobile apps, mobile websites, ecommerce, SEO, social media, video production, and PR.
</p>

<p>
KeyLimeTie will contribute to the success of the ecosystem at Sync Tech Center by providing mobile app and mobile web design and development services to startups and established companies who conduct business in and around the Sync Tech Center.  The move also expands our footprint and establishes our downtown Chicago presence, allowing us to more easily answer the web, ecommerce and mobile needs of Chicago-based companies.
</p>

<p>
The Sync Technology Center is also home to the <a href="http://www.syncubator.com/" target="new">Syncubator Fund</a>, a seed investment fund for startup technology businesses.  As creative entrepreneurs themselves, KeyLimeTie's founders look forward to working with the new ventures in which the Syncubator Fund invests and assisting in their estblishment and growth.  We see the Sync Technology Center as a promising catalyst for startups that will play a pivotal role in growing Chicago as a technology entrepreneurship hub.
</p>

<h4>Visit KeyLimeTie at the Sync Tech Center</h4>

<p>
If you are visiting the Sync Technology Center or if you wish to meet with KeyLimeTie about a mobile app, mobile web or website need, call 630.598.9000 or email us at info at keylimetie dot com for an appointment.  Also, don't forget to <a href="http://www.twitter.com/keylimetie">follow @KeyLimeTie on Twitter</a>. 
</p>]]></description> 
					<pubDate>Fri, 29 Oct 2010 21:57:37 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/10/29/keylimetie-opens-chicago-office-at-sync-technology-center-as-preferred-mobile-partner/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie CEO Chris Pautsch featured in Michigan Avenue Magazine Mens&amp;quot; Issue</title> 
					<link>http://keylimetie.com/blog/2010/10/14/keylimetie-ceo-chris-pautsch-featured-in-michigan-avenue-magazine-mens-issue/</link> 
					<description><![CDATA[<p>
We're thrilled to let you know that Chris was featured in Michigan Avenue Magazine this month for our work with Monika Dixon of <a href="http://www.beecloser.com" target="new">BeeCloser</a>, a Polish-American social list in Chicago that connects aspiring young professionals for recreation, social and philanthropic events and activities.  We're grateful that Monika thought of us when asked who she turns to for professional advice as she runs her business, and excited to share the article with you.
<p>

<p>
You can <a href="http://www.michiganavemag.com/celebrities/articles/the-best-men-for-the-job" target="new">read the article posted on the Michigan Avenue Magazine website</a>, or to see how it looks in print, click the image below to 
<a target="new" href="http://www.flickr.com/photos/keylimetie/5081303799/">see the full size image</a> and make sure you <a href="http://www.facebook.com/BeeCloser" target="new">like BeeCloser on Facebook</a>.

<div class="BlogImageCenter">
<a target="new" href="http://www.flickr.com/photos/keylimetie/5081303799/"><img src="/Common/Images/Custom/blog/blog-michiganave.png" alt="Chris Pautsch in the Michigan Avenue Magazine Mens' Issue" /></a>
</div>

<br />

<h4>Need someone to design your site or mobile app?</h4>

<p>
Let us know if you are interested in KeyLimeTie working with you like we work with Monika.  Give Chris a call at 630.598.9000, and don't forget to <a href="http://www.twitter.com/keylimetie">follow us on Twitter</a>.
</p>]]></description> 
					<pubDate>Thu, 14 Oct 2010 19:55:36 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/10/14/keylimetie-ceo-chris-pautsch-featured-in-michigan-avenue-magazine-mens-issue/</guid>
				</item>
			
				<item>
					<title>QR Codes on TV Commercials provide creative mobile marketing opportunities</title> 
					<link>http://keylimetie.com/blog/2010/10/5/qr-codes-on-tv-commercials-provide-creative-mobile-marketing-opportunities/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px; text-shadow: none;">
<img src="/Common/Images/Custom/blog/blog-qr-code-tv.jpg" alt="Fox QR Code" style="text-shadow: none;" />
</div>
<p style="text-shadow: none;">
Continuing our recent theme about QR codes, here's a code we found at the end of a TV commercial on Fox.  The QR code leads to the Videos tab of a mobile microsite promoting the new Fox TV series Lone Star.  There are also tabs for a Homepage, Photos and Cast.  No other calls to action exist, other than to check out content related to the show.
</p>
<p style="text-shadow: none;">
The use of QR codes on television allow advertisers to take a difficult to measure mass medium and gain a direct response from viewers, closing the loop on their mareketing efforts.  Further, using a QR code on a TV commercial effectively extends the length of the advertisement for the people who click the link, bringing even more value to the advertiser.
</p>
<h4 style="text-shadow: none;">Combine QR with a Strong Landing Page</h4>
<p style="text-shadow: none;">
Combine this with a carefully constructed mobile landing page and well written copy and you can capture the interest of easily distracted mobile users.  Here are a few things Fox's mobile website does to capture that interest effectively:
</p>
<div class="BlogImageRight" style="width: 200px; text-shadow: none;">
<img src="/Common/Images/Custom/blog/blog-lonestar-screen.png" alt="Fox QR Code" style="text-shadow: none;" />
</div>
<ul style="text-shadow: none;">
    <li style="text-shadow: none;"><strong style="text-shadow: none;">It tells you how long the videos are.</strong>  This helps because mobile users know they don't have much time.  Seeing video times between 75-90 seconds increases the likelihood of someone watching your clip.</li>
    <li style="text-shadow: none;"><strong style="text-shadow: none;">The site itself contains few pages and gets straight to the point.</strong>  The videos give teasers of the show, Photos capture interest through action shots, and the Cast page shows the actors playing in the show.</li>
    <li style="text-shadow: none;"><strong style="text-shadow: none;">The home page mashes up all three other tabs into one page</strong> you can scroll through.  If this is the only page you visit, you will still get a cross section of all the content the site has to offer.</li>
</ul>
<p style="text-shadow: none;">
Strangely, the site is missing social media links.  We can only suppose that this was intentional, perhaps to keep people from clicking away from the mobile site and losing the opportunity to engage with the content they're currently consuming.
</p>
<p style="text-shadow: none;">
We've just begun to see the practical uses for QR codes.  Whether on broadcast TV, a web video or another medium, here are a few other applications you can use:
</p>
<ul style="text-shadow: none;">
    <li style="text-shadow: none;">Mobile App download page (iTunes App Store or Android Marketplace)</li>
    <li style="text-shadow: none;">Mobile landing page for your business</li>
    <li style="text-shadow: none;">Email List or SMS Alert opt-in form</li>
    <li style="text-shadow: none;">A local business listing, such as a restaurant page with reviews, hours, reservation link and address</li>
</ul>
<h4 style="text-shadow: none;">Have a use for mobile landing pages?</h4>
<p style="text-shadow: none;">
If this article sparks your interest and you see a need for mobile landing pages and QR codes for your company, give us a call at 630.598.9000.  And don't forget to <a href="http://www.twitter.com/keylimetie" style="text-shadow: none;">follow us on Twitter</a> and <a href="http://www.facebook.com/keylimetie" style="text-shadow: none;">like us on Facebook</a>.
</p>
]]></description> 
					<pubDate>Tue, 05 Oct 2010 21:35:45 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/10/5/qr-codes-on-tv-commercials-provide-creative-mobile-marketing-opportunities/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie builds iPad App for Allstate Lead Capture</title> 
					<link>http://keylimetie.com/blog/2010/10/3/keylimetie-builds-ipad-app-for-allstate-lead-capture/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<img alt="Allstate iPad Application" src="/Common/Images/Custom/blog/blog-allstate-ipad.png" />
Allstate iPad App at the Chicago Blackhawks Mad Dash to Madison 5k Run, September 18, 2010.
</div>

<p>
A couple weekends ago my wife participated in the <a href="http://blackhawks.nhl.com/club/page.htm?id=63254" target="
new">Chicago Blackhawks Mad Dash to Madison</a> 5K run.  While walking through the event with the kids, I stopped by the Allstate tent.  To my surprise, the event staff was using the iPad app KeyLimeTie recently created for them.  Until this point the app has been in testing, and it was rewarding to see it being used in the field.
</p>

<p>
Allstate's event marketing team is a frequent presence at cultural and athletic events around the country.  Their reps staff booths that encourage people to get competitive insurance quotes in exchange for premiums and sweepstakes contest entries.
</p>

<h4>Going Paperless for Lead Capture</h4>

<p>
Until recently, Allstate has handled their contest entry/lead capture with a simple paper form.  While these are quick and easy to fill out for the public, they take time and money to enter into their database after the event.  The solution: KeyLimeTie worked with the Allstate Innovation Lab to produce an iPad app that lets people register a sweepstakes by filling out their contact information and completing a brief survey.  By using the app, Allstate anticipates they'll save significantly more cost in data entry than the app cost to produce.
</p>

<p>
Why did we use the iPad?  This handy device is the right size for the general public.  Using iPhones or iPod Touches would make entry difficult, as non-users could have more difficulty with the keyboard.  Plus, the larger devices are more difficult to steal at a booth in a congested area.
</p>

<h4>Need an iPad app for your company?</h4>

<p>
If you're interested in something similar, or another application alltogether, please let us know.  We're happy to discuss how you can use an iPad application to help boost your brand, increase productivity or shave cost.  Give us a call at 630.598.9000, and make sure to <a href="http://www.twitter.com/keylimetie" target="new">follow KeyLimeTie on Twitter</a>.
</p>]]></description> 
					<pubDate>Sun, 03 Oct 2010 18:03:14 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/10/3/keylimetie-builds-ipad-app-for-allstate-lead-capture/</guid>
				</item>
			
				<item>
					<title>QR Code Art - The KeyLime Tie Like You&amp;quot;ve Never Seen It Before</title> 
					<link>http://keylimetie.com/blog/2010/9/30/qr-code-art-the-keylime-tie-like-youve-never-seen-it-before/</link> 
					<description><![CDATA[<div style="width: 129px;" class="BlogImageRight">
<img alt="KeyLime Tie in a QR Code" src="/Common/Images/Custom/blog/20100930-KeyLimeTie-Tie-QR-Code.png" />
</div>

<p>
Lately we've been playing with QR codes in various applications, both for clients and for ourselves. Most recently, we created KeyLimeTie t-shirts to wear at events or casually in the hopes of sparking conversations. The shirts themselves needed to be fun while providing a way for people to connect with KeyLimeTie rather than just seeing our name. A QR code was an intriguing solution, but could we do it with a twist of lime?
</p>

<p>
We took our basic code and made a few modifications, even going so far as to embed it in our logo. Because QR codes are optical and based on contrast, we merged our striped tie logo with the code and produced a visually appealing, yet still functional QR code.
</p>

<p>
We then tiled the code throughout the tie graphic to make it appear as if the entire tie was part of the QR code. Because the graphic retained the <a href="http://en.wikipedia.org/wiki/QR_Code" target="new">standard registration, alignment, and version markings</a> in the widest part of the tie, the incomplete codes throughout the remainder of the tie are ignored. And since the lime and grey colors provide enough contrast against the dark background, the QR code is easily scan-able despite the coloration.
</p>

<div style="width: 299px;" class="BlogImageRight">
<img alt="KeyLimeTie T-Shirts" src="/Common/Images/Custom/blog/20100930-KeyLimeTie-T-Shirts.png" />
</div>

<p>
This was the most intriguing approach for presenting our QR code, however, we chose not to use it for the first iteration of the t-shirt. We'll look for additional opportunities to use it in other materials in the future. Considering the immediate recognition of a standard QR code, we opted to use the basic code on the front and an artistic play of our name on the back.
</p>

<h4>More Creative QR Codes</h4>

<p>
If you're interested in creating your own, you can also find entire communities devoted to QR arts, <a href="http://www.facebook.com/#!/album.php?aid=2285&id=104125526295864" target="new">such as the QR Arts gallery and fan page on Facebook</a>. It's amazing what you can do to one of these codes while maintaining the code's readability.
</p>

<h4>Have a use for mobile landing pages?</h4>

<p>
If this article sparks your interest and you see a need for mobile landing pages and QR codes for your company, give us a call at 630.598.9000.  And don't forget to <a href="http://www.twitter.com/keylimetie">follow us on Twitter</a> and <a href="http://www.facebook.com/keylimetie">like us on Facebook</a>.
</p>]]></description> 
					<pubDate>Thu, 30 Sep 2010 17:11:01 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/9/30/qr-code-art-the-keylime-tie-like-youve-never-seen-it-before/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie at midVentures LAUNCH - Will Cook It For Us steal the show?</title> 
					<link>http://keylimetie.com/blog/2010/9/27/keylimetie-at-midventures-launch-will-cook-it-for-us-steal-the-show/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<a target="new" href="http://www.mvlaunch.com"><img src="/Common/Images/Custom/blog/blog-mvlaunch.png" alt="midVenturesLAUNCH" /></a>
</div>
<p>
Today and tomorrow, KeyLimeTie team members are on site at midVenturesLAUNCH, billed as the largest startup conference in the Midwest.  midVentures LAUNCH has two full days of programming and puts companies on stage to launch their products in front of press and investors, providing an opportunity to compete for prize money and attract the attention of venture capitalists.  For complete details, <a target="new" href="http://www.midventureslaunch.com">check out the midVentures LAUNCH website</a>.
</p>
<p>
We'll be representing our interactive design and development services, specifically mobile development.  As avid supporters of the business community in Chicago, we are eager to partner with companies who look to technology such as iPhone apps, Android apps and mobile websites to strengthen customer relationships with people whether at their PCs or on the go.
</p>
<h4>Will Cook it For Us Steal the Show?</h4>
<div class="BlogImageRight" style="width: 300px;">
<img src="/Common/Images/Custom/blog/blog-cookitforus.png" alt="Cook it For Us team at the KeyLimeTie Office" />
The Cook it For Us team at KeyLimeTie
</div>
<p>
The <a target="new" href="http://cookitfor.us">Cook It For Us</a> team won grand prize at the SocialDevCamp Chicago Hackathon and <a target="new" href="http://keylimetie.com/blog/2010/8/9/keylimetie-at-socialdevcamp-chicago-this-weekend-adding-to-the-hackathon-prize-pool/">KeyLimeTie helped them gear up for their  midVenturesLAUNCH Demo table as a part of their prize</a>.  Rumor has it they're baking cookies for anyone who comes by their table for a demo.  We think this will help them steal the show, so visit Cook it For Us, tell them KeyLimeTie sent you, and eat one of their yummy cookies!
</p>
<h4>Eager to Partner With You</h4>
<p>
We're thrilled to see the Cook it For Us team demo their concept at midVenturesLAUNCH and gear up to attract investment capital.  We're also eager to connect with companies who need mobile apps, mobile websites or traditional websites to accelerate their businesses to the next step.  If you see us there, connect with us!
</p>
<h4>Connect With Us</h4>
<p>
Please make sure to follow @<a target="new" href="http://www.twitter.com/keylimetie">KeyLimeTie</a> on Twitter and <a target="new" href="http://www.facebook.com/keylimetie">Like us on Facebook</a>. We do our best to share useful information about the web, enterprise software, mobile technologies and how you can practically use social media for business.
</p>
]]></description> 
					<pubDate>Mon, 27 Sep 2010 23:59:15 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/9/27/keylimetie-at-midventures-launch-will-cook-it-for-us-steal-the-show/</guid>
				</item>
			
				<item>
					<title>Google Voice Actions adds to Android experience, frames future of mobile use</title> 
					<link>http://keylimetie.com/blog/2010/8/17/google-voice-actions-adds-to-android-experience-frames-future-of-mobile-use/</link> 
					<description><![CDATA[<p>
Last week, <a target="new" href="http://googlemobile.blogspot.com/2010/08/just-speak-it-introducing-voice-actions.html">Google announced Voice Actions for Android</a>, a robust set of voice commands that allow you to do anything from write a text message, begin navigating to a map location, retrieve directory listings or send an email.  For the phone platform known for feature-richness, this is a leap forward for users.
</p>
<p>
Watch Google's video on Voice Actions:
</p>
<object height="385" width="480">
<param name="movie" value="http://www.youtube.com/v/gGbYVvU0Z5s?fs=1&hl=en_US">
<param name="allowFullScreen" value="true">
<param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/gGbYVvU0Z5s?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></object>
<h4>How well does it work?</h4>
<p>
<a target="new" href="http://www.theinquirer.net/inquirer/review/1727968/we-test-drive-google-voice-search">This third-party test drive</a> praises the complexity of the appliation but notes it's still lacking in the field.  The test of usefulness here is the speed and convenience to complete the desired (often routine) task.  If it ends up taking less time to manually complete the task, or if you have to switch to manual to choose between search options, the practicality of the feature diminishes.
</p>
<h4>It's cool, but when will it catch on?</h4>
<p>
Google prides itself at releasing features the iPhone doesn't yet have.  It's no surprise Voice Actions has more commands than <a target="new" href="http://www.apple.com/iphone/features/voice-control.html">Voice Control on the iPhone</a>, a feature I use almost daily to place calls.  Like the Android test drive link above, the iPhone feature has some humorous inaccuracies, however for dialing, voice activation is accurate for 80-90% of the people I call.  However, just this weekend I get the sense voice commands haven't yet caught traction.  The other day I was driving a car full of techies on the bleeding edge who chuckled when they heard me talking to my phone to make a call.
</p>
<p>
Have you used this feature on the Android phone yet?  If so, tell us about it!
</p>
]]></description> 
					<pubDate>Tue, 17 Aug 2010 20:43:01 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/8/17/google-voice-actions-adds-to-android-experience-frames-future-of-mobile-use/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie runs the MC 200 Relay for second year in a row</title> 
					<link>http://keylimetie.com/blog/2010/8/17/keylimetie-runs-the-mc-200-relay-for-second-year-in-a-row/</link> 
					<description><![CDATA[<div style="width: 250px;" class="BlogImageRight">
<img alt="MC 200 Route" src="/Common/Images/Custom/blog/blog-mc200-people.jpg"  />
</div>

<p>
This year, KeyLimeTie ran the <a href="http://www.mc200.com" target="new">MC 200 relay</a> from Madison, Wisconsin to Lake Michigan in Chicago for the second year in a row.  For us, it's been a real team building and an opportunity to bond outside of the office.  Plus, the event proceeds go to benefit the Special Olympics of Wisconsin and Illinois.
</p>

<p>
This is the second year we have participated.  This year we focused a lot more on training and getting our times up.  And, it paid off!  We shaved two hours off our 2009 time of 35:21:13, running the 200 miles this year in 33:26:32.
</p>

<p>
Check out <a href="http://www.flickr.com/photos/keylimetie/sets/72157624746146900/" target="new">photos of Team KeyLimeTie on Flickr</a>.
</p>

<h4>The KeyLimeTie team included:</h4>

<div style="width: 250px;" class="BlogImageRight">
<img alt="MC 200 Route" src="/Common/Images/Custom/blog/blog-mc200-map.jpg"  />
Yep, we ran all this way.
</div>

<p>
<br />Anthony Avallone<br />
Brian Pautsch<br />
Brian West<br />
Butch Zemar<br />
Chris Grove<br />
Chris Pautsch<br />
Dan Strabbing<br />
Dean Giorgetti<br />
Geoff Skyles<br />
Joe Giorgetti<br />
Michael Wick<br />
Peter Morano<br />
Sam Dekin
</p>

<p>
We can't wait to do it again next year!
</p>]]></description> 
					<pubDate>Tue, 17 Aug 2010 18:16:16 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/8/17/keylimetie-runs-the-mc-200-relay-for-second-year-in-a-row/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie at SocialDevCamp Chicago This Weekend: Adding to the Hackathon prize pool!</title> 
					<link>http://keylimetie.com/blog/2010/8/9/keylimetie-at-socialdevcamp-chicago-this-weekend-adding-to-the-hackathon-prize-pool/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<a target="new" href="http://www.socialdevcampchicago.com">
<img src="/Common/Images/Custom/blog/blog-devcamp-2010.png" alt="SocialDevCamp Chicago" />
</a>
</div>
<p>
KeyLimeTie is thrilled to be a sponsor and contributor for the second year in a row to <a target="new" href="http://www.socialdevcampchicago.com">SocialDevCamp Chicago</a>, a weekend conference for people developing software and growing businesses on the social web.  The event is being held this Saturday and Sunday August 14-15 at the Illinois Institute of Technology in Chicago, with the pre-launch party on Friday night at the Illinois Technology Association.  We hope you'll join us there.  Check out the <a target="new" href="http://www.socialdevcampchicago.com/schedule">full schedule</a> for more details and be sure to <a target="new" href="http://www.socialdevcampchicago.com/registe">register before tickets sell out</a>.
</p>
<h4>$2,400 in KeyLimeTie Services to Hackathon Winner</h4>
<p>
We're most excited to see the developer Hackathon contest that our very own Peter Morano started last year at SocialDevCamp gain so much more momentum this year.  Since the grand prize winner will receive a <a target="new" href="http://knappcenter.iit.edu/media-room/midventures-launch-partners-with-socialdevcamp-chicago/">demo table at midVenturesLAUNCH at the end of September</a> ($750 value), KeyLimeTie is throwing in 16 hours of graphic design and innovation consulting services ($2,400 value) to help them prepare their app for the <i>limelight</i>.  We can't wait to see what the teams come up with.
</p>
<h4>We're Contributing as Staff, Speakers and Judges</h4>
<p>
This year we're more involved than ever.  In addition to Director of Marketing Tim Courtney (@<a target="new" href="http://www.twitter.com/timcourtney">timcourtney</a>) as conference co-chair and CIO Peter Morano as Hackathon chair, our COO Brian Pautsch (@<a target="new" href="http://www.twitter.com/bpautsch">bpautsch</a>) is participating as a Hackathon judge, Pete (@<a target="new" href="http://www.twitter.com/petermorano">petermorano</a>) is talking about the catalytic nature of Hackathons at 1:30 on the panel "Using Hackathons & Code Sprints for Innovation and Social Change," and I'll be a panelist during the 10:00am Saturday session "Killer Social Apps: 5 Trends Shaping the Future of Brand Engagement".
</p>
<p>
We're excited to have the opportunity to share both our passion and our expertise to the lively, energetic, creative and talented people who make it a priority to attend SocialDevCamp each year.
</p>
<p>
Please join us at SocialDevCamp, and if you come, please say hello!
</p>
<center>
<object width="640" height="385">
<param name="movie" value="http://www.youtube.com/v/C4x57zHTlh8&hl=en_US&fs=1&">
<param name="allowFullScreen" value="true">
<param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/C4x57zHTlh8&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="295" width="480"></object>
</center>
]]></description> 
					<pubDate>Mon, 09 Aug 2010 17:50:59 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/8/9/keylimetie-at-socialdevcamp-chicago-this-weekend-adding-to-the-hackathon-prize-pool/</guid>
				</item>
			
				<item>
					<title>Crain&amp;quot;s article on mobile covers client Lava Lite and KeyLimeTie</title> 
					<link>http://keylimetie.com/blog/2010/7/19/crains-article-on-mobile-covers-client-lava-lite-and-keylimetie/</link> 
					<description><![CDATA[<p>KeyLimeTie and our client Lava Lite were featured in the article "Is your biz app-appropriate?" in this week's Crain's Chicago Business. Crain’s author, Steve Hendershot, reached out to KeyLimeTie for a perspective on the mobile app industry, allowing us the opportunity to share our experiences and observations through some of the work we’ve done for our clients. </p>
<p>The entire article can be found on <a href="http://www.chicagobusiness.com/cgi-bin/mag/article.pl?id=33699" target="new">Crain's Website</a>. </p>
<p>Besides being a gripping and entertaining app, we’re truly excited about the potential influence user-generated Lava Lamp concepts may have on future product design and development. We’re also anxious to see how well the integration with Social Media for sharing lamp designs on Facebook and Twitter will increase brand awareness with the iconic company. </p>
<h4>Social Media</h4>
<p>We're also working with Lava Lite on social media campaigns for their signature Lava Lamp product. You can follow @<a href="http://www.twitter.com/LavaLamp" target="new">LavaLamp</a> on Twitter and become a fan on <a href="http://www.facebook.com/lavalamp" target="new">Facebook</a>. </p>
<h4>Let's Work Together</h4>
<p>If you're looking to dive deeper into mobile for your company, give us a call. We'd be happy to talk through your goals and devise a plan that uses apps, mobile web, or both to help you connect with your customers on mobile. </p>
<h4>Get Updates from KeyLimeTie</h4>
<p>Please follow @<a href="http://www.twitter.com/keylimetie" target="new">KeyLimeTie</a> on Twitter or <a href="http://www.facebook.com/keylimetie" target="new">"Like" us on Facebook</a>. We do our best to share useful information about the web, enterprise software, mobile technologies and how you can practically use social media for business. </p>
]]></description> 
					<pubDate>Wed, 21 Jul 2010 22:54:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/7/19/crains-article-on-mobile-covers-client-lava-lite-and-keylimetie/</guid>
				</item>
			
				<item>
					<title>Naperville Running Company app &quot;NRC Runner&quot; now in iTunes Store</title> 
					<link>http://keylimetie.com/blog/2010/7/20/naperville-running-company-app-in-itunes-store/</link> 
					<description><![CDATA[<div style="width: 200px;" class="BlogImageRight">
<img alt="NRC Runner iPhone App" src="/Common/Images/Custom/blog/blog-nrc-iphone.jpg" />
</div>

<p>
We're happy to announce the release of our latest iPhone app, a pace calculator and customer engagement app for the Naperville Running Company called 'NRC Runner'.

<p>
You can <a href="http://itunes.apple.com/app/nrc-runner-naperville-running/id382003128?mt=8" target="new">download the app today on iTunes</a>.  Here's what the app can do:
</p>

<ul>

	<li>Pace Calculator that lets you either tell the app your desired distance and anticipated time to calculate a pace, or key in a desired distance and pace to determine how long your run will take.</li>
	
	<li>Events Calendar that keeps you up to date on the events Naperville Running Company sponsors and participates in throughout the year, so you can join the fun.</li>
	
	<li>Special offers, store news and sale information so you can stay up to date with your favorite running store.</li>

</ul>

<p>
Here at KeyLimeTie, we take our running competitions seriously&mdash;so seriously that we just completed the MC 200 Madison to Chicago 200-mile relay a few weeks ago.  Naperville Running Company is our one-stop shop for all the gear we need, and we're thrilled to work with them on the app.
</p>

<p>
Let us know what you think!
</p>

<h4>Need your own app or mobile website?</h4>

<p>
If you're looking to get into mobile and like what you see, give us a shout.  You can <a href="/contact/">contact us via email</a> or phone at 630.598.9000.
</p>]]></description> 
					<pubDate>Tue, 20 Jul 2010 23:10:46 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/7/20/naperville-running-company-app-in-itunes-store/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie sponsors Hope to Give Golf Outing to benefit Childrens Memorial Hospital</title> 
					<link>http://keylimetie.com/blog/2010/7/13/keylimetie-sponsors-hope-to-give-golf-outing-to-benefit-childrens-memorial-hospital/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<img alt="101 Best & Brightest Companies to Work For" src="/Common/Images/Custom/blog/blog-golfhole.jpg"  />
KeyLimeTie's hole at the Hope to Give Golf Outing.
</div>


<p>
KeyLimeTie <a href="http://hopetogive.org/golf-sponsors.php" target="new">sponsored a hole</a> at the <a href="http://hopetogive.org/golfouting.php" target="new">Hope to Give Golf Outing</a> last week that raised over $6,000 to benefit Childrens Memorial Hospital.  The outing was held at Stonewall Orchard Golf Club in Grayslake, IL.
</p>

<p>
Hope to Give produces fund raising events that raise money for children, families of children and organizations specifically created to help children living with life altering medical conditions.  They strive to bring hope, money, and support to those that need it most through various fund raising activities and events.
</p>

<p>
Check out the video of the outing below, and the <a href="http://hopetogive.org/golf-sponsors.php" target="new">list of outing sponsors</a> on the Hope to Give website.
</p>

<center>
<object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13213923&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=13213923&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object>
</center>]]></description> 
					<pubDate>Tue, 13 Jul 2010 15:47:24 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/7/13/keylimetie-sponsors-hope-to-give-golf-outing-to-benefit-childrens-memorial-hospital/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Recognized as one of Chicago&amp;quot;s 101 Best and Brightest Companies to Work For for 2010</title> 
					<link>http://keylimetie.com/blog/2010/6/28/keylimetie-selected-as-one-of-chicagos-101-best-and-brightest-companies-to-work-for-for-2010/</link> 
					<description><![CDATA[<div style="width: 160px;" class="BlogImageRight">
<img alt="101 Best & Brightest Companies to Work For" src="/Common/Images/Custom/blog/blog-best-brightest.png"  />
</div>

<p>
Thanks to our employees, I'm pleased to announce we were just named as one of “Chicago’s 101 Best and Brightest Companies to Work For” by the National Association for Business Resources (NABR).  Here's a link to the <a href="http://www.prnewswire.com/news-releases/keylimetie-recognized-as-one-of-chicagos-101-best-and-brightest-companies-to-work-for-98319274.html?utm_source=twitterfeed&utm_medium=twitter" target="new">press release we just issued about the honor</a> as well.</p>

<p>
In a nutshell, we're thrilled and thankful.  It reflects the effort and consideration we’ve put into developing a constructive, relaxed work environment that has enabled us to attract and retain some of Chicago's most talented individuals. </p>
<p>
What's great about this honor is we were selected thanks to our employees' responses to surveys the NABR distributed to our employees.  They expressed their enjoyment of working at KeyLimeTie in such a way that ranked us in the top 101 companies in the area.
</p>
<p>
So, to that we say thanks.  Thanks to everyone who each day makes KeyLimeTie what we are.  We're honored to be on this list.
</p>]]></description> 
					<pubDate>Mon, 28 Jun 2010 21:55:14 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/6/28/keylimetie-selected-as-one-of-chicagos-101-best-and-brightest-companies-to-work-for-for-2010/</guid>
				</item>
			
				<item>
					<title>Google Caffeine Changes Search - What You Need to Know</title> 
					<link>http://keylimetie.com/blog/2010/6/22/google-caffeine-changes-search-what-you-need-to-know/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<img alt="Google Caffeine" src="/Common/Images/Custom/blog/blog-google-caffeine.jpg" />
</div>
<p>
Google <A href="http://googleblog.blogspot.com/2010/06/our-new-search-index-caffeine.html" target="new">recently announced the release of Google Caffeine</a>, the latest version of their search engine.
</p>

<p>
To help you get ready, back in September we wrote about <a href="http://www.keylimetie.com/blog/2009/9/1/three-things-to-prepare-for-google-caffeine/">three things to prepare for Google Caffeine</a>.  Have you implemented those steps?
</p>

<p>
Now that Caffeine is live, here is what you can expect:
</p>

<ul>
	<li>Search results that contain more relevant content including more recent blog posts versus aging items.  While people expect businesses' rankings to be affected, marketers don't yet know exactly how.</li>
	<li>Content will now be searchable within seconds after it is crawled.  This is because Google is processing content immediately instead of in batches like before.</li>
	<li>You won't see a change in the ranking system, because Caffeine's big changes are in the indexing architecture.  If rankings are impacted, it will be as an indirect result and only visible at a later date.</li>
</ul>	

<h4>What can you do?</h4>

<p>
According to Google, there isn't much content creators can do to take advantage of Caffeine, but it will benefit publishers indirectly.  However, with properly configured social media profiles, people are starting to see their fresh content indexed within a few hours of posting a link to the content via their social accounts.
</p>
	
<h4>Why these changes?</h4>

<p>
According to Google, 'People's expectations for search are higher than they used to be. Searchers want to find the latest relevant content and publishers expect to be found the instant they publish.'
</p>

<h4>Looking to dig deeper?</h4>

<p>
Read these articles on Google Caffeine to learn more.
</p>

<ul>
	<li><a href="http://www.pcworld.com/article/198438/googles_caffeine_gives_the_search_engine_a_boost.html" target="new">PCWorld: Google's Caffeine Gives the Search Engine a Boost</a></li>
	<li><a href="http://searchengineland.com/googles-new-indexing-infrastructure-caffeine-now-live-43891" target="new">Search Engine Land: Google’s New Indexing Infrastructure 'Caffeine' Now Live</a></li>
	<li><a href="http://www.mattcutts.com/blog/caffeine-update/" target="new">Video of Google's Matt Cutts talking about Caffeine (starts at 1:15)</a></li>
</ul>

<h4>Get Updates from KeyLimeTie</h4>
<p>
Please follow @<a target="new" href="http://www.twitter.com/keylimetie">KeyLimeTie</a> on Twitter or <a target="new" href="http://www.facebook.com/keylimetie">"Like" us on Facebook</a>.  We do our best to share useful information about the web, enterprise software, mobile technologies and how you can practically use social media for business.
</p>]]></description> 
					<pubDate>Wed, 23 Jun 2010 00:05:32 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/6/22/google-caffeine-changes-search-what-you-need-to-know/</guid>
				</item>
			
				<item>
					<title>Keep from losing control of your brand on Facebook&amp;quot;s new Community Pages</title> 
					<link>http://keylimetie.com/blog/2010/5/27/keep-from-losing-control-of-your-brand-on-facebooks-new-community-pages/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px; text-shadow: none;">
<img src="/Common/Images/Custom/blog/blog-community-pages.png" alt="Community Pages show up in search results alongside fan pages, such as these for BP." style="text-shadow: none;" />
Community Pages show up in search results alongside fan pages, such as these for BP on Facebook.
</div>
<p style="text-shadow: none;">
Facebook "Community Pages" have added new ways for people to connect around interests, but at the same time they pose a potential threat to your company and your brand.  How so?  They create public pages (that nobody owns) around any common interest people have added to their profiles (for example, music artists, movies and products).  If you manage a popular brand, don't be surprised if you find pages on Facebook with your product or company name on them, displaying content you didn't write and can't edit to your liking.
</p>
<p style="text-shadow: none;">
Like it or not, the days of completely owning your own message are gone.  You can't hide behind press releases or your own claims anymore, especially if your company and your products get a lot of attention.  Networked customers and stakeholders who have an opinion about you—positive, negative and all shades inbetween"will find each other.  Today, your brand has evolved into the sum total of your customers' and stakeholders' thoughts about you, as shared on the web.
</p>
<h4 style="text-shadow: none;">How do Community Pages work?</h4>
<p style="text-shadow: none;">
Facebook says they aim to make each Community Page "the best collection of shared knowledge on [this topic]".  They do this by bringing in the topic's Wikipedia article along with recent posts mentioning the subject.  This means whatever people are saying about the area of interest—good or bad—has the potential to get aggregated.  Read <a target="new" href="http://blog.facebook.com/blog.php?post=382978412130" style="text-shadow: none;">Facebook's blog post on the topic</a> for a full understanding of how this works.
</p>
<h4 style="text-shadow: none;">Read About What is at Stake</h4>
<p style="text-shadow: none;">
If you represent your company's image or if you are involved in corporate communications of any kind, take the time to fully understand this trend.  John Bell says <a target="new" href="http://johnbell.typepad.com/weblog/2010/05/why-facebook-community-pages-are-no-big-deal-for-brandseventually.html" style="text-shadow: none;">Facebook Community Pages are no big deal</a> <em style="text-shadow: none;">once you accept what they are</em>.  Invest the time to read his article for an analytical perspective.  Once you've read that, study <a target="new" href="http://www.web-strategist.com/blog/2010/05/16/matrix-how-facebooks-community-pages-and-privacy-changes-impact-brands/" style="text-shadow: none;">Jeremiah Owyang's matrix on how Facebook Community Pages impact brands</a> and consider the advice he brings as a seasoned analyst.
</p>
<h4 style="text-shadow: none;">Example: BP on Facebook & Boycott BP Pages</h4>
<p style="text-shadow: none;">
Take BP for example.  When you search for BP on Facebook, you'll see a list similar to the one on the right.  The first result, "<a target="new" href="http://www.facebook.com/home.php?#!/pages/Boycott-BP/119101198107726?ref=ts" style="text-shadow: none;">Boycott BP</a>," is a Fan Page, or a page that a user created and owns.  <a target="new" href="http://www.facebook.com/home.php?#!/pages/BP/106073486089812?ref=ts" style="text-shadow: none;">The fourth one, an Organization page</a>, is a Community Page.  It shows the Wikipedia summary for BP and aggregated user posts on the company—all negative, given the recent oil spill in the Gulf of Mexico.
</p>
<h4 style="text-shadow: none;">Your Words and Actions Matter</h4>
<p style="text-shadow: none;">
While you never can insure against a coordinated social media attack, you can take action and do a few things consistently that earn respect and loyalty from your customers:
</p>
<ul style="text-shadow: none;">
    <li style="text-shadow: none;"><strong style="text-shadow: none;">Deserve the trust you seek by being honest.</strong>  Transparency doesn't mean showing all your cards, but it does mean telling the truth about the claims you make.</li>
    <li style="text-shadow: none;"><strong style="text-shadow: none;">Demonstrate expertise.</strong>  Build trust by showing your competency through how you interact socially on the web and through the content you produce about your product and industry.</li>
    <li style="text-shadow: none;"><strong style="text-shadow: none;">Demonstrate your commitment to your customers.</strong>  Follow through on the promises you make both privately and publicly.  By doing so, you'll give them every reason to speak well of you, and no reason to speak ill.</li>
    <li style="text-shadow: none;"><strong style="text-shadow: none;">Empathize with them.</strong>  Even when people have bad experiences with your product or service, a little empathy goes a long way.  See the problem from their perspective as you resolve it by doing the first three things.</li>
</ul>
<br style="text-shadow: none;" />
<h4 style="text-shadow: none;">The Best Defense is a Good Offense</h4>
<p style="text-shadow: none;">
You can pre-empt bad PR by creating your own advocacy program of engaged customers who promote you online.  <a target="new" href="http://www.web-strategist.com/blog/2009/09/22/checklist-develop-a-successful-advocacy-program/" style="text-shadow: none;">Jeremiah Owyang outlines how with this handy checklist</a>.
</p>
<h4 style="text-shadow: none;">Get Updates from KeyLimeTie</h4>
<p style="text-shadow: none;">
Please follow @<a href="http://www.twitter.com/keylimetie" target="new" style="text-shadow: none;">KeyLimeTie</a> on Twitter or <a href="http://www.facebook.com/keylimetie" target="new" style="text-shadow: none;">"Like" us on Facebook</a>.  We do our best to share useful information about the web, enterprise software, mobile technologies and how you can practically use social media for business.
</p>
]]></description> 
					<pubDate>Thu, 27 May 2010 21:39:38 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/5/27/keep-from-losing-control-of-your-brand-on-facebooks-new-community-pages/</guid>
				</item>
			
				<item>
					<title>.CO Domains: Your chance to get a cool domain name all over again.</title> 
					<link>http://keylimetie.com/blog/2010/5/25/co-domains-your-chance-to-get-a-cool-domain-name-all-over-again/</link> 
					<description><![CDATA[<div style="width: 200px;" class="BlogImageRight">
<img alt="I'm with CoCo" src="/Common/Images/Custom/blog/blog-coco.png" />
</div>
<p>
Just when you thought all the good domain names were taken, there's now a new opportunity to snap up a memorable domain—or even your brand name if your <em>.com</em> is taken.  If you have a registered trademark, you can apply register <em>yourname.co</em> via the .CO Registrars today.  If you don't have a trademark, you'll be able to get it as early as June 21.
</p>
<p>
What's this all about?  Just like <em>.biz</em>, <em>.info</em> and <em>.name</em>, <em>.co</em> is the latest of what the industry refers to as "top-level domains" to be offered for domain name registration.  The unique thing about .CO is it already carries similar credibility as .com around the world (think <em>.co.uk</em>, <em>.co.au</em> etc.) and that this is the first time .CO domains are being offered as top-level.  If you're interested in background information, <a target="new" href="http://www.wired.com/epicenter/2010/05/dotco/">check out this Wired Magazine article on .CO domains</a>.
</p>
<h4>Is it worth grabbing?</h4>
<p>
Yes and No.  If you want your domain now, during the Global Trademark Holder phase, it will set you back $300.  At that price, it’s not worth it for small businesses.
</p>

<p>
Once this becomes available at the $30 price, then it’s probably worth it.  'Dot-co' rolls off the tongue.  It connotes "company" and carries the familiarity of "dot-com."  Plus, you have the opportunity to grab your first choice domain name if your dot-com is taken.
</p>
<h4>Register Your Own .CO</h4>
<p>
Here are our recommendations for getting your own .CO domain:
</p>
<ul>
    <li><strong>Brand Managers:</strong> If you have a registered trademark and a high-value brand, <a target="new" href="http://www.cointernet.co/registrars/co-registrars">register your .CO domain now</a> before registration opens to the public.  Only do this if your name is high-value as it will set you back $300 per domain.</li>
    <li><strong>Small Businesses:</strong> Wait until the Standard Pre-Registration phase that starts July 20.  Then the price will be a reasonable $30, and at that point we recommend you grab the .co domain.
    </li>
    <li><strong>Everyone:</strong> Before the Standard Pre-Registration phase starts on July 20, think of opportunities to register just a couple generic domains relevant to your business that will have high search engine optimization (SEO) value (<em>e.g. chicago-pizza.co</em>).  If high traffic either globally or from a specific region is valuable to you, you have another shot at creating a site that naturally ranks high for a generic search term.</li>
</ul>
<br />
<h4>Get Updates from KeyLimeTie</h4>
<p>
Please follow @<a target="new" href="http://www.twitter.com/keylimetie">KeyLimeTie</a> on Twitter or <a target="new" href="http://www.facebook.com/keylimetie">"Like" us on Facebook</a>.  We do our best to share useful information about the web, enterprise software, mobile technologies and how you can practically use social media for business.
</p>
]]></description> 
					<pubDate>Tue, 25 May 2010 23:32:21 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/5/25/co-domains-your-chance-to-get-a-cool-domain-name-all-over-again/</guid>
				</item>
			
				<item>
					<title>While Mobile OSes Fragment, the Mobile Web is Converging</title> 
					<link>http://keylimetie.com/blog/2010/5/19/while-mobile-oses-fragment-the-mobile-web-is-converging/</link> 
					<description><![CDATA[<p>
In an O'Reilly Radar report, mobile evangelist Jason Grigsby (@<a href="http://www.twitter.com/grigs" target="new">grigs</a>) <a href="http://radar.oreilly.com/2010/05/mobile-operating-systems-and-b.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+oreilly%2Fradar%2Fatom+%28O%27Reilly+Radar%29
" target="new">captures two mobile trends that might be surprising</a>.  Much unlike the desktop market, which has long been dominated by Windows with MacOS running a distant second, mobile devices are seeing increased fragmentation in operating systems.  At the same time, web standards are bringing mobile web browsers closer together in similarity.
</p>

<h4>What does this mean to you?</h4>

<p>
Assuming you're either an enterprise IT manager, mobile marketer or small business owner looking at opportunities to communicate and connect via mobile, what does this mean for you?  It will be increasingly difficult to reach a majority of your audience by building a native application (mobile app) for just one operating system.  You'll have a much better time making content widely available if you embrace the mobile web.  However, if you require an app for whatever reason, you'll be smart to target your platforms based on your most loyal and most profitable audience(s).  There are smart ways to go about building apps and successes to be had if you give the process careful thought.
</p>

<h4>Just the Facts</h4>

<p>
Here are a few highlights from the article to give further detail.  However, I encourage you to <a href="http://radar.oreilly.com/2010/05/mobile-operating-systems-and-b.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+oreilly%2Fradar%2Fatom+%28O%27Reilly+Radar%29
" target="new">read the full article with many more facts and figures</a>.
</p>

<p>
Grigsby compiled mobile OS stats since 2006, noting that 'In 2006, two mobile operating systems controlled 81 percent of the market. This year there are 10 different smartphone operating systems'.  Further observations include the facts that:
</p>

<ul>
	<li>No single mobile OS has greater than 50% marketshare.</li>
	<li>Samsung will be <a href="http://www.bada.com/" target="new">releasing its own OS</a> and <a href="http://www.bloomberg.com/apps/news?pid=20601204&sid=a9YAooOZlAnI" target="new">HTC is considering producing its own</a>.  Grigsby cites reasons to take these OSes seriously based on the manufacturers' marketshare.</li>
	<li>Android OS has been fragmented across handset manufacturers as several have overlayed their own user interfaces (<a href="http://motorola.com/motoblur" target="new">MotoBlur</a> and <a href="http://en.wikipedia.org/wiki/HTC_Sense" target="new">Sense UI</a>).</li>
</ul>

<p>
While operating systems diverge, the report continues to outline how the mobile web is converging on HTML5 and WebKit.  The only mobile browser that won't support HTML5 and WebKit for now is Internet Explorer, though indications show that future versions of the mobile IE will also support it.
</p>

<div class="BlogImageCenter" style="width: 540px;">
<img src="/Common/Images/Custom/blog/blog-webkit-marketshare.png" alt="2009 Smartphone Market Share (Gartner)" /></a>
</div>

<p>
For complete analysis, read <a href="http://radar.oreilly.com/2010/05/mobile-operating-systems-and-b.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+oreilly%2Fradar%2Fatom+%28O%27Reilly+Radar%29
" target="new">Jason Grigsby's article at O'Reilly Radar</a>.
</p>

<h4>Get Updates from KeyLimeTie</h4>

<p>
Please follow @<a href="http://www.twitter.com/keylimetie" target="new">KeyLimeTie</a> on Twitter or <a href="http://www.facebook.com/keylimetie" target="new">'Like' us on Facebook</a>. We do our best to share useful information about the web, enterprise software, mobile technologies and how you can practically use social media for business.
</p>]]></description> 
					<pubDate>Wed, 19 May 2010 16:06:14 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/5/19/while-mobile-oses-fragment-the-mobile-web-is-converging/</guid>
				</item>
			
				<item>
					<title>Fix your Facebook privacy settings with this handy tool</title> 
					<link>http://keylimetie.com/blog/2010/5/17/fix-your-facebook-privacy-settings-with-this-handy-tool/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<a href="http://www.reclaimprivacy.org"><img src="/Common/Images/Custom/blog/blog-facebook-privacy2.png" alt="Reclaim Privacy's tool shows Green for secure privacy settings and Red for insecure ones." /></a>
Reclaim Privacy's tool shows Green for secure privacy settings and Red for insecure ones.
</div>
<p>
Facebook has taken a lot of heat in the last couple weeks on privacy issues.  New defaults mean a lot of the information you share is public.  While you can control all of this, <a href="http://www.nytimes.com/interactive/2010/05/12/business/facebook-privacy.html" target="new">the control panel is complex and confusing</a>.
</p>
<p>
Are you concerned about your own privacy on Facebook?  We recommend you use this handy tool provided by <a href="http://www.reclaimprivacy.org" target="new">ReclaimPrivacy.org</a> to check how secure or insecure your profile is based on your privacy settings.  When your settings are insecure, it even links you right to the relevant privacy settings page so you can make the changes right away.
</p>
<h4>Do This Now</h4>
<br />
<ul>
    <li><strong>Visit <a href="http://www.reclaimprivacy.org" target="new">ReclaimPrivacy.org</a> and follow their simple instructions</strong> for checking your Facebook privacy settings.  I did this and it took me just a minute or two to read the steps, install the bookmarklet, visit Facebook and see what I was leaving exposed.  My profile was pretty locked down already, but I did leave one thing open.</li>
    <li><strong>Share it with your friends.</strong>  The Facebook privacy settings are confusing, even if you're computer-savvy.  This tool helped me, and it will help many others understand what they are and aren't sharing.</li>
</ul>
<br />

<p>
<b>Get Updates from KeyLimeTie</b><br />
Please follow @<a href="http://www.twitter.com/keylimetie" target="new">KeyLimeTie</a> on Twitter or <a href="http://www.facebook.com/keylimetie" target="new">'Like' us on Facebook</a>.  We do our best to share useful information about the web, enterprise software, mobile technologies and how you can practically use social media for business.
</p>]]></description> 
					<pubDate>Mon, 17 May 2010 20:54:12 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/5/17/fix-your-facebook-privacy-settings-with-this-handy-tool/</guid>
				</item>
			
				<item>
					<title>Roundup of Useful Mobile Marketing Stats</title> 
					<link>http://keylimetie.com/blog/2010/5/17/roundup-of-useful-mobile-marketing-stats/</link> 
					<description><![CDATA[<p>
Blog <em>We Are Organized Chaos</em> published a great <a target="new" href="http://weareorganizedchaos.com/index.php/2010/05/12/whats-new-in-mobile-marketing-051210/">roundup of recent mobile marketing stats</a>.  You'll want to save this post for reference and go through them at your leisure.
</p>

<h4>Full Roundup: <a target="new" href="http://weareorganizedchaos.com/index.php/2010/05/12/whats-new-in-mobile-marketing-051210/">What's New in Mobile Marketing</a></h4>

<br />

<p>
<b>So what's the big deal?</b><br />
The first link boldly states that <a target="new" href="http://www.mobilemarketingwatch.com/study-82-of-brands-plan-to-boost-mobile-budgets-over-next-12-months-6448/">82% of brands plan to boost mobile budgets over the next 12 months</a>.  In 2009, marketing & ad budgets started shifting from traditional to social media.  This year, we're seeing mobile rapidly take over the social experience.  With the ability to target your message and communicate 1:1, you can engage with your most loyal customers and build that loyalty even further.
</p>
<p>
Just realize that mobile is one channel—albeit one rapidly increasing in importance—in your marketing mix.  For some perspective, check this Mobile Marketer article; <a target="new" href="http://www.mobilemarketer.com/cms/sectors/marketing/6191.html">Why brands must have a 360-degree mobile Web strategy</a>.
</p>]]></description> 
					<pubDate>Mon, 17 May 2010 20:24:27 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/5/17/roundup-of-useful-mobile-marketing-stats/</guid>
				</item>
			
				<item>
					<title>The Right Way to make your Social Media Mea Culpa</title> 
					<link>http://keylimetie.com/blog/2010/5/12/the-right-way-to-make-your-social-media-mea-culpa/</link> 
					<description><![CDATA[<p>
Afraid of screwing up with your customers online?  If the technical side of the web wasn't daunting enough, it gets more so when you add people.  We've all seen and read the stories of communications gaffes that have resulted in an online firestorm for the company.  Some mistakes are innocent, while others are arguably a result of poor customer service, PR people not getting it, or even dishonesty that finds the company out.  Here are a few examples:
</p>

<ul>
	<li><a href="http://mashable.com/2008/11/16/motrin-moms/" target="new">Motrin Moms ad campaign</a></li>
	<li><a href="http://www.davecarrollmusic.com/ubg/" target="new">United Breaks Guitars</a></li>
	<li><a href="http://news.cnet.com/8301-13577_3-20000805-36.html" target="new">Greenpeace and Nestl&eacute; duke it out on Facebook</a></li>
	<li><a href="http://www.businessweek.com/bwdaily/dnflash/content/oct2006/db20061009_579137.htm" target="new">Wal-Marting Across America Astroturfing</a></li>
</ul>

<p>
So what about when it happens to you?  What if a customer or constituent gets upset by something you do and they decide to take it to the web?
</p>

<h4><a href="http://adage.com/digital/article?article_id=143769" target="new">Read this Advertising Age Article: The Right Way to Make Your Social-Media Mea Culpa</a></h4>

<p>
Have you had an experience like this?  Maybe yours wasn't on as broad of a scale, but if you've had something like this happen, please take a minute to share what happened and what you did to make it right below in the comments.
</p>
]]></description> 
					<pubDate>Wed, 12 May 2010 16:02:26 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/5/12/the-right-way-to-make-your-social-media-mea-culpa/</guid>
				</item>
			
				<item>
					<title>Mobile marketing does not stand alone: a report from Mobile University</title> 
					<link>http://keylimetie.com/blog/2010/5/4/mobile-marketing-does-not-stand-alone-a-report-from-mobile-university/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<img src="/Common/Images/Custom/blog/blog-mobile-university.jpg" alt="Mobile University" />
The mobile marketing & advertising ecosystem.
</div>

<p>
The degree of success you have marketing via mobile is directly related to the degree of seriousness with which you treat it as a channel.  Your mobile efforts, whether using the web, apps, or other means of communicating with a person on their phone should never be treated as a standalone medium.
</p>

<p>
These are just two of the core insights outlined at the <a href="http://www.mobiu101.com" target="new">Mobile University</a> conference that brought together agency and brand representatives to talk about what works in mobile marketing and where the medium is going.  The conference served to both reinforce and enhance the approach KeyLimeTie takes with our clients.
</p>

<p>
When you isolate your mobile efforts to one-off campaigns, you risk throwing away a lot of work; as if you launched a website only to wind it down weeks later.  Instead, think in terms of 12-month cycles for your marketing objectives instead of a 'quick-win' 8-week campaign.
</p>

<p>
Whether you develop your mobile solution in-house or contract to an agency or development team like KeyLimeTie, realize the real value lies when you build a long-term program for engagement, complete with multiple campaigns integrated with your overall marketing strategy for the year.  Your mobile marketing efforts should result in a channel through which you communicate on an ongoing basis.  
</p>

<p>
The key is to first understand mobile devices for what they are.  What are your consumers already doing on their phones, and how can you enable those behaviors?
</p>

<div class="QuoteBlock Right" style="width: 250px;">
&ldquo;Mobile is the<br />
snack food<br />
of your day.&rdquo;
</div>

<p>
People use mobile devices on breaks, pauses, for short bursts and in moments of periodic downtime.  They also use it when they need information to make a quick decision.  Consumers are a lot smarter than us&mdash;the marketers, brand managers and developers directly involved in marketing a product or service&mdash;so don't just do something for the sake of doing it, make it make sense with them and their habits.
</p>

<h4>Mobile Campaign Tips:</h4>

<ul>
	<li><b>For every $1 you spend</b> developing and executing a mobile marketing campaign, be prepared to spend another $2 promoting it.</li>
	<li><b>Allow your customer to treat their phone as a 'mobile mouse.'</b> QR codes let you "click" on things in the real world, taking them from real world experiences to digital ones they see on their phones.  This can provide entertainment, information, connection and other kinds of value.</li>
	<li><b>Know how people use apps.</b> After a user has 5 or more apps installed, there's a significant drop off in app usage on a monthly basis.  Build in weekly interactions with your users to stay on their radar.  Push Alerts on the iPhone and Android are one way of accomplishing this.</li>
</ul>	

<p>
Looking to build your mobile strategy?  Talk to KeyLimeTie and we'll walk you through how.
</p>]]></description> 
					<pubDate>Tue, 04 May 2010 19:55:10 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/5/4/mobile-marketing-does-not-stand-alone-a-report-from-mobile-university/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie&amp;quot;s First Internal Hackathon Contest: Our Experience</title> 
					<link>http://keylimetie.com/blog/2010/4/27/keylimeties-first-internal-hackathon-contest-our-experience/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<img src="/Common/Images/Custom/blog/blog-hackathon-team.jpg" alt="Scene from the KeyLimeTie Hackathon" />
Scene from the KeyLimeTie Hackathon
</div>
<p>
On April 23, 2010, KeyLimeTie employees came together to present their entries from the first KeyLimeTie Hackathon, our first ever internal development and innovation contest.  Most Hackathons span a short period of time—from 24 to 48 hours from start to finish.  We gave each of the three KeyLimeTie teams several weeks to design, develop and deliver their projects. Teams were handpicked based on role and skill level, and we intentionally placed people who seldom interact on projects on the same teams.
</p>
<h4>The Rules</h4>
<p>
The contest was simple; teams were to pick at least two APIs from <a href="http://www.programmableweb.com" target="new">Programmable Web</a> and create something interesting.  To keep things original, teams could not use the same APIs as competing teams.
</p>
<div class="BlogImageRight" style="width: 300px;">
<img src="/Common/Images/Custom/blog/blog-hackathon-banner.jpg" alt="KeyLimeTie Hackathon Contest" />
</div>
<p>
For some of the employees, this was a rare chance to be creative and go beyond their normal roles and responsibilities.  The experience yielded market-ready products and tools, and some great laughs and memories.
</p>
<h4>Personal Reflections</h4>
<p>
I have organized and participated in several developer Hackathons and can easily attest to their role as a catalyst for innovation, creative problem solving and community building.  The KeyLimeTie Hackathon was no different.  We gave a talented group of people some raw materials and a little encouragement and were blown away with the results.  You can do the same. 
</p>
<p>
Incidentally, you will see the applications built during the Hackathon integrated into the KeyLimeTie Content Management System (CMS), as well as available for integration into your own websites.  You can stay tuned for updates by following us on <a href="http://www.twitter.com/keylimetie" target="new">Twitter</a> or <a href="http://www.facebook.com/keylimetie" target="new">Facebook</a>.
</p>
]]></description> 
					<pubDate>Tue, 27 Apr 2010 21:53:40 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/4/27/keylimeties-first-internal-hackathon-contest-our-experience/</guid>
				</item>
			
				<item>
					<title>Chicago Tribune Column &quot;Minding Your Business&quot; Features KeyLimeTie</title> 
					<link>http://keylimetie.com/blog/2010/4/26/chicago-tribune-colunn-minding-your-business-features-keylimetie/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<a href="http://www.chicagotribune.com/business/columnists/ct-biz-0426-small-biz-minding--20100426,0,6459196,full.column" target="new">
<img src="/Common/Images/Custom/blog/blog-tribune-screenshot.png" alt="Minding Your Business Column" />
Chicago Tribune column featuring KeyLimeTie
</a>
</div>

<p>
Last week, Chris Pautsch and Peter Morano were interviewed by the Chicago Tribune about the things KeyLimeTie is doing on the mobile web and with mobile applications.  Some of our comments made it into today's Minding Your Business column by Ann Meyer.  Read the entire Chicago Tribune article here: <a href="http://www.chicagotribune.com/business/columnists/ct-biz-0426-small-biz-minding--20100426,0,6459196,full.column" target="new">Startups use mobile space to innovate, grow</a>.
</p>

<p>
To underscore the article, remember these key points when looking to jump into mobile for your own company:
</p>

<h4>Strategy Before Tactics</h4>

<p>
Everyone wants to develop a mobile app because they're seen as sexy.  Be careful though to examine what your goals are, who your target audience is, and the best way to reach them with timely, personal information.  It may not be an app.  SMS campaigns and response mechanisms like QR codes that point to a mobile web site may yield greater results depending on who you are reaching and what you're trying to accomplish.
</p>

<h4>Focus on the Mobile Web</h4>

<p>
Aside from social networking and email, search (especially finding directions, including potentially to your location) is a leading activity on the mobile phone.  Give your customers the best mobile web experience you can.  Anticipate their needs and help them achieve them seamlessly and they'll love you for it.
</p>

<h4>Be Real and Make it Relevant</h4>

<p>
People consider their mobile phones to be very personal.  When people load your app or opt-in to mobile communications from you, they're demonstrating a high degree of trust.  Note not to communicate excessively via SMS messages or based on a person's location as this can be seen as very intrusive.  Use these techniques infrequently and with your most loyal customers who have expressed interest in receiving these types of messages (this also includes Push Notifications sent to smartphone apps).
</p>

<h4>Relevant KeyLimeTie Mobile Links</h4>

<ul>
	<li><a href="http://www.keylimetie.com/blog/2010/3/9/day-of-mobile-hackathon-winners/">Day of Mobile Hackathon</a></a>
	<li><a href="http://www.keylimetie.com/blog/2009/11/2/keylimetie-sponsors-and-jumps-in-feet-first-to-socialdevcamp-chicago-2009/">SocialDevCamp Chicago Hackathon</a></li>
	<li><a href="http://www.ilime.com" target="new">iLime - iPhone Push Notification Service</a></li>
	<li><a href="http://www.keylimetie.com/blog/2009/10/29/early-success-for-keylimetie-iphone-application-client-the-secret-trade-daily-teachings/">The Secret Daily Teachings iPhone App</a></li>
	<li><a href="http://www.keylimetie.com/blog/2009/11/10/sloan-valve-releases-water-savings-calculator-iphone-app/">Sloan Water Savings Calculator iPhone App</a></li>
</ul>]]></description> 
					<pubDate>Mon, 26 Apr 2010 21:17:08 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/4/26/chicago-tribune-colunn-minding-your-business-features-keylimetie/</guid>
				</item>
			
				<item>
					<title>CIO Peter Morano to speak at IIT on Developing a Successful Mobile Strategy</title> 
					<link>http://keylimetie.com/blog/2010/4/16/cio-peter-morano-to-speak-at-iit-on-developing-a-successful-mobile-strategy/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 200px;">
<img src="/Common/Images/Custom/blog/blog-pete.jpg" alt="Peter Morano" />
Peter Morano
</div>

<p>
Are you curious about mobile, but don't know where to start?  Our CIO, Peter Morano, will speak Thursday April 22 from 6:00-8:00 P.M. at the Illinois Institute of Technology Knapp Center on <a href="http://knappmobile.eventbrite.com/" target="new">Developing a Successful Mobile Strategy</a>.
</p>

<p>
Come learn how why reaching your customers and your market must be your central goal, and why this doesn't necessarily mean you need to develop an app.  Peter will talk about:
</p>

<ul>
	<li>Methods for connecting with a mobile audience</li>
	<li>Engaging your audience effectively</li>
	<li>The differences between various mobile platforms</li>
	<li>How these factors affect market reach</li>
</ul>

<p>
<a href="http://knappmobile.eventbrite.com/" target="new">Register today to see Pete speak at the Knapp Center on the 22nd</a>.  The event is free to attend, but RSVP is required.
</p>]]></description> 
					<pubDate>Fri, 16 Apr 2010 23:13:10 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/4/16/cio-peter-morano-to-speak-at-iit-on-developing-a-successful-mobile-strategy/</guid>
				</item>
			
				<item>
					<title>Naperville Running Company &quot;Goes Green&quot; with a site from KeyLimeTie</title> 
					<link>http://keylimetie.com/blog/2010/4/9/naperville-running-company-goes-green-with-a-site-from-keylimetie/</link> 
					<description><![CDATA[<div style="width: 300px;" class="BlogImageRight">
<a target="new" href="http://www.runningcompany.com">
<img alt="Naperville Running Company" src="/Common/Images/Custom/blog/blog-naperville-running.png" />
</a>
</div>
<p>
We're happy to announce the launch of a new web site for our friends at the <a target="new" href="http://www.runningcompany.com">Naperville Running Company</a>.  They're a great running shop in downtown Naperville and they've made quite a name for themselves.  Not only do they sell a wide range of running supplies, they host regional races and have even been selected as the #1 running store in the country by Formula4Media, hosts of the 2009 Running Event trade show.
</p>
<p>
This isn't just any other client for us, though.  Here's the backstory:
</p>
<div style="width: 184px;" class="BlogImageLeft">
<img alt="Tracy and me during the MC200." src="/Common/Images/Custom/blog/blog-brian-tracy.png" />
Tracy and me during the MC200.
</div>
<p>
Last summer I was in a pinch to find the right shoes to run 20 of the 200 miles in the <a target="new" href="http://mc200.com/">MC200 relay from Madison to Chicago</a>.  KeyLimeTie had a team and I had just bitten the racing bug.  Their store was the only store to take the time to get to know me, my running history and my goals when they sold me a pair of shoes.
</p>
<p>
This year, Naperville Running Company turned to us to build them a new web site.  We're quite happy with the results, and are glad they are too (especially because Team KeyLimeTie will be needing a lot of running gear for this year's MC200 race)!  Also, be on the lookout for the Naperville Running Company iPhone application in the iTunes store at the beginning of June.
</p>
]]></description> 
					<pubDate>Fri, 09 Apr 2010 20:18:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/4/9/naperville-running-company-goes-green-with-a-site-from-keylimetie/</guid>
				</item>
			
				<item>
					<title>Tim Courtney nominated for ITA CityLIGHTS Award for work with SocialDevCamp</title> 
					<link>http://keylimetie.com/blog/2010/4/8/tim-courtney-nominated-for-ita-citylights-award-for-work-with-socialdevcamp/</link> 
					<description><![CDATA[<div style="width: 251px;" class="BlogImageRight">
<a target="new" href="http://www.illinoistech.org">
<img alt="Illinois Technology Association" src="/Common/Images/Custom/blog/blog-ita-logo.png" />
</a>
</div>
<p>
It gives me great pleasure to announce to our clients and to the industry as a whole that KeyLimeTie's <a href="/about/team/tim-courtney/">Tim Courtney</a> was recently selected alongside <a target="new" href="http://www.twitter.com/andyangelos">Andy Angelos</a> as finalists for the <a target="new" href="http://www.illinoistech.org">Illinois Technology Association</a>'s annual CityLIGHTS awards for their work producing the <a target="new" href="http://www.socialdevcampchicago.com">SocialDevCamp Chicago</a> conference.
</p>
<p>
The SocialDevCamp team joins other area leaders as nominees in the annual award that highlights the outstanding contributions of both individuals and companies in the Illinois technology industry.  The ITA will announce the award recipient at the <a target="new" href="http://www.itacitylights.org/register.html">annual CityLIGHTS award gala on April 29 at Union Station</a>.  Please join me in wishing Tim and Andy well.
</p>
<p>
KeyLimeTie had the privilege of sponsoring SocialDevCamp Chicago 2009 last November, an event that attracted over 200 developers, entrepreneurs and social application enthusiasts to learn about and create social applications.  Keynote speakers included Facebook and Google senior developers who shared strategies behind their respective companies work building the infrastructure of the social web.
</p>
<p>
To learn more about SocialDevCamp, see Tim and Andy discuss the conference in this highlight video:
</p>
<center>
<object width="640" height="385">
<param name="movie" value="http://www.youtube.com/v/C4x57zHTlh8&hl=en_US&fs=1&">
<param name="allowFullScreen" value="true">
<param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/C4x57zHTlh8&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="295" width="480"></object>
</center>
]]></description> 
					<pubDate>Thu, 08 Apr 2010 22:24:05 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/4/8/tim-courtney-nominated-for-ita-citylights-award-for-work-with-socialdevcamp/</guid>
				</item>
			
				<item>
					<title>iPad, the tablet shift, and what this means for the laptop</title> 
					<link>http://keylimetie.com/blog/2010/4/2/ipad-the-tablet-shift-and-what-this-means-for-the-laptop/</link> 
					<description><![CDATA[<p>
Of all of the bold statements made surrounding the iPad, one of the most notable came from Shervin Pishevar at SXSW Interactive.  '<a href="http://twitter.com/shervin/status/11416582985" target="new">The laptop is the rotary phone of our generation</a>,' he quipped.  This quote has been resonating with me over the last couple days as I've been thinking through what tablet computers and tablet apps mean for how we will use computers in the short months and years to come.
</p>

<div class="BlogImageCenter" style="width: 580px;">
<a href="http://twitter.com/shervin/status/11416582985" target="new">
<img src="/Common/Images/Custom/blog/blog-ipad-shervin-quote.png" alt="The laptop is the rotary phone of our generation" />
</a>
</div>
<br />

<p>
On the eve of securing my own iPad, I've been thinking through the types of apps I'll want to load on it for both fun and productivity.  Presumably, I'll carry the iPad around more than my three year old MacBook Pro, even though that machine has my most used applications (including Microsoft Office, iWork and Adobe Creative Suite in addition to handy programs like TextWrangler and Omni Outliner).  However, the iPad will fill a fundamentally different space.  I imagine I'll still use the laptop for the heavy-duty work like long-form writing and building presentations, where I'll mostly use the iPad for things like email, note-taking, social networking, and perhaps video editing.
</p>



<p>
<div class="BlogImageRight" style="width: 300px;">
<a href="http://www.omnigroup.com/products/omnigraphsketcher-ipad/" target="new">
<img src="/Common/Images/Custom/blog/blog-ipad-omni.png" alt="OmniGraphSketcher for the iPad" />
</a>
OmniGraphSketcher for the iPad
</div>

But this is a fundamental shift, so my expectations now could end up being very wrong.  Given the sophistication of some of the apps I've seen (for example, the <a href="http://www.omnigroup.com" target="new">Omni Group</a>'s productivity apps), the iPad may well become a primary productivity tool when I'm on the go.  In fact, with the proven ingenuity of the iPhone developer community throwing all of its collective creativity at a larger screen, it most likely will.
<p>

<p>
In essence, the <i>app paradigm</i> scaled up from a phone to a tablet takes the 'computer' out of the picture.  Purpose-built touch-based apps for iPhone OS, Android and other emerging platforms make both fun and producivity more accessible to the mass market of people who don't consider themselves particularly good with computers&mdash;so much so that popular tech pundit David Pogue wrote a <a href="http://www.nytimes.com/2010/04/01/technology/personaltech/01pogue.html?pagewanted=1" target="new">comprehensive iPad review from both the perspective of 'techies' and non-techies</a>.  Pogue says;
</p>

<p style="font-family: Georgia; font-style: italic; padding: 0px 40px 0px 40px;">
'The iPad is so fast and light, the multitouch screen so bright and responsive, the software so easy to navigate, that it really does qualify as a new category of gadget. Some have suggested that it might make a good goof-proof computer for technophobes, the aged and the young; they’re absolutely right.'
</p>

<p style="font-family: Georgia; font-style: italic; margin-left: 400px; margin-bottom: 15px;">
	&mdash;<a href="http://www.nytimes.com/2010/04/01/technology/personaltech/01pogue.html?pagewanted=1" target="new">David Pogue</a>
</p>

<p>
The new touch interface, app paradigm, and end-to-end user experience that results creates a new generation of computer users who won't even realize that's what they are.  Some day soon we may see the word 'computer' disassociated with portable devices; people will still refer to Desktops as computers, but an iPad?  'Oh, that's my tablet.' The laptop may eventually fade into memory.
</p>

<p>
So now my question is this; two years from now when I had planned to replace my laptop, will I even want one?
</p>]]></description> 
					<pubDate>Fri, 02 Apr 2010 21:39:40 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/4/2/ipad-the-tablet-shift-and-what-this-means-for-the-laptop/</guid>
				</item>
			
				<item>
					<title>SXSW Report: Why Contexts Matter to Your Customers</title> 
					<link>http://keylimetie.com/blog/2010/3/22/sxsw-report-why-context-matters-to-your-customers/</link> 
					<description><![CDATA[<p>
Human interactions with computers are shifting rapidly away from the desktop.  Thanks to mobile devices and social media channels, the traditional web site, the cornerstone sales and marketing tool of B2B and B2C companies for the last fifteen years, is diminishing in relative importance as the primary way customers gain information about you.  Experts used to predict the convergence of media to a single device, however today we're seeing media (content) delivered to and consumed via many distinct types of devices&mdash;the most notable being the mobile phone (and soon the tablet, thanks to the innovation being spurred by the iPad).
</p>

<p>
In 2009, mobile web usage more than doubled.  Today, Google is encouraging local search through initiatives like its <a href="http://keylimetie.com/blog/2010/1/20/what-googles-local-mobile-search-push-means-to-your-small-business/" target="new">Favorite Places program</a> and by beefing up its mobile web interface.  Businesses, especially local ones, are looking to both mobile web and mobile apps to connect with customers on their terms.  Companies looking to stay connected with their customers must address the fact that more and more people are accessing the web via the mobile phone.
</p>

<p>
At SXSW Interactive, Adobe Systems' platform evangelist Kevin Hoyt (@<a href="http://www.twitter.com/parkerkrhoyt" target="new">parkerhoyt</a>) delivered a thoughtful talk to these developers entitled 'Best Practices for Contextual Applications.'  Hoyt's central point was that people are consuming more content through more screens than ever before, and content creators must deliver that content through a consistent, integrated, and seamless user experience.
</p>

<br />
<h3>Expectations are High, Regardless of Context</h3>

<p>
The interactive industry refers to the process of developing for these various devices as <i>contexts</i>.  As people increase their exposure to web content, the interactions are fragmenting across devices.  To the customer, your brand is your brand, no matter through what context they are interacting with you.  Your job is to deliver a consistent, high-quality experience across contexts, strengthening your relationship with your customers on their terms and on the device of their choice.
</p>

<p>
Thinking of your user as 'just an iPhone user' or 'just a browser user' is limiting.  The people who comprise your market <i>will</i> move between contexts.  Further, these people will take their data with them from context to context.  Whether they are out for a run, at their desktop, or on the go with their phones, they will expect to be able to access their information wherever they are and regardless of the type of data.
</p>

<div class="BlogImageCenter" style="width: 580px;">
<img src="/Common/Images/Custom/blog/blog-contextualapps.jpg" alt="User Experience persists across contexts." />
People will demand the same quality experience across contexts, but the ways they interact and the information they need will differ based on context.
</div>

<br />
<h3>Contexts in Action</h3>

<p>
The <a href="http://www.nytimes.com" target="new">New York Times</a> adapts their context based on how people are consuming the information.  Even their 'freemium' pricing model varies from context to context, based on how people use the information they provide within each.  As an organization, they are laser-focused on unlocking new revenue potential among the various contexts, providing content on the web, mobile web, natively on the desktop via the <a href="http://timesreader.nytimes.com/timesreader/index.html" target="new">Times Reader</a>, and even on devices like the Chumby.  They realize that people will use the data differently depending on context, and present and price differently in kind.
</p>

<p>
You interact with multiple contexts each and every day.  These contexts include:
</p>

<ul>
<li>Desktop/Laptop Computer software applications, <i>e.g.</i> Microsoft Word</li>
<li>Web Browser, <i>e.g.</i> web sites</li>
<li>Desktop or Dashboard Widgets</li>
<li>Mobile Phones, including mobile web and native applications for iPhone or Android devices</li>
<li>Tablet Computer, <i>e.g.</i> iPad</li>
<li>Automobile dashboard or heads-up screens</li>
<li>Nike+ and other input devices</li>
<li>Video game consoles such as Xbox, Nintendo Wii and PS3</li>
<li>Home appliances</li>
<li>Ambient consumer electronics devices such as the <a href="http://www.chumby.com/" target="new">Chumby</a></li>
</ul>

<br />
<h3>Requirements for Contextual Applications</h3>

<p>
To succeed at reaching your audience across contexts, you must address the requirements needed to deliver a consistent, high quality experience.
</p>

<ul>
<li><b>Ubiquity</b> - Your content needs to be everywhere your users are consuming information from, regardless of the context.  Know the contexts your users use, and prioritize development of interfaces for those contexts in alignment with your sales process and strategic priorities.</li>
<li><b>Workflow</b> - Before you design for multiple contexts, build the workflow of how users interact on&mdash;and between&mdash; each.  With a proper workflow you can put together a good experience across devices.</li>
<li><b>Cloud Servers</b> - By using a cloud-based server infrastructure like Amazon EC2, Rackspace, or Salesforce.com, you allow your applications to share common databases and to scale seamlessly.  If you are serving video to an international user base, consider a content delivery network to handle the heavy lifting of video with minimal lag time no matter where your users are in the world.</li>
<li><b>Social Media Services</b> - Gain users and add features by using the APIs on popular social networks, including Facebook, Twitter, LinkedIn, YouTube, MySpace, etc.  Also, you can integrate content with more focused social sites like SlideShare for presentations and Delicious for bookmarks.</li>
</ul>

<br />
<h3>KeyLimeTie Can Help</h3>

<p>
Looking to extend beyond your corporate web site and meet users on their phones, on the social web, or on their tablets and iPads?  KeyLimeTie has a team of seasoned, versatile cross-platform developers with digital strategy and design capabilities to provide you a full solution.  To explore further, give us a call at 630.598.9000.  
</p>]]></description> 
					<pubDate>Mon, 22 Mar 2010 18:41:02 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/3/22/sxsw-report-why-context-matters-to-your-customers/</guid>
				</item>
			
				<item>
					<title>SXSW Report: Facebook and Digg on &quot;Designing the First 15 Minutes&quot;</title> 
					<link>http://keylimetie.com/blog/2010/3/16/sxsw-facebook-digg-on-designing-the-first-15-minutes/</link> 
					<description><![CDATA[<p>
Small changes in the way people first encounter your web site can make a big difference in the results you get.  Careful attention to the initial pages on your site&mdash;before and after a user registers&mdash;can make the difference between a successful site and an unsuccessful one.  So, what works and what doesn't, and how do you measure this?  Clearly defining your goals, learning from the experience of successful sites, and being open to make small changes will allow you top maximize the number of people who say 'yes' to the value proposition you offer.
</p>

<div class="BlogImageRight" style="width: 300px;">
<img src="/Common/Images/Custom/blog/blog-sxsw-designing15.jpg" alt="Geni.com screenshot" />
Daniel Burka and Rob Goodlatte at SXSW Interactive.
</div>

<p>
At SXSW, former Digg Creative Director Daniel Burka (@<a href="http://www.twitter.com/dburka" target="new">dburka</a>, now of game developer <a href="http://www.tinyspeck.com/" target="new">Tiny Speck</a>), and <a href="http://fb.me/g" target="new">Rob Goodlatte</a> of Facebook gave an excellent presentation on this topic, sharing insights from successfully winning  over millions of attention-deficient and critical users who visit some of the most popular web sites online.  Here we'll share what we learned about the emergence of game mechanics in design, the 'Aha Moment!' and the power of and rewarding users while doing.
</p>

<p>
Burka began the talk by telling the story of how getting a dog in downtown San Francisco caused him to need to buy a car, outlining the new car buying experience and the exact steps the salesperson used to hook him and his girlfriend on wanting to buy the car they were test driving.
</p>

<p>
What does this have to do with optimizing a site for user interactions?  Designers build in similar 'tricks' to attract users to <i>convert</i> or do some desirable action like enter their personal information, sign up for a newsletter or fan page, or even make a purchase.  (<a href="http://www.facebook.com/notes/facebook-design/liveblogging-designing-the-first-fifteen-minutes/381301322792" target="new">You can read the entire story in the notes from the talk</a>).
</p>

<p>
Goodlatte led his remarks by saying that 'Often we can't see the problems in our own products, because we're too focused on how <i>we</i> use them every day.'  As a designer or as a marketer hiring a design team, you can't always revisit your own product with fresh eyes.  This is why it is <strikeout>important</strikeout> critical to put yourself in the shoes of someone encountering your product for the first time.  As designers, we cannot be be afraid to be proven wrong, especially when designing with new users in mind.
</p>

<div class="BlogImageLeft" style="width: 300px;">
<a href="http://www.geni.com" target="new">
<img src="/Common/Images/Custom/blog/blog-sxsw-designing15-geni.png" alt="Geni.com screenshot" />
</a>
Geni.com Homepage lets you start creating your family tree before creating an account.
</div>

<p>
In Tiny Speck's upcoming game '<A href="http://glitch.com/" target="new">Glitch</a>,' the site first leads visitors to create a game character and give it a name, then displays the character created alongside its name.  Only then will the site ask for personal details, because now the visitor is invested in the character they have created and are more likely to convert.  This principle can be applied outside the world of gaming when working toward the goal of driving user signups.  An ideal example of this, Burka says, is the geneology site <a href="http://www.geni.com/" target="new">Geni.com</a>, which allows you to start building your family tree before signing up.
</p>

<p>
The principle goes a little as follows:
</p>

<ol>
<li>Allow users to first create something of value and make incremental progress toward what your site offers, building in rewards (such as a game character or a family tree).</li>
<li>As quickly as possible, convince the person that whatever comes after sharing their details is worthwhile.</li>
<li>After the person is already invested, capture their personal information or ask for the commitment.</li>
<li>As the presentation slides say, 'Help people make something they'd hate to lose.'</li>
</ol>

<h3>Facebook's 'Aha! Moment'</h3>

<p>
Facebook calls the point where the user wants to commit the 'Aha! Moment.'  This is the point in time where the user understands the biggest incentive your product or service has.  By focusing user signup tests on this, Facebook saw a 5% topline increase in new user registrations (a significant number when you have 300 million users).  They learned that for Facebook, this moment is the instant they see faces and names of their friends already using the site.  As a result, one of the most successful web sites in the world is now totally redesigning their account creation process to eliminate every single distraction before new people reach that Aha Moment.
</p>

<h3>Learn from Games that have Feedback Cycles</h3>

<p>
An emerging trend in interaction design is to use game theory when designing software and online interactions.  Games have long been written to teach players more difficult manuvers as they gain more practice, rewarding them along the way.  In the same way, interaction designers can unlock complexity and funcionality as users complete more and more actions within your site.  Rewarding the mastery of features and processes keeps the users interested, challenged, and engaged.

<p>
Some examples of this in both games and on the web include:
</p>

<ul>
<li><a href="http://www.spore.com/" target="new">Spore</a>: New users are given a simple task with simple controls.  After successfully performing an action with the game character, the user is rewarded with a character that evolves, along with more sophisticated controls.</li>
<li><a href="http://www.mint.com" target="new">Mint.com</a> has built instant feedback loops into their signup screen for when users enter a valid username, email address, and matching passwords.  If you enter incorrect information, a red X displays next to the field alerting the user of their mistake without going through the frustration of loading the error page.</li>
</ul>

<h3>Lead Users, Teach While Doing, and Focus on One Thing</h3>

<p>
'If you tell your users to &#39;Go do anything,&#39;' Burka says, 'the user will respond in kind with &#39;What kind of anything should I do?&#39;  By creating 'quests' as game designers call them, you can lead users down a path toward a goal, teaching them along the way.  If you're naming your quest, give it something in context; for example, in a business application, you might refer to a quest as a 'to-do list.'
</p>

<div class="BlogImageRight" style="width: 300px;">
<a href="http://www.tumblr.com" target="new">
<img src="/Common/Images/Custom/blog/blog-sxsw-designing15-tumblr.png" alt="Tumblr Signup Process" />
</a>
Tumblr walks you through creating your first post as you are signing up.
</div>

<p>
Don't think of educating users as a side part of the experience (such as documentation or help pages), rather, make it a core part of the user experience.  For example, the <a href="http://www.legouniverse.com" target="new">LEGO&reg; Universe</a> multiplayer online game teaches users how to perform moves as they are actually discovering new things while playing.  The designers specifically do not interrupt the process of playing to teach.  Blog service <a href="http://www.tumblr.com" target="new">Tumblr</a> walks new users through the process of creating a blog and a first post within 60 seconds, creating an investment in the service on the part of the user and teaching them core features.
</p>

<p>
Sometimes competing interests and objectives can confuse users, preventing them from accomplishing your desired outcome.  Like a zig-zagging checkout queue, bursting with diversions of candy and must-have impulse buys, well-meaning individuals can cannibalize the goal.  What's the answer?  'Focus on one specific thing [and do it well].  Ask &#39;what is important for this step?&#39;' says Goodlatte.  'Do a few things less well, because [on the web] you can't do everything at once.'  Define your end goal, come up with a measurement for success, and design everything on the page to optimize for the desired outcome.
</p>


<h3>Living the Process</h3>

<p>
When designing a site, discover your Aha Moment & get to it ASAP. It will communicate more than any marketing material can.  To convince management or clients of a needed change, Goodlatte suggests showing a a video of a user frustrated with your system.  This evidence says far more than any theory-based argument about a site's usability.
</p>

<p>
If you are looking to improve user interactions on your site, increase signups, or increase sales, please talk to KeyLimeTie about how the design team here can help you reach your goals.
</p>

<p>
To see Burka and Goodlatte's presentation slides, visit <a href="http://www.slideshare.net/dburka/designing-the-first-fifteen-minutes" target="new">Designing the First 15 Minutes</a> on Slideshare.  For extensive notes of the presentation itself, <a href="http://www.facebook.com/notes/facebook-design/liveblogging-designing-the-first-fifteen-minutes/381301322792" target="new">see the notes on the Facebook design blog</a>.
</p>


]]></description> 
					<pubDate>Tue, 16 Mar 2010 20:40:42 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/3/16/sxsw-facebook-digg-on-designing-the-first-15-minutes/</guid>
				</item>
			
				<item>
					<title>SXSW Report: Reach Customers in New Ways via the iPad</title> 
					<link>http://keylimetie.com/blog/2010/3/15/sxsw-reach-customers-in-new-ways-via-the-ipad/</link> 
					<description><![CDATA[<p>
The release of the much-anticipated iPad is fast approaching.  Do you know it will explode the possibilities for ways you can interact with your customers and audience?
</p>
<p>
Now that we as an industry have seen the iPad and developers have had the opportunity to write applications for the new device, thoughts are crystalizing around just how many new ways content creators, publishers, brands, companies and organizations will have to reach, enage and serve their respective audiences.
</p>
<h3>Discussion at SXSW</h3>
<p>
On Saturday, March 13 at the South by Southwest (SXSW) Interactive conference, developers, gaming and media executives gathered on a panel to discuss these very opportunities.  The thoughts that emerge will enlighten you to the scope of the opportunity ahead.  The panel, entitled "<a href="http://my.sxsw.com/events/event/7427" target="new">iPad: New Opportunities for Content Creators</a>," validated and enhanced many thoughts KeyLimeTie has been having about the device's potential.
</p>
<div class="BlogImageLeft" style="width: 300px;">
<img src="/Common/Images/Custom/blog/blog-sxsw-ipad.jpg" alt="iPad Panel at SXSW" />
</div>
<p>
Moderator Raven Zachary (@<a href="http://www.twitter.com/ravenme" target="new">ravenme</a>) set the stage by telling the audience that the pre-launch demand for the iPad is higher than it was for the original iPhone.  On the first day of pre-order sales, Apple sold 51,000 iPads within the first two hours, and 90,000 units within six hours (<a href="http://www.intomobile.com/2010/03/12/apple-ipad-pre-order-rush-snags-50000-units-in-two-hours.html" target="new">source</a>).
</p>
<p>
Why such a high demand?  Today approximately 75 million people use the iPhone OS (between iPhone and iPod Touch owners) and are familiar with the multi-touch screen interface as well as the App Store.  Many of these people will enthusiastically purchase iPads and in the process bypass the learning curve because they're already familiar with how to operate it.
</p>
<p>
</p>
<h3>The Panel Discussion</h3>
<p>
The panelists each gave a perspective on the iPad based on their respective industries.  Bill Jensen (@<a href="http://www.twitter.com/billyjensen" target="new">BillyJensen</a>), Director of New Media for The Village Voice talked about the power of the iPad to deliver well-formatted niche content.  As one of the few print weeklies that continues to see growth thanks to its local focus, Jensen seemed keen to leverage this lower cost barrier digital format to deliver more niche content.
</p>
<p>
Jensen made an illustration of the variety of content available through the largest digital medium—the web—and through print distribution channels.  A typical city street may have 10 newspaper boxes and the largest of bookstores could carry up to 1,000 magazines while the Internet boasts an almost unfathomable 109.5 million web sites.  Being a digital medium, the iPad will bring back the experience of reading elegantly typeset books fused with interactive media, while offering a selection that will dwarf bookstores.
</p>
<p>
76% of Top 5 grossing apps in the iTunes Store are games.  By 2013, panelist Shervin Peshavar (@<a href="http://www.twitter.com/shervin" target="new">Shervin</a>) from the Social Gaming Network (creators of best-selling iPhone games) asserted the app market will have an estimated value of $30 billion with approximately 20 million iPads sold.  Peshavar disussed the ways the iPad's size and features will change the way people both experience and produce content.
</p>
<p>
<strong>Accoring to Peshavar, the iPad's unique value lies in four distinct factors:</strong>
</p>
<ul>
    <li>Screen real estate</li>
    <li>Processing power</li>
    <li>The immersive experience it affords</li>
    <li>Convenient size</li>
</ul>
<p>
"The iPad enables new usage occasions, pushes creative frontier and boosts engagement" says Peshavar. "Greater engagement leads to higher ARPU," or <em>average revenue per user</em>.  "The iPhone is more for media consumption, where the iPad will be for media creation," said panelist Jason Grigsby (@<a href="http://www.twitter.com/grigs" target="new">grigs</a>).  Peshavar even speculated about a radical shift in human-computer interactions, musing that we may now see real-time collaboration between two people using the same device simultaneously.
</p>
<div class="BlogImageRight" style="width: 300px;">
<img src="/Common/Images/Custom/blog/blog-sxsw-ipad-book.jpg" alt="Books on the iPad, photo credit Wired.com." />
Photo credit: <a href="http://www.wired.com/epicenter/2010/01/the-ipad-will-violate-the-kindles-space-and-other-first-impressions/" target="new">Wired Magazine</a>.
</div>
<p>
Katherine Tasheff (@<a href="http://twitter.com/tasheffka" target="new">tasheffka</a>) of Hyperion Books said "The iPad mimics the experience of reading a book like nothing else does."  Hyperion, she says, is seeing print book sales decine thanks to e-readers.  "[The iPad and e-readers are] the first step toward the virtually paperless society we will be in about twenty years," added Jensen.  Underscoring the iPad's potential for ubiquity, Tasheff added "This is the first device both my father and I are excited about.  And I am tech support for the man, I know what's involved."
</p>
<h3>Other Observations</h3>
<ul>
    <li>The potential for two people to collaborate or play a game on the same device instead of two networked devices.</li>
    <li>The iPad will be used fundamentally differently than the iPhone.  The panelists are questioning the need for things like camera and GPS because people will treat the device more like a computer than a phone.</li>
    <li>The iPad and similar devices will likely signal the end of vertical scrolling (like on computers) as this is an artifact non-touch screen interface.  Now that we are touching the screen, we won't need to scroll.  Instead, designers and content creators will be free to build content that pages more naturally.</li>
</ul>
<h3>Looking Ahead</h3>
<p>
We've only seen the beginning of the possibilities on the iPad.  As the iPad launches, think through ways you can better serve your customers by producing an app or re-formatting the content you create for the device.  Its popularity virtually ensures someone who does what you do will be competing for peoples' attention on this new screen.  This is an opportunity and also a call to action to lead the way for your industry for providing quality interactions via the digital device where many of your customers, users, fans, and audiences will be conducting their day-to-day business, communication, and pleasure activities.
</p>
<p>
</p>
<p>
If you have questions about how your company can build an iPad application, or if you are looking for a technology partner with whom to explore this frontier, please call KeyLimeTie at 630.598.9000.
</p>
]]></description> 
					<pubDate>Mon, 15 Mar 2010 21:32:57 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/3/15/sxsw-reach-customers-in-new-ways-via-the-ipad/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie at SXSW Interactive This Weekend</title> 
					<link>http://keylimetie.com/blog/2010/3/12/keylimetie-at-sxsw-interactive-this-weekend/</link> 
					<description><![CDATA[<p>
This weekend, Chris Pautsch and I are attending SXSW Interactive in Austin, TX.  We're here to promote our abilities, network with notables in the industry, and learn as much as we can while at <em>the</em> conference for interactive software, design, usability, and business strategy.
</p>
<p>
We'll be posting observations and knowledge that has direct applicability to our customers' businesses, and we'll also be taking what we learn back into the organization to stay cutting edge with the services we provide.
</p>
<p>
If you want to interact with us directly while at the conference, feel free to talk to us on Twitter.  Make sure you follow @<a target="new" href="http://www.twitter.com/keylimetie">KeyLimeTie</a>, but also follow @<a target="new" href="http://www.twitter.com/ChrisPautsch">ChrisPautsch</a> and @<a target="new" href="http://www.twitter.com/TimCourtney">TimCourtney</a> directly.  Finally, if you want the full volume of my personal live-tweets, I've set up @<a target="new" href="http://www.twitter.com/TimCourtneySXSW">TimCourtneySXSW</a> so as not to annoy people who follow me and aren't interested in the conference.
</p>
<p>
Here are some of the things we're focusing on at the event:
</p>
<ul>
    <li><strong>Changing user interfaces.</strong>  We're actively looking at what people are saying about the iPad, tablet PCs, mobile phones, and even purpose-built devices.  As these new devices are becoming more mainstream, new ways of interacting with customers are emerging.  We see the iPad as much more than a personal productivity and entertainment tool; it's a platform that will provide better ways to meet customers' needs where they are and when they need service.</li>
    <li><strong>New Technology: Augmented Reality</strong>  These applications have been talked about for some time and are just now coming into the mainstream.  They can be as simple as a heads-up display on a fighter jet or a car to a mobile application that displays a virutal object superimposed over a video of the area directly in front of you.  Companies can use augmented reality for advertisements, navigation, complex task support, and in industrial or architectural settings to name a few (source: <a target="new" href="http://en.wikipedia.org/wiki/Augmented_reality#Current_applications">Wikipedia</a>).  For an example, see ReadWriteWeb's writeup on <a target="new" href="http://www.readwriteweb.com/archives/chevrolet_blends_mobile_desktop_augmented_reality_sxsw.php">Chevy's Augmented Reality iPhone app at SXSW</a>.</li>
    <li><strong>Making Sense of it All</strong>.  Because we live on the web every day, we know there's no shortage of information being passed about new technologies, especially regarding hot topics like social media.  But what does it all mean?  How does it apply to you, whether you're a business unit within a large enterprise or a small-midsize company?  Depending on what you do and who your customers are, you can adjust your focus on the tools that will garner the most impact.  We'll listen keenly on how some these hot tools are proving useful for different types of people, and for whom they're not useful.</li>
    <p>
    If you're a KeyLimeTie customer reading this, we believe in being a go-to resource on interactive web technology at the same time as being your preferred web and software developer.  We're focusing our time at SXSW to equip us to do that even better.
    </p>
</ul>
]]></description> 
					<pubDate>Sat, 13 Mar 2010 00:44:42 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/3/12/keylimetie-at-sxsw-interactive-this-weekend/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie visits the Illinois Institute of Technology KnappLab</title> 
					<link>http://keylimetie.com/blog/2010/3/9/keylimetie-visits-the-illinois-institute-of-technology-knapplab/</link> 
					<description><![CDATA[<p>
On February 5, Peter Morano, Chris Grove and I attended the launch reception for the <a href="http://www.knapplab.com" target="new">KnappLab</a> at the <a href="http://www.iit.edu" target="new">Illinois Institute of Technology</a>.  The Knapp Center, headed by Nik Rokop, has built out a mobile development lab to teach students how to develop real-world mobile applications.  The lab practices what it preaches; even <a href="http://www.knapplab.com" target="new">the Lab's web site is a mobile site</a>. 
</p>

<p>
At the KnappLab, students have access to two Macs and one Windows machine fully equipped with development environments for iPhone, Android, Blackberry, and Windows Mobile.  They have the chance to work on student projects or projects entrepreneurs bring to them.
</p>

<p>
We're excited to see a leading university make such an investment in young mobile app developers.  These students certainly have an open door at KeyLimeTie when they're looking for internships or full-time positions doing the work they love.
</p>

<p>
Here's a video we took giving a quick tour of the KnappLab:
</p>

<center>
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/Qc9yoiwy5ww&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Qc9yoiwy5ww&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>
</center>]]></description> 
					<pubDate>Tue, 09 Mar 2010 21:56:07 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/3/9/keylimetie-visits-the-illinois-institute-of-technology-knapplab/</guid>
				</item>
			
				<item>
					<title>Day of Mobile Hackathon Winners</title> 
					<link>http://keylimetie.com/blog/2010/3/9/day-of-mobile-hackathon-winners/</link> 
					<description><![CDATA[<p>
On March 6th, I had the pleasure of organizing the Hackathon Contest for the <a href="http://www.dayofmobile.com" target="new">Day of Mobile conference</a> held at IIT.  Developer hackathons are contests where people compete to code the best application that meets certain criteria and win prizes and regognition for their efforts.
</p>
<p>
KeyLimeTie was the Hackathon sponsor and I served as Hackathon coordinator.  The judging panel included me and an impressive subset of the event’s speakers: Jay Freeman, David Whatley, Mark Murphy and John Haney.
</p>
<p>
The contest itself featured eleven teams who presented applications they built on the Android, iPhone and Blackberry platforms.  Seven teams walked away with cash and prizes that totaled more than $3,500, including $1,500 in cash a Netbook provided by <a href="http://www.chicagomicro.com" target="new">Chicago Micro</a>, a Nokia N900 from <a href="http://www.earthcomber.com" target="new">Earth Combers</a>, <a href="http://www.threadless.com" target="new">Threadless</a> gift certificates, $500 in books from <a href="http://oreilly.com/" target="new">O’Rielly Publishing</a> and 2 Droid phones from <a href="http://www.google.com" target="new">Google</a>.
</p>
<p>
The winning teams were:
</p>
<ul>
    <li>Best Overall App: Novarra Team</li>
    <li>Best Overall Runner Up: Runner up: Ravi Singh (@<a href="http://www.twitter.com/code4ever" target="new">code4ever</a>)</li>
    <li>Best Open Source App - Mike Laurence (@<a href="http://www.twitter.com/mikelaurence" target="new">mikelaurence</a>)</li>
    <li>Best Student App - Knapp Lab Team (IIT)</li>
    <li>Best iPhone App - Pek Pongpaet (@<a href="http://www.twitter.com/pekpongpaet" target="new">pekpongpaet</a>) and Chad Paulson (@<a href="http://www.twitter.com/chadpaulson" target="new">chadpaulson</a>)</li>
    <li>Best Android App – Android Technical</li>
    <li>Best Blackberry App - Vibhor Goyal (@<a href="http://www.twitter.com/vbgoz" target="new">vbgoz</a>)</li>
    <li>Best Design: Jon Jenkins</li>
</ul>
<p>
Congratulations, everyone!
</p>
<p>
If you’re interested in competing in the next Hackathon contest, please send me an email or DM me at @petermorano and I’ll keep you informed of the next event.
</p>
]]></description> 
					<pubDate>Tue, 09 Mar 2010 17:56:35 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/3/9/day-of-mobile-hackathon-winners/</guid>
				</item>
			
				<item>
					<title>SocialDevCamp Chicago Video Highlights</title> 
					<link>http://keylimetie.com/blog/2010/3/7/socialdevcamp-chicago-video-highlights/</link> 
					<description><![CDATA[<p>
In November of last year, KeyLimeTie sponsored the second annual <a href="http://www.socialdevcampchicago.com" target="new">SocialDevCamp conference</a> in Chicago, co-produced by our very own Tim Courtney.  The event covers both  technical and business, strategic and cultural elements of developing social applications on the Internet, a significant part of KeyLimeTie's business.
</p>

<p>
The conference attracted notable speakers including David Recordon and Luke Shepard of Facebook, Harper Reed, Chris McAvoy, Blagica Bottigliero, Daliah Saper, and John R. Dallas, Jr.
</p>

<p>
KeyLimeTie CIO Peter Morano also led the developer Hackathon component of SocialDevCamp, a contest offering $2,000 in prizes to developers competing to build the best social applications over the course of the weekend.
</p>

<p>
Enjoy these video highlights from SocialDevCamp 2009.  We're happy to have had the opportunity to partcipate in the event.
</p>

<center>
<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/C4x57zHTlh8&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/C4x57zHTlh8&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"></embed></object>
</center>]]></description> 
					<pubDate>Sun, 07 Mar 2010 22:19:55 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/3/7/socialdevcamp-chicago-video-highlights/</guid>
				</item>
			
				<item>
					<title>Pop&amp;quot;s Italian Beef &amp;amp; Sausage is fresh on the web with a side of KeyLimeTie</title> 
					<link>http://keylimetie.com/blog/2010/3/5/pops-italian-beef-sausage-fresh-with-side-of-keylimetie/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<a href="http://www.popsbeef.com/" target="new">
<img src="/Common/Images/Custom/blog/blog-popsbeef-2.png" alt="Pop's Italian Beef & Sausage" />
</a>
</div>

<p>
Legendary Chicago and suburban sandwich shop <a href="http://www.popsbeef.com" target="new">Pop's Italian Beef & Sausage</a> came to KeyLimeTie when the company needed a new web site.  They wanted a site that visually communicated the BIG taste of their adored sandwiches, and KeyLimeTie served up just what they ordered.
</p>

<p>
The new Pop's Italian Beef site proudly displays their classic features bold visuals with their featured items and provides an updated motif around their classic logo, bringing Frank Radochonski's vision up-to-date on the web.  As fans of Pop's Italian Beef ourselves, we're thrilled with the opportunity to give them a fresh look online.
</p>]]></description> 
					<pubDate>Fri, 05 Mar 2010 21:46:15 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/3/5/pops-italian-beef-sausage-fresh-with-side-of-keylimetie/</guid>
				</item>
			
				<item>
					<title>Three Tech Events Next Week: SocialDevCamp Party, MobileX Chicago, and Day of Mobile</title> 
					<link>http://keylimetie.com/blog/2010/2/24/socialdevcamp-party-mobilex-chicago-and-day-of-mobile/</link> 
					<description><![CDATA[<p>
KeyLimeTie is sponsoring both the SocialDevCamp TechThursday Mashup Party and the Day of Mobile conference next week.  We also recently learned of a second Mobile event for entrepreneurs and developers; MobileX Chicago. If you're in the area and interested in social applications and mobile development, you'll want to add these events to your calendar.
</p>
<h4 style="font-size: 18px;">SocialDevCamp TechThursday Mashup Party</h4>
<p style="color: #808080; line-height: 14px; font-weight: normal; font-size: 14px;">Thursday March 4, 6-9pm, OfficePort CHI</p>

<div class="BlogImageRight" style="width: 245px;">
<a href="http://socialdevcampchicago.eventwax.com/socialdevcamp-chicago-techthursday" target="new"><img src="/Common/Images/Custom/blog/blog-socialdev.png" alt="SocialDevCamp Chicago" /></a>
</div>

<p>
Organizers of the annual SocialDevCamp Conference (including KeyLimeTie's Tim Courtney and Peter Morano) are hosting an after-hours party for attendees to mingle, re-connect, see video highlights and hear from Hackathon teams who have continued developing the applications they built at the 2009 conference into something bigger.
</p>
<p>
KeyLimeTie is sponsoring the party.  Food and drinks will be provided, and a $5.00 cover charge will be donated to the YWCA TechGYRLS program, an innovative, after-school programs are designed to broaden girls' knowledge and interest in science, technology, engineering, and mathematics fields.
</p>

<p><strong>
<a target="new" href="http://socialdevcampchicago.eventwax.com/socialdevcamp-chicago-techthursday">RSVP for the SocialDevCamp TechThursday Mashup Party Here</a>.
</strong></p>

<h4 style="font-size: 18px;">MobileX Chicago</h4>
<p style="color: #808080; line-height: 14px; font-weight: normal; font-size: 14px;">Friday March 5, 9:00am - 6:00pm, Doubletree Hotel</p>

<div class="BlogImageRight" style="width: 242px;">
<a href="http://www.mobilexconference.com/chicago/" target="new"><img src="/Common/Images/Custom/blog/blog-mobilex.png" alt="MobileX Chicago" /></a>
</div>

<p>
MobileX Chicago is a one-day conference aimed at entrepreneurs, developers, investors, industry professionals, and mobile enthusiasts.  It features four tracks of breakout sessions for the target audiences and topics of  “Mobile Developers”, “Entrepreneurs/Investors/Enthusiasts”, and “Mobile Marketing," along with an introductory iPhone development track.
</p>
<p><strong>
<a target="new" href="http://www.mobilexconference.com/chicago/">Learn more and register to attend on the MobileX Chicago web site</a>.
</strong></p>
<h4 style="font-size: 18px;">Day of Mobile</h4>
<p style="color: #808080; line-height: 14px; font-weight: normal; font-size: 14px;">Saturday March 6, 8:00am - 6:00pm, Illinois Institute of Technology</p>

<div class="BlogImageRight" style="width: 242px;">
<a href="http://www.dayofmobile.com/" target="new"><img src="/Common/Images/Custom/blog/blog-dayofmobile.png" alt="Day of Mobile" /></a>
</div>

<p>
Day of Mobile will focus on iPhone, Android, Blackberry, and Windows Mobile development.  Jay Freeman, creator of the Cydia Store will keynote, and KeyLimeTie's Chris Grove will present on "Strategies for multi-platform applications."  KeyLimeTie's Peter Morano is heading the Developer Hackathon, and the company is sponsoring Day of Mobile.
</p>
<p><strong>
<a target="new" href="http://www.dayofmobile.com/">Learn more and register to attend on the Day of Mobile web site</a>.
</strong></p>
]]></description> 
					<pubDate>Wed, 24 Feb 2010 17:30:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/2/24/socialdevcamp-party-mobilex-chicago-and-day-of-mobile/</guid>
				</item>
			
				<item>
					<title>ScaleWell Grant Offers New Way to Look at Investing in Your Business</title> 
					<link>http://keylimetie.com/blog/2010/2/10/scalewell-grant/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<a href="http://scalewell.com/" target="new">
<img src="/Common/Images/Custom/blog/screenshot-scalewell.png" alt="ScaleWell.com" />
</a>
</div>

<p>
Are budgets tight at your company?  Many places they are.  Whether you're a Fortune company or a bootstrapped entrepreneur, chances are you have a list of things that you need and are holding off on purchasing something you need to grow your business.
</p>

<p>
<a href="http://scalewell.com/" target="new">ScaleWell</a>, a new quarterly grant given by entrepreneurs for entrepreneurs, aims to change the way companies look at what it takes to gain traction for one's business.  By giving away $1000 per quarter (no strings attached) to one company, ScaleWell is encouraging companies to look at ways to grow by funding their experience.  According to the ScaleWell web site, it's a way to enable the recipient to answer questions like 'How many customers I acquire for $1000?' or 'How much closer to profitability can I get by investing this small amount?'
</p>

<p>
Moreover, the buzz ScaleWell is generating in the Chicago business community, the region KeyLimeTie calls home, can serve to inspire you no matter your role--whether you are a solo entrepreneur or an executive at a large company.  Take a fresh look at the how you can grow or improve by investing a small, finite amount of money to fund an action or make a purchase that will gain you traction.  Once you're done, measure the results.  Whether this particular experiment succeeds or fails, you're learning along the way and taking positive steps forward.
</p>

<p>
ScaleWell was founded by Andy Angelos, Ziad Hussain, and Sean Corbett--each entrepreneurs looking to scale their own businesses while helping others do the same.  ScaleWell is funded by Trustees; Trustees each donate $100 and volunteer to advise the grant recipient.  Trustees decide on the award recipient from applications received each quarter.
</p>

<p>
KeyLimeTie came to support ScaleWell through CIO Peter Morano.  Internally, Pete has been instrumental in applying similar ideas through the KeyLimeTie Labs innovation group, and saw this as an opportunity to lend support to another business in the larger community.
</p>

<p>
How could you scale your business by investing $1000?  You don't have to be a ScaleWell recipient to do this.  The budget constraint makes it realistic to think and act this way.  With $1000, here are some of the things you could do to scale:
</p>

<ul>
<li>Video camera to take videos and share online to attract more customers.</li>
<li>Purchase costly software or hardware that would enable you to do more, or increase efficiency.</li>
<li>Invest in a graphic design for your company or product that improves your presentation and allows you to sell more.</li>
<li>Build enhancements to your web site, or purchase hosting for a new web site for a year.</li>
<li>Hire a C-Level consultant to work with you on strategic alignment within your company or group.</li>
<li>Sponsor an event that will gain you exposure and put you on the map in a market or a community.</li>
</ul>

<p>
How will you scale your business well?  KeyLimeTie wants to know.  Leave a comment below!
</p>

<hr>
<p>
<b>Update:</b> The first ScaleWell grant was given to Michael Una for his business, <a href="http://www.etsy.com/view_listing.php?listing_id=25223176" target="new">Unatronics</a>, that sells handmade electronic musical instruments.  He will use the grant money to develop additional products he can sell.
</p>]]></description> 
					<pubDate>Wed, 10 Feb 2010 16:45:50 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/2/10/scalewell-grant/</guid>
				</item>
			
				<item>
					<title>Apple&amp;quot;s iPad Opens Opportunities for New Applications and Interactions</title> 
					<link>http://keylimetie.com/blog/2010/1/29/apple-ipad-opens-opportunities/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 300px;">
<img src="/Common/Images/Custom/blog/Blog_iPad.jpg" alt="Apple iPad" />
</div>

<p>
Wednesday's much anticipated <a href="http://www.apple.com/ipad" target="new">iPad tablet device</a> appears to be, at first glance, a scaled-up version of the iPhone.  By releasing the iPad, Apple is carving out a new category of device, and a new way people will interact with computers.  Over the past ten years, there have been many unsuccessful attempts at building a widely-adopted tablet PC, so of course there is skepticism.
</p>

<p>
It would be easy to dismiss this device as nothing special, before considering how the App Store made the iPhone and the iPod Touch into the outstandingly popular devices they are today.  At this point, we've just seen what Apple (and a select group from the developer community) have done with the iPad.  The real applications are yet to come, thanks to the limitless creativity of the iPhone&mdash;and now iPad&mdash;developer community, including companies like KeyLimeTie.
</p>

<p>
Further, industry reporters like TechCrunch's MG Seigler explain why the iPad will succeed; its target audience is the <a href="http://theappleblog.com/2010/01/28/ipod-touch-now-outselling-iphone/" target="new">75 million iPhone and iPod Touch users</a>.  These people will know how to use the iPad right out of the gate.
</p>

<p>
Those people will also grow more and more accustomed to a web you can touch, with full web pages now practical on the iPad screen and people used to pinching and swiping their way around your site, making purchases, downloading documents, playing games, writing comments.  The web as we know it will evolve, interaction design will shift, as the iPad and other tablets capture our share of screen time.
</p>

<p>
Many people will opt to leave the laptop at home and use the iPad for communications, eBook reading, entertainment, and even productivity when larger screens and computing power aren't required.  But, imagine for a moment a restaurant menu displayed on an iPad, or iPads being used to process transactions in a retail store.  That, of course, is just the start.
</p>

<p>
Here are some others' thoughts on the iPad's viability:
</p>

<ul>
<li>TechCrunch: <a href="http://www.techcrunch.com/2010/01/28/top-10-reasons-ipad-kindle/" target="new">Top 10 Reasons The Apple iPad Will Put Amazon’s Kindle Out of Business</a></li>
<li>Arun Shroff: <a href="http://arunshroff.com/2010/01/28/top-10-reasons-why-ipad-will-not-kill-kindle/" target="new">Top 10 Reasons Why the iPad will NOT Kill the Kindle</a></li>
<li>TechCrunch: <a href="http://www.techcrunch.com/2010/01/27/ipad/" target="new">The iPad Is Like Holding The Future. But Only Because I Graduated From iPhone School</a></li>
<li>TechCrunch: <a href="http://www.techcrunch.com/2010/01/27/holding-ipad-pictures/" target="new">Pictures: The iPad Being Manhandled</a>
</ul>

<p>
Like what we have to say?  Follow @<a href="http://www.twitter.com/KeyLimeTie" target="new">KeyLimeTie</a> on Twitter or join our <a href="http://www.facebook.com/KeyLimeTie" target="new">Facebook fan page</a> for continued updates.
</p>]]></description> 
					<pubDate>Fri, 29 Jan 2010 17:16:02 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/1/29/apple-ipad-opens-opportunities/</guid>
				</item>
			
				<item>
					<title>How to &quot;Pull a Groupon&quot; and make more of your existing business</title> 
					<link>http://keylimetie.com/blog/2010/1/25/how-to-pull-a-groupon/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 350px;">
<a href="http://www.groupon.com" target="new"><img src="/Common/Images/Custom/blog/screenshot-groupon.png" alt="Groupon" /></a>
</div>

<p>
This past weekend I attended a lunch presentation by Andrew Mason of <a href="http://www.groupon.com" target="new">Groupon</a>, which he gave to participants in the Chicago Urban League's <a href="http://www.thechicagourbanleague.org/72321011405330540/blank/browse.asp?a=383&BMDRN=2000&BCOB=0&c=54245&72321011405330540Nav=|&NodeID=143" target="new">NextONE Program</a>.  I was invited by great friend <a href="http://www.johnrdallasjr.com" target="new">John (JR) Dallas</a> and welcomed by the Urban League staff.
</p>

<p>
Groupon, if you are not familiar, is widely regarded as <a href="http://www.suburbanchicagonews.com/heraldnews/business/1960919,technology-stories-2009-122809.article" target="new">Chicago's biggest tech success story of 2009</a>.  The web site allows people to buy one steeply discounted offer each day, provided enough other people also buy the offer so the retailer has a critical mass of new customers.  They achieved profitability in the spring of 09 and closed on $25mm of funding late last year, when they admittedly didn't need the money.  Now they're on target for $100mm in revenues in 2010.
</p>

<p>
It would be too easy to romanticize the above.  Mason and team came up with an idea, coded it in a month, and it became a runaway success.  But just looking at their history as Groupon would be denying some important lessons about innovation and persistence.
</p>

<div class="BlogImageLeft" style="width: 350px;">
<a href="http://www.thepoint.com" target="new"><img src="/Common/Images/Custom/blog/screenshot-thepoint.png" alt="ThePoint.com: Groupon's predecessor." /></a>
ThePoint.com: Groupon's predecessor.
</div>

<p>
Before Groupon was (and still is) a web site called <a href="http://www.thepoint.com" target="new">The Point</a>, which Mason started in 2006.  The Point was built to allow people to achieve critical mass on a political or social issue before taking action, to ensure the action they take (a donation, a protest, a mass action, etc) had an impact.  The site itself didn't take off to the founders' expectations because of a lack of focus; they were providing a platform for an undefined audience to take action on any potential issue.
</p>

<p>
The software and concept that powered The Point now powers Groupon.  In late 2008, the team worked for a month to get the product off the ground, with very limited features and simple e-commerce capabilities, and the new, focused idea stuck.
</p>

<p>
Among many others, I was able to pull these lessons from Andrew's talk and knowing the Groupon story:
</p>

<ol>
<li>They weren't afraid to act, try something different, and risk failure.  Groupon was a 30-day diversion from working on The Point.  If it failed, they wouldn't be out a lot of time, money, or emotional investment.</li>
<li>They took an existing asset, the software engine powering The Point, and applied it in a different way.  They learned that this new application had considerably more monetary value than the original.</li>
<li>Mason and the team continually improve Groupon by creating a product they themselves want to use, and add features and improvements based upon problems they themselves have.  Their philosophy, 'If I have this problem, chances are someone else does, too.'</li>
</ol>

<p>
Take a look inside your business as we take a look inside ours.  Do you have the opportunity to 'Pull a Groupon?'  Perhaps you have software systems that are built for one purpose that you could refactor for a different one, or maybe you could deliver your services to a completely new audience.  Chances are you are creating a product or service right now that could either make better use of by-products created or could be applied in a completely different way.
</p>

<p>
If this article strikes a chord with you, please let us know in the comments.  If you see successes from 'pulling a Groupon,' please let us know (and Groupon too, I'm sure they'd appreciate it)!  Finally, if there is an opportunity for KeyLimeTie to assist developing the software needed for you to accomplish your goals, please <a href="/contact/">drop us a line</a>.
</p>]]></description> 
					<pubDate>Mon, 25 Jan 2010 16:28:14 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/1/25/how-to-pull-a-groupon/</guid>
				</item>
			
				<item>
					<title>How the Haiti SMS fundraiser became a tipping point for text campaigns</title> 
					<link>http://keylimetie.com/blog/2010/1/22/how-the-haiti-sms-fundraiser-became-a-tipping-point-for-text-campaigns/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 200px;">
<img src="/Common/Images/Custom/blog/Haiti.jpg" alt="Haiti Text Donation" style="border: 1px solid #bbb;" />
</div>

<p>
In the aftermath of the Haiti earthquake last week, amidst the rescue effort headlines, is a robust discussion in the digital marketing industry around the power of text message campaigns to quickly mobilize people while creating an audience.  At one week after the earthquake, the <a href="http://www.redcross.org/en/" target="new">American Red Cross</a>'s text message (<a href="http://en.wikipedia.org/wiki/SMS" target="new">SMS</a>) campaign alone has <a href="http://www.dmnews.com/red-cross-raises-24-million-for-haiti-via-text-builds-mobile-database/article/161766/" target="new">raised over $24 million dollars for the relief effort</a>.
</p>

<p>
The simple campaign asks people to text the word 'Haiti' to short code 90999.  Once the user answers the confirmation message, a $10 charge is added to their mobile bill that month.  After you confirm, you're again prompted; this time, asking if you would like to receive Red Cross alerts straight to your mobile phone.
</p>

<p>
That's right.  <a href="http://www.dmnews.com/red-cross-raises-24-million-for-haiti-via-text-builds-mobile-database/article/161766/" target="new">The Red Cross raised $24 million dollars in one week from 2.4 million individual $10 donations by people with mobile phones</a>.  Why did it work?  The message got out when the disaster was getting the most coverage and offered donors instant gratification in donating via an unprecedentedly simple method.
</p>

<p>
The campaign itself is viral because it's short, timely, memorable, and actionable.  You can easily tell someone 'Text 'Haiti' to 90999 to donate $10 to the relief effort' in a text message, tweet, status update, a phone call, or an email.  Using text and social networking technology, the message has potential to spread exponentially, and this one did.  As a result, expect to see more charities and relief agencies using SMS for fundraisers when time is of the essence.
</p>

<p>
The larger lesson for businesses amidst the tragedy that prompted the campaign is great.  Text messaging campaigns have taken the 'impulse buy' and freed it from the four walls of a retail store.  Now people can respond to an ad campaign, make a quick purchase, or make a quick donation right where they are, with the same convenience of chatting with a friend.
</p>

<p>
Further, you can build opt-in lists and notify people of promotions, sales, or send news alerts that will reach them instantly in the future.  Many short code providers have CRM systems so you can manage customer relationships and even integrate their text profiles with their online profiles in your main e-commerce or CRM system.
</p>

<p>
While SMS short codes have been around for years, the tragedy in Haiti is being marked by the industry as an event that has now proven the critical mass--and the effectiveness--of SMS response campaigns.  If you are curious about ways your business can utilize short codes and integrate them with the rest of your digital strategy, talk to KeyLimeTie.  Or, if you'd like to read up on short codes, see this <a href="
http://gigaom.com/2007/03/16/10-things-to-know-about-short-codes/" target="new">informative article on GigaOM</a>.
</p>]]></description> 
					<pubDate>Sat, 23 Jan 2010 00:01:41 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/1/22/how-the-haiti-sms-fundraiser-became-a-tipping-point-for-text-campaigns/</guid>
				</item>
			
				<item>
					<title>What Google&amp;quot;s Local &amp;amp; Mobile Search Push Means to Your Small Business</title> 
					<link>http://keylimetie.com/blog/2010/1/20/what-googles-local-mobile-search-push-means-to-your-small-business/</link> 
					<description><![CDATA[<div class="BlogImageRight" style="width: 250px;">
<img src="/Common/Images/Custom/blog/GoogleMapsImage.png" alt="Google Maps Favorite Place window sticker with QR Code" />
</div>

<p>
Last week I found this decal on a store front while in San Francisco.  After searching the web to learn about the program, I learned Google is focusing more and more on local business and location-based search as a new revenue stream, and improving how companies advertise their businesses.
</p>

<p>
Google launched a pilot program where they sent out <a href="http://news.cnet.com/8301-30684_3-10409904-265.html">100,000 of these window decals</a> to the most popular local businesses listed on their web site.  The stickers contain a <a href="http://en.wikipedia.org/wiki/QR_Code" target="new">QR code</a> (short for 'Quick Response') so passersby can snap a quick photo of the code and visit the Google Local listing for that company.  There they can find business information and aggregated reviews.
</p>

<p>
This helps people learn more about the businesses they walk by every day.  They might find a copy shop or a caf&eacute;, and be able to see what others think about the place before they buy.  Or, they could save information about a location for later, or share with a friend, by sharing the local search link that comes up in their phone's browser.
</p>

<div class="BlogImageLeft" style="width: 200px;">
<img src="/Common/Images/Custom/blog/google-mobile-result.jpg" alt="Google QR Code Result" style="border: 1px solid #bbb;" /><br />
Google Local result for QR code.
</div>

<p>
What does this mean for small businesses?  It means people will be looking up your company more and more on their phones.  Here are two excellent ways to ensure they get the best information they can about you:
</p>

<ol style="margin-left: 222px;">
<li>Sign up for and update your Google Local Business Center listings to add custom information to your local search listings, including local coupons.  Use this also to analyze who is searching for your business and where they are located, to aid in your marketing efforts.</li>

<li>Make sure your web site is mobile-optimized.  The best way to do this is to have your web development firm build a mobile stylesheet for your web site.  With a mobile stylesheet, people visiting your site via their phone's browser will see all of the text and images optimized for the small browser.  Mobile web sites are specifically designed to present relevant, location- and time-sensitive information to people seeking you via their phones.</li>
</ol>

<p>
If you would like KeyLimeTie to optimize your web presence for mobile, or if you have questions about Google's Local Business Center, give me a call or reach out to @<a href="http://www.twitter.com/KeyLimeTie" target="new">KeyLimeTie</a> on Twitter.  We'll be happy to help.
</p>]]></description> 
					<pubDate>Wed, 20 Jan 2010 18:11:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/1/20/what-googles-local-mobile-search-push-means-to-your-small-business/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Sponsoring, Presenting at Day of Mobile Conference on Mobile Application Development</title> 
					<link>http://keylimetie.com/blog/2010/1/18/keylimetie-sponsoring-presenting-at-day-of-mobile-conference/</link> 
					<description><![CDATA[<p>
<img  style="padding-left: 15px; padding-bottom: 5px; float: right;" alt="Day of Mobile" src="/Common/Images/Custom/blog/day-of-mobile-people.jpg" />
We’re excited to play a part in <a href="http://www.techinthemiddle.com" target="new">Tech in the Middle</a>’s upcoming <a href="http://www.dayofmobile.com" target="new">Day of Mobile</a> conference, to be held at IIT on Saturday, March 6th.  The conference will feature 100 and 300 level talks running concurrently covering four development platforms; Android, iPhone, Windows Mobile, and Blackberry, along with hands-on workshops by subject matter experts.
</p>

<div style="display: none;">
<p>
KeyLimeTie CIO <a href="/about/team/peter-morano/">Peter Morano</a> is coordinating <a href="http://www.dayofmobile.com" target="new">Day of Mobile’s Hackathon contest</a>, with over $3,500 in prizes that will be awarded to people who develop the best mobile apps leading up to the event.  Presentations and judging will take place following the keynote speech in the afternoon.
</p>
</div>

<p>
Also, KeyLimeTie’s <a href="/about/team/peter-morano/">Chris Grove</a>, CTO and senior mobile application developer, will give a talk entitled “Strategies for Developing Multi-Platform Apps.”  He’ll explain how careful planning can overcome differences in frameworks, operating systems, and languages, while sharing proven strategies for cross-platform mobile development that will guide your design process and maximize your ROI.
</p>

<p>
If you’re looking to accelerate your mobile development knowledge, visit the <a href="http://www.dayofmobile.com" target="new">Day of Mobile</a> site and register for the conference.  See you there!
</p>]]></description> 
					<pubDate>Mon, 18 Jan 2010 17:35:36 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/1/18/keylimetie-sponsoring-presenting-at-day-of-mobile-conference/</guid>
				</item>
			
				<item>
					<title>Google Releases NexusOne, Adds Momentum and Focus for App Developers</title> 
					<link>http://keylimetie.com/blog/2010/1/6/google-releases-nexusone-adds-momentum-and-focus-for-app-developers/</link> 
					<description><![CDATA[<p>
Yesterday, Google boldly released the <a target="new" href="http://www.google.com/phone">Google-branded NexusOne phone</a> (manufactured by HTC), the closest device to date to compete with the iPhone in terms of features and flexibility.  For those looking to enter the mobile application marketplace, this adds some serious momentum to <a target="new" href="http://www.android.com/">Android OS's</a> expansion into the smartphone market.
</p>
<p>
<img  src="/Common/Images/Custom/Blogs/google-nexusone.jpg" alt="Google NexusOne" style="padding-right: 15px; float: left;" />
2010 will no doubt be a year of aggressive innovation as we start to see the power shift in the mobile market from the carriers like AT&T, Verizon, and T-Mobile to carriers and manufacturers like Apple, Google, Motorola, and HTC.
</p>
<p>
While the iPhone paved the way for consumers choose a handset first before a carrier, AT&T's exclusivity in the US limited choice.  The Motorola Droid created similar demand, and remains tethered to Verizon.  Now, Google has taken the next step by making the NexusOne available either subsidized (with a 2-year T-Mobile contract) or unlocked for any network (with the expectation of adding other networks in the future).
</p>
<p>
What does this mean for companies and brands looking to get into the app market?  Greater focus on Android and iPhone as the platforms of choice.  The Android Market's 20,000 apps, along with the iPhone's 90,000+ apps far overshadow both BlackBerry's and Palm's 4,000 and 1,000 apps, respectively (source: <a target="new" href="http://appworld.blackberry.com/webstore/category/0">BlackBerry App World</a> and <a target="new" href="http://www.billshrink.com/blog/nexus-one-vs-iphone-droid-palm-pre-total-cost-of-ownership/">BillShrink</a>).  For companies and developers looking to build apps, focus on Android and iPhone.
</p>
]]></description> 
					<pubDate>Wed, 06 Jan 2010 17:35:10 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/1/6/google-releases-nexusone-adds-momentum-and-focus-for-app-developers/</guid>
				</item>
			
				<item>
					<title>New iPod Touch Users &amp;amp; Android Growth Represent Opportunities for Brands</title> 
					<link>http://keylimetie.com/blog/2010/1/4/new-ipod-touch-users-android-growth-represent-opportunities-for-brands/</link> 
					<description><![CDATA[<p>
<img  style="padding: 15px; float: right;" alt="Android and iPhone" src="/Common/Images/Custom/Blogs/android-iphone.png" />
AdMob, the mobile analytics firm acquired by Google last year for $750 million, today reported that <a href="http://www.fiercemobilecontent.com/story/ad-requests-ipod-touch-grow-96-post-xmas/2010-01-04?utm_medium=nl&utm_source=internal" target=”new”>ad requests from iPod Touch users were up 96% on December 26</a>.  This means that a lot of new people received iPod touches this year, increasing the potential user base for iPhone and iPod Touch applications by a significant amount.
</p>

<p>
At the same time, AdMob data indicates <a href="http://androidandme.com/2009/11/news/admob-data-2009-android-vs-iphone/" target="new">momentum is building around Android phones</a> as they continue to penetrate the market.  While the iPhone remains wildly more popular, growth has slowed in the US while Android trends upward.  
</p>

<p>
If you’re looking to build an application that drives engagement and revenue, the iPhone and iPod Touch will continue to represent significant opportunities for a long time to come.  However, keep an eye on Android as we are sure to see significant competition in 2010.
</p>

<p>
Interested in either iPhone or Android applications?  Give us a call at KeyLimeTie to discuss your plans.  630.598.9000.
</p>]]></description> 
					<pubDate>Mon, 04 Jan 2010 16:57:01 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/1/4/new-ipod-touch-users-android-growth-represent-opportunities-for-brands/</guid>
				</item>
			
				<item>
					<title>Sloan Valve receives press for Water Savings Calculator iPhone Application by KeyLimeTie</title> 
					<link>http://keylimetie.com/blog/2010/1/4/sloan-valve-receives-press-for-water-savings-calculator-iphone-application-by-keylimetie/</link> 
					<description><![CDATA[<p>
Last week, client <a href="http://www.sloanvalve.com" target="new">Sloan Valve</a> received press in <a href="http://contractormag.com/news/water_savings_app/" target="new">CONTRACTORmag.com</a> for the new Water Savings Calculator iPhone application (<a href="http://appsto.re/sloanwatersavings">iTunes Link</a>), developed by KeyLimeTie.  The article discusses ways the manufacturer is allowing facilities managers, architects, engineers, plumbers, and others to immediately estimate water usage in a building and calculate potential savings they would incur by using Sloan products.
</p>

<p>
Sloan is using the app as a part of their continued effort to position the brand as a green manufacturer, concerned with ensuring customers and end users are making the most efficient use of water resources possible.
</p>

<p>
<a href="http://contractormag.com/news/water_savings_app/" target="new">Read the CONTRACTORmag.com article here</a>.
</p>]]></description> 
					<pubDate>Mon, 04 Jan 2010 15:28:34 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2010/1/4/sloan-valve-receives-press-for-water-savings-calculator-iphone-application-by-keylimetie/</guid>
				</item>
			
				<item>
					<title>Sloan Valve releases Water Savings Calculator iPhone App</title> 
					<link>http://keylimetie.com/blog/2009/11/10/sloan-valve-releases-water-savings-calculator-iphone-app/</link> 
					<description><![CDATA[<p>
<img src="/Common/Images/Custom/Blogs/sloan-iphone.png" width="150" height="278" alt="Sloan Water Savings Calculator" style="padding: 0px 0px 15px 15px;" align="right">
In support of their continued focus on green initiatives, <a href="http://www.sloanvalve.com/" target="new">Sloan Valve</a> contracted KeyLimeTie to design and develop a Water Savings Calculator for the iPhone platform.  We’re pleased to announce the app is now available through the iTunes App Store as the team at Sloan heads to Phoenix, AZ to exhibit at the <a href="http://www.greenbuildexpo.org/" target="New">GreenBuild Conference & Expo</a>, where former Vice President Al Gore will be delivering the keynote address.
</p>

<p>
Sloan shared with us their desire to bring this unique utility app to the iPhone so that architects, engineers, and contractors who select plumbing fixtures will be informed of the water savings—both financial and volume—that Sloan products provide over industry benchmarks.  KeyLimeTie used this information to develop a simple iPhone application that allows users to enter criteria about a building and its occupants, along with preferred Sloan fixtures.  The app then generates statistical information regarding the amount of water and money that can be saved by utilizing the selected Sloan products.
</p>

<p>
This unique mobile application makes this information easily accessible in the field, and reinforces Sloan’s position as a leader in ecological building practices.
</p>

<p>
Sloan will be exhibiting the iPhone app this week at the GreenBuild Conference & Expo.  Congratulations, Sloan, on the release.  KeyLimeTie is honored to have been a part of this project.
</p>

<p>
Click here to <a href="http://www.appsto.re/sloanwatersavings" target="new">download the free Water Savings Calculator on iTunes</a>.
</p>]]></description> 
					<pubDate>Tue, 10 Nov 2009 22:24:43 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/11/10/sloan-valve-releases-water-savings-calculator-iphone-app/</guid>
				</item>
			
				<item>
					<title>The Secret&amp;amp;trade; Daily Teachings App selected as &amp;amp;quot;New and Noteworthy&amp;amp;quot; on the App Store</title> 
					<link>http://keylimetie.com/blog/2009/11/4/the-secret-trade-daily-teachings-app-selected-as-quot-new-and-noteworthy-quot-on-the-app-store/</link> 
					<description><![CDATA[<img src="/Common/Images/Custom/Blogs/itunes-thesecret.png" width="350" height="270" alt="The Secret Daily Teachings makes New and Noteworthy on the iTunes App Store" align="right" style="padding: 0px 0px 0px 15px;">
<p>
We’ve enjoyed watching the continued success of an iPhone app we built, '<a href="http://appsto.re/dailyteachings">The Secret&trade; Daily Teachings,</a>' in the iTunes store.  Yesterday the app was selected as 'New and Noteworthy' and now appears on the App Store homepage in iTunes.
</p>

<p>
This builds upon last week's success; within 48 hours of the app's release, it rose to the #1 app within the Lifestyle section.  Now a week after release, it still rests as the #2 app in the category.  
</p>

<p>
Congratulations again to the  team at The Secret and Prime Time Productions!  We're honored to be a part of this project and looking forward to a continued partnership.
</p>]]></description> 
					<pubDate>Thu, 05 Nov 2009 05:26:23 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/11/4/the-secret-trade-daily-teachings-app-selected-as-quot-new-and-noteworthy-quot-on-the-app-store/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie sponsors and jumps in feet-first to SocialDevCamp Chicago 2009</title> 
					<link>http://keylimetie.com/blog/2009/11/2/keylimetie-sponsors-and-jumps-in-feet-first-to-socialdevcamp-chicago-2009/</link> 
					<description><![CDATA[<p>
<a href="http://www.socialdevcampchicago.com" target="new"><img width="281" height="93" src="/Common/Images/Custom/Blogs/social_devcamp.gif" alt="SocialDevCampChicago" style="padding: 15px; float: right;" /></a>
This weekend, KeyLimeTie has the distinct honor of sponsoring <a href="http://www.socialdevcampchicago.com" target="new">SocialDevCamp Chicago</a>, an unconference being held at the <a href="http://www.iit.edu" target="new">Illinois Institute of Technology</a> on November 7 & 8 for developers and marketers passionate about the software that powers social networking technology.  Having built web sites for the likes of <a href="http://www.adamforillinois.com" target="new">Illinois gubernatorial candidate Adam Andrzejewski</a>, <a href="http:" target="new">E! News anchor Giuliana Rancic</a>, and even niche social network <a href="http://www.gimmepleez.com" target="new">GimmePleez</a>, we have a definite interest in seeing these technologies play out so we can stay on the forefront of enabling social media on the web.
</p>
<p>
Our very own Tim Courtney started SocialDevCamp Chicago last year, and is co-chairing the event with Andy Angelos of Get Talked About.  It’s been great getting an inside peek at watching the event come together.  Peter Morano, our CTO, stepped up and has been coordinating the Hackathon developer contest running at SocialDevCamp as well (There’s even rumor of a KeyLimeTie team entering the competition, so watch out!).
</p>
<p>
The event has an impressive lineup of speakers.  Facebook’s senior open programs manager, David Recordon, is delivering the Saturday morning keynote, and Google is giving a Wave demo on Sunday morning.  Area leaders including Harper Reed, Chris McAvoy, Alex Bratton, and John R. Dallas, Jr. are covering both the technical and the business side of social applications in the afternoon sessions, and attendees who want to present will be able to self-organize and talk in the Unconference track both days as well.
</p>
<p>
If you’re a developer or a social marketer, you should attend SocialDevCamp this weekend.  There’s a lot packed into the two days, especially for a free event.  <strong>However, registration is almost full, so make sure you register if you want to attend.  <a href="http://www.socialdevcampchicago.com" target="new">Visit the SocialDevCamp Chicago web site</a> for complete information and to register.</strong>
</p>
]]></description> 
					<pubDate>Mon, 02 Nov 2009 22:58:29 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/11/2/keylimetie-sponsors-and-jumps-in-feet-first-to-socialdevcamp-chicago-2009/</guid>
				</item>
			
				<item>
					<title>Early Success for KeyLimeTie iPhone application client; The Secret&amp;amp;trade; Daily Teachings</title> 
					<link>http://keylimetie.com/blog/2009/10/29/early-success-for-keylimetie-iphone-application-client-the-secret-trade-daily-teachings/</link> 
					<description><![CDATA[<p>
<img src="/Common/Images/Custom/Blogs/TheSecret.png" width="108" height="200" align="right" alt="The Secret&trade; Daily Teachings iPhone app, built by KeyLimeTie" style="padding: 0px 0px 15px 15px;">
We are thrilled to congratulate KeyLimeTie client <a href="http://www.thesecret.tv" target="new">Prime Time Productions</a>, owners of the popular book and film <a href="http://www.thesecret.tv" target="new">The Secret&trade;</a> on their early success with their new Daily Teachings iPhone application (<a href="http://appsto.re/dailyteachings">App Store Link</a>).  <strong>Within 48 hours of its release on October 27, the app skyrocketed to the #1 paid app in the Lifestyle category, and #49 overall!</strong>  Congrats!
</p>

<p>
KeyLimeTie was contracted to build the application, which allows users to read a daily affirmation or teaching from The Secret, highlight favorites, and share with friends.  The app also allows people to set daily alerts on their phones, reminding them to read their daily teaching.
</p>

<p>
One of our favorite features on the app is its use of the iPhone’s Push Notification service, which Apple released earlier this year through the iPhone OS 3.0.  Push notifications allow app authors to send content to users (in this case a daily reminder), which results in more engaged app users over the long term.  With brands and developers seeking ways to keep users engaged, whether to increase impressions or generate additional revenue, Push Notifications has been a welcome feature.
</p>

<p>
To power the alerts, we used our <a href="http://www.ilime.com" target="new">iLime service</a>, a publicly available service for iPhone developers that enables them to easily deliver Push Notifications and In App Purchase content to their users.  For us, it ended up being the perfect synergy between our service and product businesses, an  example of what we do best.
</p>

<p>
You can purchase The Secret™ Daily Teachings on the iTunes App store at <a href="http://appsto.re/dailyteachings">http://appsto.re/dailyteachings</a>. 
</p>]]></description> 
					<pubDate>Thu, 29 Oct 2009 20:49:28 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/10/29/early-success-for-keylimetie-iphone-application-client-the-secret-trade-daily-teachings/</guid>
				</item>
			
				<item>
					<title>Three things to prepare for Google Caffeine</title> 
					<link>http://keylimetie.com/blog/2009/9/1/three-things-to-prepare-for-google-caffeine/</link> 
					<description><![CDATA[<p>
Google recently announced the latest version of its search engine, called “Caffeine” (a Googler friend recently told me of how they name software versions creative names, “Cupcake” is the code name for a new Android version).
</p>

<p>
For all of the buzz about Bing, Microsoft’s new search engine slowed its marketshare gains in August, growing only 0.23% from July to an August search market share of 9.65% (according to <a target="new" href="http://www.reuters.com/article/pressRelease/idUS115465+01-Sep-2009+BW20090901">this release by StatCounter.com</a>).  Google gained 0.29% to a total share of 77.83%.  Clearly, Google will remain the dominant force in search for a long time to come.  Stay focused on growing your rankings on Google while keeping a casual eye on <a target="new" href="http://finance.yahoo.com/news/Microsoft-and-Yahoo-challenge-apf-1353069921.html?x=0">Bing and Yahoo with their new search partnership</a>.
</p>

<p>
The primary differences between the current search engine and Google Caffeine?  Speed and real-time search results, <a target="new" href="http://www.marketingpilgrim.com/2009/08/google-caffeine-test-suggests-too-much-emphasis-on-real-time-indexing.html">according to Andy Beal's Marketing Pilgrim article</a>.  Now that a< href="http://search.twitter.com">Twitter Search</a> is becoming known for delivering real-time results about conversations happening right now, Google's new results will begin prioritizing current results as well.  The search giant has thrown more horses behind your search, too, with search results now coming to you up to twice as fast, according to <a target="new" href="http://mashable.com/2009/08/10/google-caffeine/">speed tests</a>.
</p>

<p>
Here’s what to do about Google Caffeine:
</p>

<ul>
<li>Compare your old rankings with your new ones using this comparison site ( http://www.comparecaffeine.com/search-com.php).</li>
<li>Read what the experts have to say about making sure your rankings stay high:</li>

<!-- Indented Bullets -->
<li style="margin-left:10px;>360i: <a target="new" href="http://blog.360i.com/search-marketing/6-expect-google-decaf-caffeine-boost">6 Things to Expect if Google Decaf Gets a “Caffeine” Boost</a></li>
<li style="margin-left:10px;>Mashable: <a target="new" href="http://mashable.com/2009/08/10/google-caffeine/">Google Caffeine: A Detailed Test of the New Google</a></li>
<li style="margin-left:10px;>PCWorld: <a target="new" href="http://www.pcworld.com/article/170042/google_caffeine_faq_your_questions_answered.html">Google Caffeine FAQ: Your Questions Answered</a></li>
<!-- // End Indented Bullets -->

<li>Work with your SEO vendor to be sure your sites are up to date.  Even if you don’t engage them on a full project, consider hiring them for an hour to review changes you’ve made and allow them to communicate their consolidated knowledge on the topic (they read this stuff all day and use it in the field).</li>
<li>If you’re already a KeyLimeTie client, or if you don’t yet work with a dedicated SEO team, give us a call and ask about staying optimized for Caffeine.</li>
</ul>

<p>
<strong>Extra Credit:</strong> If you wish, you can also help Google test the new search engine by following the steps in <a target="new" href="http://googlewebmastercentral.blogspot.com/2009/08/help-test-some-next-generation.html">Google’s own blog post</a>.
]]></description> 
					<pubDate>Tue, 01 Sep 2009 16:38:55 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/9/1/three-things-to-prepare-for-google-caffeine/</guid>
				</item>
			
				<item>
					<title>Using Firebug To Debug Web Pages</title> 
					<link>http://keylimetie.com/blog/2009/4/27/using-firebug-to-debug-web-pages/</link> 
					<description><![CDATA[<p>Mozilla Firefox has a very powerful add-on tool called Firebug. Firebug allows web developers to inspect web pages to do such things as identify CSS styles being applied to sections of a page, easily inspect sections of a page, and to tweak style values to properly determine values for padding, font sizes, margins, and the like. Firebug is also extremely useful in tracking down and debugging layout issues on a page, especially trying to determine what style is actually being applied to a section of a page. Also, you can step-wise debug Javascript code being run by the browser.<strong><span style="text-decoration: underline;"><br />
</span></strong><br />
To get started, first install Mozilla Firefox, if not already installed (<a href="http://www.mozilla.com/en-US/firefox/ie.html">http://www.mozilla.com/en-US/firefox/ie.html</a>).  Then go to <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">https://addons.mozilla.org/en-US/firefox/addon/1843</a> (using Firefox) to download and install Firebug. When done, you'll see the Firebug option in Mozilla's Tools menu. Selecting Tools -> Firebug -> Open Firebug will display the Firebug panes at the bottom of the browser:<br />
<br />
<img alt="" height="390" width="581" src="/common/images/custom/blogs/firebug images/fb_blog_image_1.jpg" temp_src="/common/images/custom/blogs/firebug images/fb_blog_image_1.jpg" /><br />
<br />
<br />
Click on the Inspect button. Now you can mouse around the page and see the defined sections of the page (surrounded by blue border):<br />
<br />
<img alt="" height="389" width="581" src="/common/images/custom/blogs/firebug images/fb_blog_image_2.jpg" temp_src="/common/images/custom/blogs/firebug images/fb_blog_image_2.jpg" /><br />
<br />
<br />
The lower pane will display the relevant section of the page being moused over. You can also click on the moused-over area, which selects the area (and takes you out of inspect mode). The right pane will show what styles are in effect for the selected area, and you can also mouse over the HTML section to highlight the section on the page, and can click on the HTML pane lines to see the relevant styles, including the hierarchy/cascade effect of a given style.<br />
<br />
When an HTML line is selected, you can view and tweak the associate styles. This is very useful when debugging the page to determine both what style is (or isn't) being applied, and to determine correct values so the page is displayed as desired.<br />
<br />
<img alt="" height="389" width="581" src="/common/images/custom/blogs/firebug images/fb_blog_image_3.jpg" temp_src="/common/images/custom/blogs/firebug images/fb_blog_image_3.jpg" /><br />
<br />
<br />
You can also disable a style setting to see its effect, by clicking to the left of the setting in the right pane (marked by a red 'do not' symbol):<br />
<br />
<img alt="" height="389" width="581" src="/common/images/custom/blogs/firebug images/fb_blog_image_4.jpg" temp_src="/common/images/custom/blogs/firebug images/fb_blog_image_4.jpg" /><br />
<br />
<br />
Using combinations of these tweaking mechanisms and you can both easily see why a page displays and what the correct settings should be. You can also add new setting values in the right page.<br />
<br />
Lastly, Firebug can be used to debug Javascript. You can set breakpoints, watch values, and step lines of Javascript in real-time:<br />
<br />
<img alt="" height="389" width="581" src="/common/images/custom/blogs/firebug images/fb_blog_image_5.jpg" temp_src="/common/images/custom/blogs/firebug images/fb_blog_image_5.jpg" /><br />
<br />
<br />
In conclusion, Firebug helps to take out the guesswork in page layout and very easily shows what styles are being applied to sections of a page, as well as the page layout itself. For any serious web developer it is an essential tool. This blog is by no means a comprehensive explanation of all of Firebug's functionality, but rather a basic introduction of its core features. As of this writing, there is no equivalent tool for Internet Explorer. And, of course, IE and Mozilla don't always display a page the same way, typically because of the way the two browsers interpret styles.</p>
]]></description> 
					<pubDate>Mon, 27 Apr 2009 19:56:53 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/4/27/using-firebug-to-debug-web-pages/</guid>
				</item>
			
				<item>
					<title>A Password Reset Solution for Windows SharePoint Services</title> 
					<link>http://keylimetie.com/blog/2009/4/8/a-password-reset-solution-for-windows-sharepoint-services/</link> 
					<description><![CDATA[<img alt="WSSBlog482009.png" src="/Common/Images/custom/Blogs/WSSBlog482009.png" width="322" border="0" height="170" align="right" />
If you need a solution that allows users to quickly change their NT account passwords on a web server that resides outside of their domain, you can use the <strong>DirectoryServices</strong> namespace. One example of when this might be necessary is in the case of a Windows SharePoint Service site that is exposed to an external set of users. The code below and attached solution shows how to do this. <br /><br />You begin by adding a reference to the System.DirectoryServices.dll assembly. Next, create a web form with 2 Labels, 2 Textboxes and a Button control, like the one shown below: <br /><br />In the code behind, add the following: <br /><br /><pre style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 255);">string</span> userName = <span style="color: rgb(0, 0, 255);">string</span>.Empty;

    <span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 255);">void</span> Page_Load(<span style="color: rgb(0, 0, 255);">object</span> sender, EventArgs e)
    {

        userName = HttpContext.Current.User.Identity.Name.ToString();
        lblLoggedInUser.Text = userName.Split('\\')[1];
        lblMessage.Text = <span style="color: rgb(0, 0, 255);">string</span>.Empty;
        lblMessage.ForeColor = System.Drawing.Color.Red;
    }</pre><p>The first 2 lines of code in the Page_Load event get the current user’s domain and user name and writes the user name portion to the label control. Putting the user name in a label control versus a text box prevents users from changing the passwords of users. Next, add the following code and wire this event to the Button’s Click event: </p><pre style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 255);">protected </span><span style="color: rgb(0, 0, 255);">void</span> btnResetPassword_Click(<span style="color: rgb(0, 0, 255);">object</span> sender, EventArgs e)
    {
        <span style="color: rgb(0, 0, 255);">try</span>
        {
                            
            <span style="color: rgb(0, 0, 255);">string</span> user = userName.Split('\\')[1];
            DirectoryEntry AD = <span style="color: rgb(0, 0, 255);">new</span> DirectoryEntry(<span style="color: rgb(132, 130, 132);">"WinNT://"</span> + Environment.MachineName + <span style="color: rgb(132, 130, 132);">",computer"</span>);
            DirectoryEntry NewUser = AD.Children.Find(user);

            NewUser.Invoke(<span style="color: rgb(132, 130, 132);">"SetPassword"</span>, <span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 255);">object</span>[] {txtConfirmPassword.Text});
            NewUser.CommitChanges();

            lblMessage.Text = <span style="color: rgb(132, 130, 132);">"Password change successful."</span>;
            lblMessage.ForeColor = System.Drawing.Color.Green;
        }
        <span style="color: rgb(0, 0, 255);">catch</span> (Exception err)
        {
            <span style="color: rgb(0, 130, 0);">// set the error message</span>
            Response.Write(err.Message);
        }
    }
}</pre><p>The first three lines in the code above create an instance of the DirectoryEntry class based on the name of the computer and then query that computer for the specific user. Once the directory entry for that user is located, the Invoke method is called on the directory entry, passing in the command argument for setting the new password. This is followed by a call to the CommitChanges method. Lastly, in order to run this code on the web server, the web.config file needs to be modified so that the solution impersonates a user with privileges to update security settings: </p><pre><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">identity</span><span style="color: rgb(255, 0, 0);"> impersonate<span style="color: rgb(0, 0, 255);">="true"</span> userName<span style="color: rgb(0, 0, 255);">="user"</span> password<span style="color: rgb(0, 0, 255);">="pwd"</span></span><span style="color: rgb(0, 0, 255);">/></span></pre><p>Once the page is made available on the server, you can integrate it with SharePoint by adding a link to the SharePoint site, or by linking to it through a Page Viewer web part.</p>]]></description> 
					<pubDate>Wed, 08 Apr 2009 15:13:30 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/4/8/a-password-reset-solution-for-windows-sharepoint-services/</guid>
				</item>
			
				<item>
					<title>SQL Server 2005 Script to Generate INSERT statements</title> 
					<link>http://keylimetie.com/blog/2009/3/24/sql-server-2005-script-to-generate-insert-statements/</link> 
					<description><![CDATA[When it comes time to migrate code and database changes for a project, you often need to create new rows in the various environments (i.e. QA, Staging, Production). Some migrations involve creating rows for list tables, including states, countries, status codes, etc. One option is to write the INSERT statements one at a time, but that is too time consuming and is prone to errors. Instead, you can use the SQL script listed below. <br />
<br />
When you run the script against a table, you'll notice 2 things:<br />
1. All data values are converted to HEX so you don't need to worry about escaping quotes.<br />
2. If the table has an identity column, the script will generate the IDENTITY_INSERT commands as well. <br />
<br />
<a target="_blank" href="/Common/Downloads/Blogs/CreateInserts.txt"><span style="text-decoration: underline;">Download SQL script</span></a><br />
<br />
<pre><span style="color: #006400;">/* EXAMPLES<br />--Entire table<br />CreateInserts 'Webpages'<br />--Entries WHERE WebpageID > 100<br />CreateInserts 'Webpages', 'WebpageID > 100'<br />--Entries WHERE WebpageID > 100 ORDER BY Title<br />CreateInserts 'Webpages', 'WebpageID > 100', 'Title'<br />*/</span><span style="color: #006400;">--If stored procedure already exists, drop it</span>
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = 
OBJECT_ID(N'[dbo].[CreateInserts]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[CreateInserts]
GO

<span style="color: #006400;">--Create the stored procedure</span>
CREATE PROC CreateInserts

@tableName nvarchar(100),
@whereClause nvarchar(MAX) = '',
@orderByClause nvarchar(MAX) = ''

AS

<span style="color: #006400;">--Declare variables</span>
DECLARE @tableHasIdentity bit
DECLARE @sql nvarchar(MAX)
DECLARE @cols nvarchar(MAX)
DECLARE @vals nvarchar(MAX)
SET @cols = ''
SET @vals = ''

<span style="color: #006400;">--Determine if table has an identity column</span>
SELECT @tableHasIdentity = 
OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @tableName

<span style="color: #006400;">--Do we need 'SET IDENTITY_INSERT tableName ON' statement?</span>
IF @tableHasIdentity = 1
	BEGIN
		SET @sql = 'SELECT TOP 1 ''SET IDENTITY_INSERT ' + 
@tableName + ' ON '' FROM ' + @tableName
		EXEC sp_executesql @sql
	END

<span style="color: #006400;">--Build list of columns and values</span>
SELECT @cols = @cols + ',' + '[' + column_name + ']', @vals = @vals + 
	'+'',''+ISNULL(master.dbo.fn_varbintohexstr(cast([' + 
column_name + '] as varbinary(max))),''NULL'')' 
FROM INFORMATION_SCHEMA.columns 
WHERE TABLE_NAME = @tableName and DATA_TYPE != 'timestamp'

<span style="color: #006400;">--Build SQL string</span>
SET @sql = 'SELECT ''INSERT INTO [' + @tableName + '] (' + 
SUBSTRING(@cols,2,LEN(@cols)) + ') ' + 
			'VALUES (''+' + SUBSTRING(@vals, 6, 
LEN(@vals)) + '+'')'' FROM ' + @tableName
<span style="color: #006400;">--Adjust @whereClause and @orderByClause</span>
IF LEN(@whereClause) > 0
	SET @sql = @sql + ' WHERE ' + @whereClause
IF LEN(@orderByClause) > 0
	SET @sql= @sql + ' ORDER BY ' + @orderByClause

<span style="color: #006400;">--Execute SQL string</span>
exec sp_executesql @sql

<span style="color: #006400;">--Do we need 'SET IDENTITY_INSERT tableName OFF' statement?</span>
IF @tableHasIdentity = 1
	BEGIN
		SET @sql = 'SELECT TOP 1 ''SET IDENTITY_INSERT ' + 
@tableName + ' OFF '' FROM ' + @tableName
		EXEC sp_executesql @sql
	END

GO</pre>
]]></description> 
					<pubDate>Wed, 25 Mar 2009 02:53:27 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/3/24/sql-server-2005-script-to-generate-insert-statements/</guid>
				</item>
			
				<item>
					<title>Why GWT?</title> 
					<link>http://keylimetie.com/blog/2009/3/11/why-choose-gwt/</link> 
					<description><![CDATA[
		<img style="PADDING-RIGHT: 0px; PADDING-LEFT: 20px; PADDING-BOTTOM: 20px; PADDING-TOP: 0px" src="/Common/Images/custom/gwt-logo.png" align="right" />
		<p>The last song on the radio, as I was parking my car today, was <i>Turning Japanese</i> (bonus points if you can name the artist without using Google). This is not the ideal song to have running through your head on a workday, or pretty much any other time. So in an effort to dispel the demons of eighties novelty pop music from my tortured brain, I thought today was as good a time as any to write about the Google Web Toolkit (GWT). <br /></p>
		<p>GWT is a framework for writing AJAX interactive web applications. Take a look at the <a href="http://code.google.com/webtoolkit/">GWT home page</a> for lots of great information about GWT. I'm going to look at this from the point of view of answering the key question - "Why GWT"? In other words, out of all the AJAX frameworks out there, what compelling reasons are there to choose GWT? </p>
		<h3>Write Java code, not JavaScript</h3>
		<p>One of the most unique features of GWT is that you code in Java. While in development, you can run your Java code in a special "hosted mode" browser with all of the mature, sophisticated Java debugging tools you always have available. For deployment, this Java code is run through a compiler which translates this Java code to cross-browser JavaScript. </p>
		<p>Although this is significant, especially in shops with a lot of Java experience, I don't believe this is a truly killer feature of GWT. The important thing is that the developer is shielded from the complexities of writing JavaScript code that works in all browsers. Other AJAX frameworks provide a layer of JavaScript that provides this abstraction. GWT does this by translating standard Java code, but <i>how</i> this is abstracted is less important than the simple fact that it <i>is</i> abstracted. </p>
		<h3>Simple RPC mechanism</h3>
		<p>GWT has its own mechanism for remote procedure calls between the browser and the server. This works a lot like vanilla Java RMI - define interfaces and implementations for your server functions, and code will be generated to allow your client code to call them as if they were simple local methods. This blows away all the work of defining XML or JSON data formats for requests and responses. Just code the function for the server, call the function (still in Java) from the client code, and all of the marshalling, unmarshalling, network communication, etc. is done for you. </p>
		<p>GWT also supports other RPC methods, such as XML or JSON over HTTP. You can write server code as standard SOAP or REST web services and GWT will be able to use them directly. This will take longer to code than the GWT RPC mechanism, but allows you to use legacy web services or services intended to also be used by non-GWT clients. A good middle-ground approach may be to prototype using GWT RPC, and re-implement as web services later. </p>
		<img style="PADDING-RIGHT: 20px; PADDING-LEFT: 0px; PADDING-BOTTOM: 20px; PADDING-TOP: 10px" src="/Common/Images/custom/browsers.jpg" align="left" />
		<h3>Optimized cross-browser JavaScript</h3>
		<p>One of the key reasons to use any AJAX framework is to write code that will produce identical results on all browsers, which is fiendishly difficult in raw JavaScript. Why roll your own code to handle all of those quirks, when a bunch of framework authors have already done it for you? GWT handles this, just like any good framework. As a bonus, the generated JavaScript is automatically compressed and obfuscated, decreasing download size and making reverse engineering more difficult. </p>
		<p>Download sizes are kept even smaller by a unique GWT feature, namely... </p>
		<h3>Deferred binding</h3>
		<p>Writing code that works on any browser is great. But there is a cost - the framework has to include code for every browser. You may be viewing the page in IE, but you also downloaded code specific to Firefox, Safari, and Opera, which will never be executed. Deferred binding is the GWT solution to this dilemma. </p>
		<p>The first step in deferred binding happens during compilation. The GWT compiler creates a different JavaScript file for each browser type, containing all of your application code optimized for just that one browser. A very small bootstrap script is also generated, which examines the execution environment and determines which browser-specific application script to load. The bootstrap script is included in a standard HTML page, and when the page loads the script will resolve, download, and run the correct application script. </p>
		<p>There is also provision for taking advantage of caching. The bootstrap file is intended to never be cached (and is helpfully suffixed with "nocache.js" as a reminder). The implementation scripts are intended to be cached, and have file names that are a hash code of their contents. This means that if you re-compile, but there are no changes in a particular file, it will have the same name and will allow the browser to use the already cached version. If the file changes, it's filename will change and therefore force a reload when it is next requested. All of this is done without any developer help (the generated bootstrap script deals with the filenames automatically). Pretty neat, huh? </p>
		<p>I've only talked about deferring binding based on browser type so far, but this is a general mechanism and you can define other context-dependent variances as well. The most common use of this is... </p>
		<img style="PADDING-RIGHT: 20px; PADDING-LEFT: 0px; PADDING-BOTTOM: 20px; PADDING-TOP: 10px" src="/Common/Images/custom/localization.jpg" align="left" />
		<h3>Localization</h3>
		<p>Localizing a GWT application is very straightforward and very similar to how it is done in standard Java applications. In the simple case, just create properties files with locale suffixes, access them by key through a GWT interface, and the locale-specific string will be used. The cool part is that GWT uses the deferred binding mechanism to make sure that only those properties for the current user's locale are ever downloaded. </p>
		<p>As with browser-specific code, this starts at compile time. For each combination of browser AND locale, an application script is generated. So, if you have, say, 4 browsers and 3 different locales, you will have 12 files generated - such as FireFox in English, FireFox in French, IE in English, etc. The bootstrap file will examine the client environment and load the application file specific to the detected browser and locale. </p>
		<h3>Image bundles</h3>
		<p>It should be obvious by now that the Google team put a lot of effort into ensuring the highest possible performance. Image bundles are yet another performance-boosting feature of GWT. Defining an image bundle allows the GWT compiler to package a number of images into a single file which is accessed through a Java object. This reduces the number of network round trips by getting all images for your application in a single file download. The packaging is done by the GWT compiler; all the developer has to do is define an annotated interface with a function to access each image. </p>
		<img style="PADDING-RIGHT: 0px; PADDING-LEFT: 20px; PADDING-BOTTOM: 10px; PADDING-TOP: 20px" src="/Common/Images/custom/puzzle.png" align="right" />
		<h3>Embeds well in existing sites</h3>
		<p>Some frameworks work best only if they are in charge of the whole page. GWT "plays well with others", in that it can generate entire pages or elements within a page equally well. The GWT scripts work by creating HTML elements inside a specified element on a page during the onLoad() event. To embed a GWT application in an existing page, you therefore only need to include the script file and add an id to the element you want to contain the application (which can be a div, a td, the body, anything). Couldn't be easier. </p>
		<h3>Conclusion</h3>
		<p>That's a lot of good reasons to choose GWT, and that's just scratching the surface. There are many other features that make GWT a compelling choice. These include interoperation with native JavaScript, intelligent support for back button navigation within an application, accessibility support, programming delayed logic, support for JUnit testing, availability of third-party widget libraries, and more. GWT is also under continuous development, with the upcoming 1.6 version to include improvements like a faster hosted mode server, faster string handling, better compiler performance, and easier deployment to standard JEE WAR files. The Google team has done a very good job of providing a no-compromise framework that provides a fast, rich, and consistent user experience while keeping the developer focused on the application rather than the technology. It's definitely worth taking for a test drive. </p>
		<p>Now, if I could just get that song out of my head... </p>
]]></description> 
					<pubDate>Wed, 11 Mar 2009 14:01:47 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/3/11/why-choose-gwt/</guid>
				</item>
			
				<item>
					<title>ASP.NET DataView - Always Create a New Instance!</title> 
					<link>http://keylimetie.com/blog/2009/1/12/aspnet-dataview-always-create-a-new-instance/</link> 
					<description><![CDATA[<img src="/Common/Images/custom/Blogs/DataView-Thread-Tester.jpg" align="right">
We recently built website software for a client that had a requirement to handle 1,000 concurrent users for 3 minutes. During the initial stress testing, the software performed perfectly up to 250 users. Once it hit 250 users, we started to receive exceptions and page content wasn't being displayed properly. After some investigation, KeyLimeTie senior developer, Michael Wick, determined the problem was around our use of the DataView class. He believed the code was not thread safe and causing threads to overwrite each other.
<br />
<br />
We went to MSDN to see if the class is thread safe and according to Microsoft, "This type is safe for multithreaded read operations. You must synchronize any write operations." What's the definition of "write operations"? In our case, the DataTable the DataView consumed was being written to once (when the website started up), but was being filtered many times in a static class. We felt the way we were using the class constituted as multiple "write operations". To confirm this, we created a test application.
<br />
<br />
<a href="/Common/Downloads/DataViewThreadTesterEXE.zip">Download Application only</a><br />
<a href="/Common/Downloads/DataViewThreadTester.zip">Download Source Code</a>
<br />
<br />
<strong>Code</strong>
<br />
In the code below, the DataView is initialized two completely different ways:
<br />
Line 4: A new instance of the DataView class is created (good)
<br />
Line 6: Uses a shared view of the DataTable (bad)
<br />
<br />

<pre style="color: #000000"><span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>1</span><span style="color: #008200">//Create DataView</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>2</span>DataView dv = <span style="color: #0000FF">null</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>3</span><span style="color: #0000FF">if</span> (useNew)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>4</span>    dv = <span style="color: #0000FF">new</span> DataView(dt);
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>5</span><span style="color: #0000FF">else</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>6</span>    dv = dt.DefaultView;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>7</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>8</span><span style="color: #008200">//Apply filter</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>9</span>dv.RowFilter = <span style="color: #848284">"RandomNumber = "</span> + randomNumber.ToString();
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>10</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>11</span><span style="color: #008200">//Return num rows found</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>12</span><span style="color: #0000FF">return</span> dv.Count;</pre>
<br />
<br />
With low usage, Line 4's code will work just fine. Once your software starts to pick up more usage, it will begin to error. Please run the test application we have provided to see for yourself. The screenshot below illustrates what happens when a new instance of the DataView class isn't created every time it's used. The feedback in the application shows the thread numbers and their operations. Notice the DataView code has been executed over each other's thread causing unexpected results. Next, check the "Use new keyword" checkbox and you'll see the expected results are always met (no errors reported).]]></description> 
					<pubDate>Mon, 12 Jan 2009 17:55:14 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2009/1/12/aspnet-dataview-always-create-a-new-instance/</guid>
				</item>
			
				<item>
					<title>Writing Database Objects In Managed Code</title> 
					<link>http://keylimetie.com/blog/2008/12/10/writing-database-objects-in-managed-code/</link> 
					<description><![CDATA[<p>With SQL Server 2005, you can use .NET Framework languages to create database objects and retrieve and update data. You can create stored procedures, triggers, aggregates, user-defined functions, and user-defined types, using any one of the CLR-compliant languages. In this article, I will cover the steps involved in creating and debugging a stored procedure in C#.</p>
<p>To begin, it's worth noting that there are several advantages to using managed code over T-SQL: </p>
<p>
<strong>
<span style="text-decoration: underline;">Enhanced programming model </span>
</strong>  .NET Framework languages offer constructs and capabilities previously unavailable to SQL developers. Visual Basic, Visual C#, and Visual C++ provide capabilities that are not available in Transact-SQL, such as arrays, sophisticated exception handling, and reusability of code. </p>
<p>
<strong>
<span style="text-decoration: underline;">Reusability of Code</span>
</strong>   A library of managed assemblies can be created and distributed more easily than a Transact-SQL script can be distributed.  </p>
<p>
<strong>
<span style="text-decoration: underline;">Leverage Existing Skills</span>
</strong>   You can use and enhance your skills in the languages and development environment in which you are already experienced to create database objects. </p>
<p>
<strong>
<span style="text-decoration: underline;">Richer developer experience</span>
</strong>   When you develop database objects using the SQL Server project template, you have complete integration with the project system, including building, debugging, and deployment to multiple servers. </p>
<p>
<strong>
<span style="text-decoration: underline;">Security</span>
</strong>   When you use database objects created using Visual Basic, Visual C#, or Visual C++, the code-access security of those languages is combined with the user-based permissions in SQL Server. </p>
<p>
<br />
<strong>
<span style="text-decoration: underline;">Creating the Database Project</span>
</strong>
</p>
<p>The first step in creating a stored procedure (or any database object) is to create a SQL Server project in Visual Studio: </p>
<p>1. From the File menu, create a new project. </p>
<p>2. In the New Project Dialog, select and expand a language node in the Project Types area. </p>
<p>3. Select the Database node. </p>
<p>4. Select the SQL Server Project template. </p>
<p>5. Click OK. <br />
</p>
<img alt="" height="378" width="560" src="http://www.petermorano.com/images/MC01.jpg" style="width: 560px; height: 378px;" />
<br />
<br />
<p>Next, you will prompted for the database connection you are using. Unless this database has had CLR-integration enabled previously, you will need to run the following in SQL Server:</p>
<p>sp_configure 'clr enabled', 1 <br />
GO <br />
RECONFIGURE <br />
GO </p>
<p>
<strong>
<span style="text-decoration: underline;">Creating the Stored Procedure</span>
</strong>
</p>
<p>At this point, you are ready to start creating database objects. To create a new stored procedure, do the following steps:<br />
1. Open an existing SQL Server Project, or create a new one.  From the Project menu, select Add New Item. </p>
<p>2. Select Stored Procedure. </p>
<p>3. Type a Name for the new stored procedure. </p>
<p>4. Add code to run when the stored procedure is executed. </p>
<p>5. In the sample code below, I have created a stored procedure that accepts one parameter and queries the Product table of the Adventure Works database. The code should look very familiar, utilizing Connection, Command and Parameter objects. One object that may not be familiar is the SQLPipe. This allows managed stored procedures running in-process on a SQL Server database to return results back to the caller. </p>
<pre style="color: #000000;">    [Microsoft.SqlServer.Server.SqlProcedure]<br />    <span style="color: #0000ff;">public</span><span style="color: #0000ff;">static</span><span style="color: #0000ff;">void</span> SelectProductByProductID(<span style="color: #0000ff;">int</span> productID)<br />    {<br />        <span style="color: #0000ff;">using</span> (SqlConnection conn = <br /><span style="color: #0000ff;">new</span> SqlConnection(<span style="color: #848284;">"context connection=true"</span>))<br />        {<br />            <span style="color: #0000ff;">try</span>
            {
                SqlPipe pipe = <span style="color: #0000ff;">null</span>;<br /><br />                SqlCommand SelectProductCommand = <span style="color: #0000ff;">new</span> SqlCommand();<br /><br />                SqlParameter productIDParam = <br /><span style="color: #0000ff;">new</span> SqlParameter(<span style="color: #848284;">"@ProductID"</span>, SqlDbType.Int);<br /><br />                productIDParam.Value = productID;<br /><br />                SelectProductCommand.Parameters.Add(productIDParam);<br />                SelectProductCommand.CommandText = 
<span style="color: #848284;">"Select * from Production.Product where AProductID = @ProductID"</span>;<br /><br />                conn.Open();<br /><br />                SelectProductCommand.Connection = conn;<br /><br />                pipe = SqlContext.Pipe;<br />                pipe.ExecuteAndSend(SelectProductCommand);<br />            }<br />            <span style="color: #0000ff;">catch</span> (SqlException sqlEx)<br />            {<br />                <span style="color: #008200;">//code to handle or log the sql exception here </span>
                Console.WriteLine(sqlEx);
            }
            <span style="color: #0000ff;">catch</span> (Exception ex)<br />            {<br />                Console.WriteLine(ex);<br />            }<br />        }<br />    }</pre>
<p>Once the code is ready, you can build and deploy the stored procedure to the database by pressing 'F5'. To test the deployment, there is a file in your project called test.sql. In this file, you can add script calls to the obects you just created. For example, to call the stored procedure created above, enter:</p>
<p>EXEC [dbo].[SelectProductByProductID] 4</p>
<p>
<br />
That's it. If the stored procedure was written correctly, you will now see this item in list of stored procedures in Enterprise Manager. However, you'll see the object has a lock icon next to it, as shown below. This is because the object is not editable outside of the Visual Studio project.<br />
<br />
<br />
<img alt="" height="169" width="516" src="http://www.petermorano.com/images/MC02.jpg" /><br />
<br />
<br />
<strong><span style="text-decoration: underline;">Conclusion</span></strong></p>
<p>At this point, you might be asking 'so where are the benefits?'. Let's look at a few:</p>
<p>
<strong>
<span style="text-decoration: underline;">Exception Handling</span>:</strong> if the stored procedure returns an error, say a constraint violation for example, this error gets converted into a SqlException that you can then handle in your managed code. To try this, change the column in the stored procedure text above to AProduct and hit 'F5'. You'll see that the catch block is entered. This gives a lot of flexibility in how you handle errors that don't readily exist in T-SQL.</p>
<p>
<strong>
<span style="text-decoration: underline;">Deployment:</span>
</strong>If you need to deploy the objects you created to another server, you simply change the database connection in the project properties and hit 'F5'. No more creating and managing scripted stored procedures.</p>
<p>
</p>
]]></description> 
					<pubDate>Wed, 10 Dec 2008 23:07:13 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/12/10/writing-database-objects-in-managed-code/</guid>
				</item>
			
				<item>
					<title>Migrating ASP.NET Applications to IIS 7.0 Integrated Mode </title> 
					<link>http://keylimetie.com/blog/2008/11/14/migrating-aspnet-applications-to-iis-70-integrated-mode/</link> 
					<description><![CDATA[Upgrading an ASP.NET application from IIS 6.0 and lower (Classic ASP.NET Integration Mode) to IIS 7.0 (Integrated Mode) can be a lot of work. To help, Microsoft provides an application that does the work for you.
<br />
<br />
IIS 7.0 takes care of migrating the application by using the APPCMD.EXE command line tool to perform the migration. The migration error message contains the command that is executed in command line window (which you must run--right click the Programs\Accessories\Command Prompt icon, and choose "Run as administrator") in order to instantly migrate your application to Integrated mode. 
<br />
<br />
The basic format of the migration command is the following: 
<br />
<br />
<i>%windir%\system32\inetsrv\APPCMD.EXE migrate config <Application Path></i>
<br />
<br />
where <Application Path> is the virtual path of the application containing the site name, such as "Default Web Site/app1". 
<br />
<br />
When migration is complete, your application runs in both Integrated and Classic modes without a problem. 
<br />
<br />
Note: If you change the configuration after migration, the server will not prompt you to migrate again. After initial migration, you must make sure that your configuration remains in sync between the two modes – manually migrate the application again using the APPCMD.EXE command line tool. 
<br />
<br />
Source: <a target="_blank" href="http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis7/">http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis7/</a>]]></description> 
					<pubDate>Fri, 14 Nov 2008 20:10:22 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/11/14/migrating-aspnet-applications-to-iis-70-integrated-mode/</guid>
				</item>
			
				<item>
					<title>Prevent ASP.NET Pages From Caching</title> 
					<link>http://keylimetie.com/blog/2008/10/17/prevent-aspnet-pages-from-caching/</link> 
					<description><![CDATA[We recently came across a scenario where an ASP.NET page was caching on the user's browser and causing issues. ASP.NET pages are dynamic and their content should never cache. To force the browser to not cache the page, add the following code:
<br />
<br />
<strong>Code-behind</strong>
<br />
<pre style="color: #000000;"><span style="border-right: 1px solid #999999; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; color: #008284;">1</span>Response.AppendHeader(<span style="color: #848284;">"Cache-Control"</span>, <span style="color: #848284;">"no-cache; private; no-store; <br />must-revalidate; max-stale=0; post-check=0; pre-check=0; max-age=0"</span>);
<span style="border-right: 1px solid #999999; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; color: #008284;">2</span>Response.AppendHeader(<span style="color: #848284;">"Pragma"</span>, <span style="color: #848284;">"no-cache"</span>);
<span style="border-right: 1px solid #999999; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; color: #008284;">3</span>Response.AppendHeader(<span style="color: #848284;">"Keep-Alive"</span>, <span style="color: #848284;">"timeout=3, max=993"</span>);
<span style="border-right: 1px solid #999999; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; color: #008284;">4</span>Response.AppendHeader(<span style="color: #848284;">"Expires"</span>, <span style="color: #848284;">"Mon, 26 Jul 1997 05:00:00 GMT"</span>); 
<span style="color: #008200;">//Some random old date</span></pre>
<br />
<br />
<strong>HTML META tags</strong>
<br />
<pre style="color: #000000;"><span style="border-right: 1px solid #999999; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; color: #008284;">1</span><meta http-equiv=expires content=-1>
<span style="border-right: 1px solid #999999; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; color: #008284;">2</span><meta http-equiv=Cache-Control CONTENT=no-cache>
<span style="border-right: 1px solid #999999; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; color: #008284;">3</span><meta http-equiv=Pragma CONTENT=no-cache></pre>
]]></description> 
					<pubDate>Fri, 17 Oct 2008 16:02:49 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/10/17/prevent-aspnet-pages-from-caching/</guid>
				</item>
			
				<item>
					<title>How to safely escape invalid XML characters</title> 
					<link>http://keylimetie.com/blog/2008/9/25/how-to-safely-escape-invalid-xml-characters/</link> 
					<description><![CDATA[When saving strings to XML, it important to escape invalid characters. The following table shows the invalid XML characters and their escaped equivalents.
<br /><br />
<table cellpadding="2" border="1" width="300">
<tr>
<td align="center">
<strong><u>Invalid XML Character</u></strong>
</td>
<td align="center">
<strong><u>Replaced With</u></strong>
</td>
</tr><tr>
<td align="center">
<
</td>
<td align="center">
<
</td>
</tr>
<tr>
<td align="center">
>
</td>
<td align="center">
>
</td>
</tr>
<tr>
<td align="center">
'
</td>
<td align="center">
'
</td>
</tr>
<tr>
<td align="center">
&apos;
</td>
<td align="center">
&apos;
</td>
</tr>
</tr>
<tr>
<td align="center">
&
</td>
<td align="center">
&amp;
</td>
</tr>
</table>
<br />
Rather than write code to do a bunch of replaces, use this one line of code:
<br />
<br />
<pre style="color: #000000"><span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>1</span><span style="color: #0000FF">string</span> escapedText = System.Security.SecurityElement.Escape(input);</pre>
<br />
By using this built-in .NET method, you ensure your strings are properly escaped.
<br />
<br />
To learn more about this method and see developer's feedback (some people have concerns), go to
<br />
<a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape(VS.80).aspx">http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape(VS.80).aspx</a>
]]></description> 
					<pubDate>Thu, 25 Sep 2008 19:32:49 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/9/25/how-to-safely-escape-invalid-xml-characters/</guid>
				</item>
			
				<item>
					<title>How to validate strings for XML</title> 
					<link>http://keylimetie.com/blog/2008/9/2/how-to-validate-strings-for-xml/</link> 
					<description><![CDATA[Back on 3/28/2008, we published a blog titled <a href="/Blog/2008/3/28/How-to-check-for-hexidecimal-characters/"><u>How to check for hexidecimal characters</u></a>. I used this code as a basis to write a method to ensure only valid UTF-8 characters are in a string. If invalid characters are in an XML document, the document cannot be consumed by an application and can cause a complete website outage (depending on how it's used). The following method looks for invalid XML characters.

<br /><br />

<pre style="color: #000000"><span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>1</span><span style="color: #0000FF">private</span> <span style="color: #0000FF">static</span> <span style="color: #0000FF">bool</span> IsValidString(<span style="color: #0000FF">string</span> input)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>2</span>{
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>3</span>    <span style="color: #0000FF">try</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>4</span>    {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>5</span>        <span style="color: #008200">//Trim input string</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>6</span>        input = input.Trim();
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>7</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>8</span>        <span style="color: #008200">//If blank, no need to validate</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>9</span>        <span style="color: #0000FF">if</span> (input.Length == 0)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>10</span>            <span style="color: #0000FF">return</span> <span style="color: #0000FF">true</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>11</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>12</span>        <span style="color: #008200">//Loop through characters</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>13</span>        <span style="color: #0000FF">foreach</span> (<span style="color: #0000FF">char</span> currentChar <span style="color: #0000FF">in</span> input)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>14</span>        {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>15</span>            <span style="color: #0000FF">if</span> (currentChar == 0x9 || <span style="color: #008200">// \t = 9</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>16</span>                currentChar == 0xA || <span style="color: #008200">//   = 10</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>17</span>                currentChar == 0xD || <span style="color: #008200">//   = 13</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>18</span>                (currentChar >= 0x20 && currentChar <= 0xD7FF) ||
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>19</span>                (currentChar >= 0xE000 && currentChar <= 0xFFFD) ||
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>20</span>                (currentChar >= 0x10000 && currentChar <= 0x10FFFF))
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>21</span>            {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>22</span>                <span style="color: #008200">//Valid character</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>23</span>            }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>24</span>            <span style="color: #0000FF">else</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>25</span>                <span style="color: #0000FF">return</span> <span style="color: #0000FF">false</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>26</span>        }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>27</span>    }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>28</span>    <span style="color: #0000FF">catch</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>29</span>    {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>30</span>        <span style="color: #0000FF">return</span> <span style="color: #0000FF">false</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>31</span>    }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>32</span>    <span style="color: #0000FF">return</span> <span style="color: #0000FF">true</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>33</span>}
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>34</span></pre>]]></description> 
					<pubDate>Tue, 02 Sep 2008 15:22:38 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/9/2/how-to-validate-strings-for-xml/</guid>
				</item>
			
				<item>
					<title>Use CSS to AutoSize a DIV</title> 
					<link>http://keylimetie.com/blog/2008/8/11/use-css-to-autosize-a-div/</link> 
					<description><![CDATA[There are often cases where you want to display content in a div, but a fixed height won't work. It the height is too little, content is cut off or you need a vertical scrollbar (by setting the overflow value). If the height is too much, you'll have a lot of whitespace. The example below shows you how to easily create a div that autosizes based on the content.
<br />
<pre style="color: #000000"><span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>1</span><span style="color: #008200">//HTML:</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>2</span><div id=<span style="color: #848284">"outerDiv"</span> <span style="color: #0000FF">class</span>=<span style="color: #848284">"autosize"</span>>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>3</span>    <div id=<span style="color: #848284">"innerDiv"</span> runat=<span style="color: #848284">"server"</span> style=<span style="color: #848284">"display: block"</span>>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>4</span>        <span style="color: #008200">//Content...</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>5</span>    </div>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>6</span></div>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>7</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>8</span><span style="color: #008200">//CSS:</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>9</span><span style="color: #6699cc">#outerDiv</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>10</span>{
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>11</span>    min-height: 200px; 
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>12</span>}
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>13</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>14</span>div.autosize { display: table; width: 1px; }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>15</span>div.autosize > div { display: table-cell; }</pre>]]></description> 
					<pubDate>Mon, 11 Aug 2008 14:21:55 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/8/11/use-css-to-autosize-a-div/</guid>
				</item>
			
				<item>
					<title>Using Visual Studio 2005 Add-ins in Visual Studio 2008</title> 
					<link>http://keylimetie.com/blog/2008/11/10/using-visual-studio-2005-add-ins-in-visual-studio-2008/</link> 
					<description><![CDATA[
		<div id="ctl00_LibFrame_ctl10">
				<p>As your organization makes the move from Visual Studio 2005 to Visual Studio 2008, you're going to need to move all of the Add-ins you have come to rely on over as well. Unless the Add-in you have in mind uses some Visual Studio version-specific API, the method for porting an Add-in to the new release should be seamless.</p>
				<p>There are 2 steps you need to follow to get the Add-in over to Visual Studio 2008:</p>
				<p>
						<strong>1.</strong> Move the Add-in's Dll and associated files to the Addins folder under Visual Studio 2008.</p>
				<p>You will find the Add-in Dll and associated files in the <strong>Addins</strong> folder under <strong>Visual Studio 2005</strong>. The path is likely</p>
				<p>
						<em>C:\Documents and Settings\User\My Documents\Visual Studio 2005\Addins  </em>
				</p>
				<p>Copy the files for the Add-in you wish to migrate, and paste them into the <strong>Addins</strong> folder under <strong>Visual Studio 2008</strong>. The path for 2008 is similar, and if you do not find an Addins folder, you can create one manually.</p>
				<p>
						<em>C:\Documents and Settings\User\My Documents\Visual Studio 2008\Addins</em>
				</p>
				<p>Be sure to grab the .dll, .dll.config the .Addin files, as shown below.</p>
				<p align="center">
						<img src="http://petermorano.com/images/1120.jpg" /> </p>
				<p>
						<strong>2. </strong>Once the files have been copied to the new Addins folder, you will need to update the .Addin file to increment the Host Application's (Visual Studio) version number. You can do this by opening the file in any text editor, finding the nodes labelled <strong><em>version</em></strong>, and changing it from 8.0 to 9.0.<strong></strong>I have bolded the version node below <span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: verdana,arial,helvetica; BACKGROUND-COLOR: white"><strong> </strong></span><strong><span style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: verdana,arial,helvetica; BACKGROUND-COLOR: white"></span></strong><!--StartFragment--><!--
{ tf1\ansi\ansicpg\lang1024 oproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;?? ed0\green0\blue255; ed255\green255\blue255; ed163\green21\blue21; ed255\green0\blue0; ed0\green0\blue0;}??\fs20 \cf1 <?\cf3 xml\cf1  \cf4 version\cf1 =\cf0 "\cf1 1.0\cf0 "\cf1  \cf4 encoding\cf1 =\cf0 "\cf1 UTF-16\cf0 "\cf1  \cf4 standalone\cf1 =\cf0 "\cf1 no\cf0 "\cf1 ?>\par ??<\cf3 Extensibility\cf1  \cf4 xmlns\cf1 =\cf0 "\cf1 http://schemas.microsoft.com/AutomationExtensibility\cf0 "\cf1 >\par ??\tab <\cf3 HostApplication\cf1 >\par ??\tab \tab <\cf3 Name\cf1 >\cf0 Microsoft Visual Studio Macros\cf1 </\cf3 Name\cf1 >\par ??\tab \tab <\cf3 Version\cf1 >\cf0 8.0\cf1 </\cf3 Version\cf1 >\par ??\tab </\cf3 HostApplication\cf1 >\par ??\tab <\cf3 HostApplication\cf1 >\par ??\tab \tab <\cf3 Name\cf1 >\cf0 Microsoft Visual Studio\cf1 </\cf3 Name\cf1 >\par ??\tab \tab <\cf3 Version\cf1 >\cf0 8.0\cf1 </\cf3 Version\cf1 >\par ??\tab </\cf3 HostApplication\cf1 >\par ??\tab <\cf3 Addin\cf1 >\par ??\tab \tab <\cf3 FriendlyName\cf1 >\cf0 Some2005Addin\cf1 </\cf3 FriendlyName\cf1 >\par ??\tab \tab <\cf3 Description\cf1 >\cf0 The Add-in to end all Add-ins.\cf1 </\cf3 Description\cf1 >\par ??\tab \tab <\cf3 Assembly\cf1 >\cf0 Some2005Addin.dll\cf1 </\cf3 Assembly\cf1 >\par ??\tab \tab <\cf3 FullClassName\cf1 >\cf0 Addin.SomeAddin.For2005\cf1 </\cf3 FullClassName\cf1 >\par ??\tab \tab <\cf3 LoadBehavior\cf1 >\cf0 1\cf1 </\cf3 LoadBehavior\cf1 >\par ??\tab \tab <\cf3 CommandPreload\cf1 >\cf0 0\cf1 </\cf3 CommandPreload\cf1 >\par ??\tab \tab <\cf3 CommandLineSafe\cf1 >\cf0 0\cf1 </\cf3 CommandLineSafe\cf1 >\par ??\tab </\cf3 Addin\cf1 >\par ??</\cf3 Extensibility\cf1 >}
--></p>
				<div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New">
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue"><?</span>
										<span style="COLOR: #a31515">xml</span>
										<span style="COLOR: blue">
										</span>
										<span style="COLOR: red">version</span>
										<span style="COLOR: blue">=</span>"<span style="COLOR: blue">1.0</span>"<span style="COLOR: blue"></span><span style="COLOR: red">encoding</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">UTF-16</span>"<span style="COLOR: blue"></span><span style="COLOR: red">standalone</span><span style="COLOR: blue">=</span>"<span style="COLOR: blue">no</span>"<span style="COLOR: blue">?></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue"><</span>
										<span style="COLOR: #a31515">Extensibility</span>
										<span style="COLOR: blue">
										</span>
										<span style="COLOR: red">xmlns</span>
										<span style="COLOR: blue">=</span>"<span style="COLOR: blue">http://schemas.microsoft.com/AutomationExtensibility</span>"<span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">  <</span>
										<span style="COLOR: #a31515">HostApplication</span>
										<span style="COLOR: blue">></span>
								</span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">Name</span>
										<span style="COLOR: blue">></span>Microsoft Visual Studio Macros<span style="COLOR: blue"></</span><span style="COLOR: #a31515">Name</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<strong>
												<span style="COLOR: blue">    <</span>
												<span style="COLOR: #a31515">Version</span>
												<span style="COLOR: blue">></span>8.0<span style="COLOR: blue"></</span><span style="COLOR: #a31515">Version</span><span style="COLOR: blue">></span></strong>
								</span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">  </</span>
										<span style="COLOR: #a31515">HostApplication</span>
										<span style="COLOR: blue">></span>
								</span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">  <</span>
										<span style="COLOR: #a31515">HostApplication</span>
										<span style="COLOR: blue">></span>
								</span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">Name</span>
										<span style="COLOR: blue">></span>Microsoft Visual Studio<span style="COLOR: blue"></</span><span style="COLOR: #a31515">Name</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<strong>
												<span style="COLOR: blue">    <</span>
												<span style="COLOR: #a31515">Version</span>
												<span style="COLOR: blue">></span>8.0<span style="COLOR: blue"></</span><span style="COLOR: #a31515">Version</span><span style="COLOR: blue">></span></strong>
								</span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">  </</span>
										<span style="COLOR: #a31515">HostApplication</span>
										<span style="COLOR: blue">></span>
								</span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">  <</span>
										<span style="COLOR: #a31515">Addin</span>
										<span style="COLOR: blue">></span>
								</span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">FriendlyName</span>
										<span style="COLOR: blue">></span>Some2005Addin<span style="COLOR: blue"></</span><span style="COLOR: #a31515">FriendlyName</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">Description</span>
										<span style="COLOR: blue">></span>The Add-in to end all Add-ins.<span style="COLOR: blue"></</span><span style="COLOR: #a31515">Description</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">Assembly</span>
										<span style="COLOR: blue">></span>Some2005Addin.dll<span style="COLOR: blue"></</span><span style="COLOR: #a31515">Assembly</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">FullClassName</span>
										<span style="COLOR: blue">></span>Addin.SomeAddin.For2005<span style="COLOR: blue"></</span><span style="COLOR: #a31515">FullClassName</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">LoadBehavior</span>
										<span style="COLOR: blue">></span>1<span style="COLOR: blue"></</span><span style="COLOR: #a31515">LoadBehavior</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">CommandPreload</span>
										<span style="COLOR: blue">></span>0<span style="COLOR: blue"></</span><span style="COLOR: #a31515">CommandPreload</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">    <</span>
										<span style="COLOR: #a31515">CommandLineSafe</span>
										<span style="COLOR: blue">></span>0<span style="COLOR: blue"></</span><span style="COLOR: #a31515">CommandLineSafe</span><span style="COLOR: blue">></span></span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue">  </</span>
										<span style="COLOR: #a31515">Addin</span>
										<span style="COLOR: blue">></span>
								</span>
						</p>
						<p style="MARGIN: 0px">
								<span style="FONT-FAMILY: Courier New">
										<span style="COLOR: blue"></</span>
										<span style="COLOR: #a31515">Extensibility</span>
										<span style="COLOR: blue">></span>
								</span>
						</p>
				</div>
				<!--EndFragment-->
				<p>Once this value has been changed to 9.0, save the file, and open the Add-in Manager dialog in Visual Studio 2008 (TOOLS MENU-->ADD-IN MANAGER...)</p>
				<p>You will now see the Add-in appear in the dialog. Select the Add-in you have just migrated and you are ready to go.</p>
				<p>
						<img src="http://petermorano.com/images/1120b.jpg" /> </p>
		</div>
]]></description> 
					<pubDate>Tue, 01 Jul 2008 23:56:30 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/11/10/using-visual-studio-2005-add-ins-in-visual-studio-2008/</guid>
				</item>
			
				<item>
					<title>Access ScriptManager in a Master Page from Content Page</title> 
					<link>http://keylimetie.com/blog/2008/6/12/access-scriptmanager-in-a-master-page-from-content-page/</link> 
					<description><![CDATA[
		<p>I recently had to access the ScriptManager in a Master Page from one of the Content Pages.<br />I first tried to perform a FindControl(), but there's a much easier way.<br />There is a static method in the ScriptManager class called "GetCurrent()" which provides access to the current instance of the ScriptManager.</p>
		<p>
				<br />//Extend script manager timeout to 10 minutes</p>
		<p>ScriptManager.GetCurrent(this).AsyncPostBackTimeout = 600;<br /></p>
]]></description> 
					<pubDate>Thu, 12 Jun 2008 17:45:40 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/6/12/access-scriptmanager-in-a-master-page-from-content-page/</guid>
				</item>
			
				<item>
					<title>How to enable HTTP Compression on Windows Server 2003</title> 
					<link>http://keylimetie.com/blog/2008/5/20/how-to-enable-http-compression-on-windows-server-2003/</link> 
					<description><![CDATA[
		<p>If your server and website are not using HTTP Compression, you're not taking advantage of one of the easiest website performance features to implement. This blog tells you how to enable HTTP Compression in less than 10 minutes and reduce traffic by as much as 85%! The instructions below are a combination of articles I've read online and in print. We have implemented this on at least a dozen servers which host hundreds of websites with only one issue (mentioned below; issue with PDFs).<br /><br /><strong>Create Compression Folder<br /></strong>- Create a folder where the compressed file will be cached. You can give it any name or leave the default: "%windir%\IIS Temporary Compressed Files".<br />- Grant write permissions to IUSR_{machinename} for the folder.<br /><br /><strong>Enable Compression in IIS<br /></strong>- In IIS, right-click on the "Web Sites" node and click "Properties".<br />- Select the "Service" tab.<br />- Check "Compress application files". (we have seen issues where PDFs are compressed and cannot be opened)<br />- Check "Compress static files".<br />- Change "Temporary directory" (if you created your own folder).<br />- Set the "Maximum temporary directory size" to something that the hard drive can handle (i.e. 1024).<br />- Save and close the "Web Site" Properties.<br /><br /><strong>Create a Web Service Extension (WSE)<br /></strong>- In IIS, select "Web Service Extensions".<br />- Add a new web service extension.<br />- Name it "HTTP Compression".<br />- Point it to "c:\windows\system32\inetsrv\gzip.dll".<br />- Check the "Set extension status to Allowed" to enable it.<br /><br /><strong>Edit IIS Metabase<br /></strong>- In IIS, right-click on the server node (top level) and click "Properties".<br />- Check "Enable Direct Metabase Edit".<br />- In Notepad, open the metabase: C:\Windows\system32\inetsrv\metabase.xml<br />- Search for "<IIsCompressionScheme"<br />- There will be two of them, one for deflate and one for gzip.<br />- In "HcScriptFileExtensions", add aspx, asmx and any other extension that you need to the list already there. Do this for both deflate and gzip and format the format.<br />- Change "HcDynamicCompressionLevel" to 9.  Do this for both deflate and gzip.<br />- Restart IIS</p>
]]></description> 
					<pubDate>Wed, 21 May 2008 01:19:41 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/5/20/how-to-enable-http-compression-on-windows-server-2003/</guid>
				</item>
			
				<item>
					<title>Disable PDB File Generation in Release Mode</title> 
					<link>http://keylimetie.com/blog/2008/4/15/disable-pdb-file-generation-in-release-mode/</link> 
					<description><![CDATA[		<p>Migrating code to a Production environment is not a difficult task, but I have seen developers do some weird stuff. I have seen developers migrated code compiled for debug and then wonder why the site doesn't run very fast...not common, but really does happen. I have seen developers migrate the entire source code for a project to the Production environment. They call it their "back up" location. Ever hear of VSS? These are bad practices that should be avoided.<br /><br />Have you ever noticed that code you build for Release or Publish still generates a PDB file? Up until recently I really didn't think much of it, but one day I got curious. I did a little research and found a great blog on compiling options and the implications. In short, you can disable generation of the PDB file (see image below), but it's not recommended. Read this article for more details:<br /></p>
		<p>
				<a href="http://blog.vuscode.com/malovicn/archive/2007/08/05/releasing-the-build.aspx" target="_blank">http://blog.vuscode.com/malovicn/archive/2007/08/05/releasing-the-build.aspx</a>
				<br />
				<br />
				<img  alt="DisablePdbFile.jpg" src="/Common/Images/custom/Blogs/DisablePdbFile.jpg"  border="0" />
		</p>
]]></description> 
					<pubDate>Wed, 16 Apr 2008 01:52:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/4/15/disable-pdb-file-generation-in-release-mode/</guid>
				</item>
			
				<item>
					<title>How to check for hexidecimal characters</title> 
					<link>http://keylimetie.com/blog/2008/3/28/how-to-check-for-hexidecimal-characters/</link> 
					<description><![CDATA[If you haven't come across it yet, hexidecimal characters are not allowed in XML documents and cause problems when trying to display or work with them. When working with 3rd party data in XML (not received via a web service), it's always a good idea to validate the data. If you see an error like "hexidecimal value 0x04, is an invalid character, Line 1 Position 20154755", your problem is the data in the XML document. We recently came across this issue and created a simple method to check for valid characters:<br />
<br />
<strong>Be sure to check out related blog: <a href="/Blog/2008/9/2/How-to-validate-strings-for-XML/"><u>How to validate strings for XML</u></a></strong>
<br />
<br />
<pre style="color: #000000"><span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>1</span><span style="color: #0000FF">private</span> <span style="color: #0000FF">bool</span> IsValidString(<span style="color: #0000FF">string</span> input)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>2</span>{
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>3</span>    <span style="color: #0000FF">try</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>4</span>    {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>5</span>        <span style="color: #0000FF">char</span>[] values = input.ToCharArray();
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>6</span>        <span style="color: #0000FF">foreach</span> (<span style="color: #0000FF">char</span> c <span style="color: #0000FF">in</span> values)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>7</span>        {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>8</span>            <span style="color: #008200">//Get the integral value of the character</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>9</span>            <span style="color: #0000FF">int</span> value = Convert.ToInt32(c);
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>10</span>            <span style="color: #008200">//Valid character (space -> tilde) see: http://www.asciitable.com</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>11</span>            <span style="color: #0000FF">if</span> (value < 32 || value > 126)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>12</span>                <span style="color: #0000FF">return</span> <span style="color: #0000FF">false</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>13</span>        }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>14</span>    }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>15</span>    <span style="color: #0000FF">catch</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>16</span>    {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>17</span>        <span style="color: #0000FF">return</span> <span style="color: #0000FF">false</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>18</span>    }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>19</span>    <span style="color: #0000FF">return</span> <span style="color: #0000FF">true</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>20</span>}</pre>
]]></description> 
					<pubDate>Sat, 29 Mar 2008 01:45:19 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/3/28/how-to-check-for-hexidecimal-characters/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Log Cleaner (file pruning application) - FREE!</title> 
					<link>http://keylimetie.com/blog/2008/3/16/keylimetie-log-cleaner-free/</link> 
					<description><![CDATA[<p>
    With all of the applications running on a server, it is important to keep their
    output pruned. Even with a basic server running a few websites, you can expect to
    have:<br />
    - IIS logs<br />
    - SQL Server database backups<br />
    - Application-specific logging<br />
    <br />
    Over time, these files can consume a lot of disk space and potentially disable a
    server. Over the past 5 years, I have worked on-site with nine clients. Of these
    nine clients, seven of them have encountered this problem. In fact, my most recent
    client had this problem last week! It happens so often that when someone said the
    server was was running slow and throwing errors to the web browser, the first thing
    I said was "I bet the hard drive is full"...and it was.<br />
    <br />
    Why does it happen so often? There are many reasons, but the main reason is because
    nobody is monitoring the disk space (or monitoring tools are not installed) and
    the files aren't being properly pruned or archived. To resolve this issue, I created
    the KeyLimeTie Log Cleaner application free for anyone to download and use. I purposely
    made it very simple to configure and install; there are plenty of features and options
    we could add.<br />
    <br />
    <strong>To get it running:</strong><br />
    1. <a href="/Common/Downloads/KeyLimeTie.LogCleaner.zip" 
onclick="urchinTracker('/Common/Downloads/KeyLimeTie.LogCleaner.zip');">Download Application</a><br />
    2. Unzip the files to a folder on your hard drive.<br />
    3. Open the "profiles.xml" file and edit it for your needs.<br />
    <br />
    <pre><span style='color: #0000FF'><?</span><span style='color: #800000'>xml</span><span
        style='color: #FF0000'> version<span style='color: #0000FF'>="1.0"</span> standalone<span
            style='color: #0000FF'>="yes"</span></span><span style='color: #0000FF'>?></span>
<span style='color: #0000FF'><</span><span style='color: #800000'>Profiles</span><span
    style='color: #0000FF'>></span>
	<span style='color: #0000FF'><</span><span style='color: #800000'>Profile</span><span
        style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>!--</span><span
            style='color: #FF0000'> Keep this application's logs pruned to 15 days --</span><span
                style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Description</span><span
            style='color: #0000FF'>></span>KeyLimeTie Log Cleaner<span style='color: #0000FF'></</span><span
                style='color: #800000'>Description</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>FolderPath</span><span
            style='color: #0000FF'>></span>D:\Projects\KeyLimeTie\KeyLimeTie.LogCleaner\Logs\<span
                style='color: #0000FF'></</span><span style='color: #800000'>FolderPath</span><span
                    style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Extension</span><span
            style='color: #0000FF'>></span>txt<span style='color: #0000FF'></</span><span
                style='color: #800000'>Extension</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>DelOlderThanDays</span><span
            style='color: #0000FF'>></span>15<span style='color: #0000FF'></</span><span
                style='color: #800000'>DelOlderThanDays</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Recursive</span><span
            style='color: #0000FF'>></span>false<span style='color: #0000FF'></</span><span
                style='color: #800000'>Recursive</span><span style='color: #0000FF'>></span>
	<span style='color: #0000FF'></</span><span style='color: #800000'>Profile</span><span
        style='color: #0000FF'>></span>
	<span style='color: #0000FF'><</span><span style='color: #800000'>Profile</span><span
        style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>!--</span><span
            style='color: #FF0000'> Example: Keep IIS Logs pruned to 15 days --</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>!--</span><span
            style='color: #FF0000'> Setting Recursive true prunes all ftp and website logs --</span><span
                style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>!--</span><span
            style='color: #FF0000'> As new websites are added, no need to update profiles --</span><span
                style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Description</span><span
            style='color: #0000FF'>></span>All IIS Logs<span style='color: #0000FF'></</span><span
                style='color: #800000'>Description</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>FolderPath</span><span
            style='color: #0000FF'>></span>C:\Windows\system32\LogFiles\<span style='color: #0000FF'></</span><span
                style='color: #800000'>FolderPath</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Extension</span><span
            style='color: #0000FF'>></span>log<span style='color: #0000FF'></</span><span
                style='color: #800000'>Extension</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>DelOlderThanDays</span><span
            style='color: #0000FF'>></span>15<span style='color: #0000FF'></</span><span
                style='color: #800000'>DelOlderThanDays</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Recursive</span><span
            style='color: #0000FF'>></span>true<span style='color: #0000FF'></</span><span
                style='color: #800000'>Recursive</span><span style='color: #0000FF'>></span>
	<span style='color: #0000FF'></</span><span style='color: #800000'>Profile</span><span
        style='color: #0000FF'>></span>
	<span style='color: #0000FF'><</span><span style='color: #800000'>Profile</span><span
        style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>!--</span><span
            style='color: #FF0000'> Example: Keep SQL Server backups pruned to 1 week --</span><span
                style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>!--</span><span
            style='color: #FF0000'> Setting Recursive true prunes all database backups --</span><span
                style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>!--</span><span
            style='color: #FF0000'> As new databases are added, no need to update profiles --</span><span
                style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Description</span><span
            style='color: #0000FF'>></span>All Database Backups<span style='color: #0000FF'></</span><span
                style='color: #800000'>Description</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>FolderPath</span><span
            style='color: #0000FF'>></span>D:\Databases\Backups\<span style='color: #0000FF'></</span><span
                style='color: #800000'>FolderPath</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Extension</span><span
            style='color: #0000FF'>></span>bak<span style='color: #0000FF'></</span><span
                style='color: #800000'>Extension</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>DelOlderThanDays</span><span
            style='color: #0000FF'>></span>7<span style='color: #0000FF'></</span><span
                style='color: #800000'>DelOlderThanDays</span><span style='color: #0000FF'>></span>
		<span style='color: #0000FF'><</span><span style='color: #800000'>Recursive</span><span
            style='color: #0000FF'>></span>true<span style='color: #0000FF'></</span><span
                style='color: #800000'>Recursive</span><span style='color: #0000FF'>></span>
	<span style='color: #0000FF'></</span><span style='color: #800000'>Profile</span><span
        style='color: #0000FF'>></span>
<span style='color: #0000FF'></</span><span style='color: #800000'>Profiles</span><span
    style='color: #0000FF'>></span></pre>
</p>
<p>
    <strong>Fields:</strong>
    <br />
    - Description: Profile description<br />
    - Folder Path: Location of files to be deleted<br />
    - Extension: Extension of files to be deleted<br />
    - DelOlderThanDays: Number of days to delete files older than today<br />
    - Recursive: Tells application to look for files in subdirectories<br />
    <br />
    <strong>Schedule Application:</strong><br />
    I installed the software on a few servers and simply created a Scheduled Task through
    Windows. I have it set to run every day at 4am (after the SQL Server backups are
    run).<br />
    <br />
    <strong>Some ideas...</strong><br />
    - Change "Extension" option to be "MatchPattern". Right now, the code searches for
    all files by the extension. You can put "*" in there and it'll prune all files,
    but it could be made to be more powerful.<br />
    - Create as Windows Service. I have created similar applications as Windows Services...and
    it's very easy to change this to a Windows Service. But I wanted this first version
    to be very simple and simple to install. I have seen people have issues with installing
    Windows Services.<br />
    - Create an interface to manage the profiles. It's so easy to update this really
    isn't necessary.<br />
</p>
]]></description> 
					<pubDate>Sun, 16 Mar 2008 18:54:19 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/3/16/keylimetie-log-cleaner-free/</guid>
				</item>
			
				<item>
					<title>Internet Explorer 8 Has Arrived!</title> 
					<link>http://keylimetie.com/blog/2008/3/6/internet-explorer-8-has-arrived/</link> 
					<description><![CDATA[
		<p>From "ReadWriteWeb"...<br /><br />Microsoft's next-generation web browser, Internet Explorer 8, has arrived. In a surprising move, after the demo of IE8 and its new features at today's session of the MIX08 conference, the startling announcement was made: "It's available for download now". The new browser showcases many new features and improvements, like Facebook and eBay integration, standards compliance, and the ability to work with AJAX web pages. What's most notable about IE8, though, is more than a sum of its parts. If anything, this launch shows that Microsoft is not taking Firefox's creep into browser market share lightly.<br /><br /><strong>IE8 New Features Shown At MIX08<br /></strong><em>Standards Compliance<br /></em>There were hints that IE8 would be a remarkable offering on the IE Blog as they released tidbits about the browser's capabilities. For example, the announcement of IE8's passing of the Acid2 test (a test for standards compliance) marked a milestone in IE8's development. The standards mode was originally going to be turned off by default letting web developers code for it by including a "meta" tag to make use of IE8's new standards compliant mode. Later, Microsoft came to their senses and made the default the standards-compliant mode. Meanwhile, Firefox also claims to have passed the Acid 2 test, but an open bug on bugzilla.mozilla.org seems to say otherwise. One commenter on the thread notes, "So, we essentially do pass the test. However, in some situations, it might still fail, that's why this bug is open."<br /><br /><em>Facebook Integration<br /></em>With a Flock-like feature as an unexpected surprise, Microsoft capitalized on their partnership with the popular social networking site, Facebook, to allow IE8 users the ability to get status updates from Facebook right from their browser toolbar.<br /><br /><em>eBay Integration</em><br />Like Facebook, this feature also uses IE8's new technology, called "WebSlices", which introduces a new way to get updates from other sites via the browser itself, without having to visit the web site. With WebSlices, IE8 beta users can subscribe to portions of a page that update dynamically, in order to receive updates from that page as content<br />changes. eBay will offer webslices, too, letting you track your auctions from the browser toolbar. Basically, WebSlices look like Favorites on your Links toolbar but they have a little arrow next to them - clicking on this arrow will show you a small window of live web content. <br /><br /><em>Live Maps Integration<br /></em>Another WebSlice was integration with Live Maps. It appeared that you could even highlight text on a page, like an address, and then right-click and choose Live Maps from the context menu to get a WebSlice preview of that location on a map in a small pop-up window.<br /><br /><em>Integration with Me.dium<br /></em>Me.dium integration will be supported in IE8 via WebSlices. Me.dium will now help web surfers discover and view WebSlices directly from the sidebar. The Me.dium sidebar will alert users to the presence of WebSlices on any page – and even allows users to read each WebSlice, without leaving the Sidebar. In addition, Me.dium will make real-time recommendations for other WebSlices on other relevant web pages and provides direct links to them based on the real time activity of other Me.dium users.<br /><br /><em>Working with AJAX Pages<br /></em>IE8 will offer better functionality when it comes to AJAX web pages. The example showed a page where you could zoom in using AJAX technology. Previously, hit the IE "Back" button would take you back to the last page you were on. Now, "Back" will zoom you out.<br /><br />We can now find out what other features IE8 has to offer, since the beta is now publicly available for download. To get IE8, you can download it from here:<br /><a href="http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/Install.htm">http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/Install.htm</a>.</p>
		<p> </p>
]]></description> 
					<pubDate>Fri, 07 Mar 2008 01:23:50 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/3/6/internet-explorer-8-has-arrived/</guid>
				</item>
			
				<item>
					<title>Safely restart an ASP.NET remotely</title> 
					<link>http://keylimetie.com/blog/2008/2/12/safely-restart-an-aspnet-remotely/</link> 
					<description><![CDATA[<p>
Every once in awhile, an ASP.NET website may need to be restarted. There are a few ways to do this: kill the worker process (too forceful), restart IIS (restarts all websites) or modify the web.config (best choice). Instead of FTP'ing the web.config down and back up or logging onto the server to update the web.config, why not create a web page that allows you to easily update the "last write date" on the file. The .NET Framework monitors website files and when the web.config write date changes, it automatically restarts that website. Here's code you can drop into an ASP.NET web page to accomplish this:
<br /><br />
</p>

<script type='text/javascript'>
	function ToggleSourceCodeRegion(regionNumber)
	{
		var divRegion = document.getElementById('region' + regionNumber);
		var divRegionBlock = document.getElementById('regionBlock' + regionNumber);

		if (divRegion.style.display == 'inline')
		{
			divRegion.style.display = 'none';
			divRegionBlock.style.display = 'inline';
		}
		else
		{
			divRegion.style.display = 'inline';
			divRegionBlock.style.display = 'none';
		}
	}
</script><pre style="color: #000000"><span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>1</span><%@ Page Language=<span style="color: #848284">"C#"</span> %>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>2</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>3</span><!DOCTYPE html PUBLIC <span style="color: #848284">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span> <span style="color: #848284">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span>>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>4</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>5</span><script runat=<span style="color: #848284">"server"</span>>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>6</span>    <span style="color: #0000FF">protected</span> <span style="color: #0000FF">void</span> Page_Load(<span style="color: #0000FF">object</span> sender, EventArgs e)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>7</span>    {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>8</span>        lblMessage.Text = <span style="color: #848284">""</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>9</span>    }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>10</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>11</span>    <span style="color: #0000FF">protected</span> <span style="color: #0000FF">void</span> btnRestart_Click(<span style="color: #0000FF">object</span> sender, EventArgs e)
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>12</span>    {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>13</span>        <span style="color: #0000FF">if</span> (txtPassword.Text.Trim().ToUpper() ==
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>14</span>            System.Configuration.ConfigurationManager.AppSettings[<span style="color: #848284">"ResetSitePassword"</span>].ToString().Trim().ToUpper())
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>15</span>        {
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>16</span>            <span style="color: #0000FF">string</span> webConfigPath = Server.MapPath(<span style="color: #848284">"Web.config"</span>);
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>17</span>            System.IO.File.SetLastWriteTime(webConfigPath, DateTime.Now);
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>18</span>            Session.Abandon();
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>19</span>            Response.Redirect(<span style="color: #848284">"/"</span>);
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>20</span>        }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>21</span>        <span style="color: #0000FF">else</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>22</span>            lblMessage.Text = <span style="color: #848284">"Invalid password"</span>;
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>23</span>    }
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>24</span></script>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>25</span>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>26</span><html xmlns=<span style="color: #848284">"http://www.w3.org/1999/xhtml"</span>>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>27</span><head runat=<span style="color: #848284">"server"</span>>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>28</span>    <title>Restart Website</title>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>29</span></head>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>30</span><body>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>31</span>    <form id=<span style="color: #848284">"aspnetForm"</span> runat=<span style="color: #848284">"server"</span>>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>32</span>        Password:
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>33</span>        <asp:TextBox ID=<span style="color: #848284">"txtPassword"</span> runat=<span style="color: #848284">"server"</span> TextMode=<span style="color: #848284">"Password"</span>></asp:TextBox>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>34</span>        <asp:Button ID=<span style="color: #848284">"btnRestart"</span> runat=<span style="color: #848284">"server"</span> Text=<span style="color: #848284">"Restart"</span> OnClick=<span style="color: #848284">"btnRestart_Click"</span>>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>35</span>        </asp:Button>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>36</span>        <asp:Label ID=<span style="color: #848284">"lblMessage"</span> runat=<span style="color: #848284">"server"</span> ForeColor=<span style="color: #848284">"Red"</span>></asp:Label>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>37</span>    </form>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>38</span></body>
<span style='color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999'>39</span></html></pre>]]></description> 
					<pubDate>Tue, 12 Feb 2008 21:15:04 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/2/12/safely-restart-an-aspnet-remotely/</guid>
				</item>
			
				<item>
					<title>Don&amp;quot;t Search For Domain Names on Network Solutions!</title> 
					<link>http://keylimetie.com/blog/2008/2/9/dont-search-for-domain-names-on-network-solutions/</link> 
					<description><![CDATA[		<strong>If you check for a domain name on Network Solutions, you will have to buy it there or risk losing it forever!<br /></strong>
		<br />When you check for a domain name on Network Solutions, they immediately lock that domain for 4 days. If you want the domain, you must buy it through them for $35. If you don't and the 4 days pass, it becomes public to domain name snipers and may be unavailable forever! Don;t believe me, try it your self:<br /><br /><br /><strong>1. Go to Network Solutions (</strong><a href="http://www.netsol.com"><strong>http://www.netsol.com</strong></a><strong>) and search for a domain name. I tried keylimetierocks.com</strong><br /><br /><img  alt="NetSol1.jpg" src="/Common/Images/custom/Blogs/NetSol1.jpg"  border="0" /><br /><br /><br /><strong>2. It's available, but I don't buy it.<br /></strong><br /><img  alt="NetSol2.jpg" src="/Common/Images/custom/Blogs/NetSol2.jpg"  border="0" /><br /><br /><br /><strong>3. Immediately go to GoDaddy (</strong><a href="http://www.godaddy.com"><strong>http://www.godaddy.com</strong></a><strong>) and search for the same domain name.</strong><br /><br /><img  alt="GoDaddy1.jpg" src="/Common/Images/custom/Blogs/GoDaddy1.jpg"  border="0" /><br /><br /><br /><strong>4. It's not available!</strong><br /><br /><img  alt="GoDaddy2.jpg" src="/Common/Images/custom/Blogs/GoDaddy2.jpg"  border="0" />]]></description> 
					<pubDate>Sun, 10 Feb 2008 05:06:51 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/2/9/dont-search-for-domain-names-on-network-solutions/</guid>
				</item>
			
				<item>
					<title>How to use Visual Studio 2003 in Windows Vista</title> 
					<link>http://keylimetie.com/blog/2008/1/17/using-vs7-in-vista/</link> 
					<description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri" color="#000000" size="3">This blog entry is intended to illustrate the steps necessary to set up a Windows Vista machine to use Visual Studio 2003 (.NET 1.1).<span style="mso-spacerun: yes">  </span>Most of the information was obtained from the following blogs: </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<a href="http://citruslime.blogspot.com/2007/04/visual-studio-2003-web-debugging-on.html">
						<font face="Calibri" color="#800080" size="3">http://citruslime.blogspot.com/2007/04/visual-studio-2003-web-debugging-on.html</font>
				</a>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<a href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/how-to-setup-asp-net-v1-1-visual-studio-net-2003-projects-on-iis7-vista.aspx">
						<font face="Calibri" color="#800080" size="3">http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/how-to-setup-asp-net-v1-1-visual-studio-net-2003-projects-on-iis7-vista.aspx</font>
				</a>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>
				<o:p>
						<font face="Calibri" color="#000000" size="3"> </font>
				</o:p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<b style="mso-bidi-font-weight: normal">
						<u>
								<font size="3">
										<font color="#000000">
												<font face="Calibri">Steps<o:p></o:p></font>
										</font>
								</font>
						</u>
				</b>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">1.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span style="COLOR: black">
								<font face="Calibri" size="3">Setup your user account as a local admin on the Vista machine and switch off the "user account control”.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">a.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span style="COLOR: black">
								<font face="Calibri" size="3">Open Control Panel -> User Accounts.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">b.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span style="COLOR: black">
								<font face="Calibri" size="3">Select “Change your account type”.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">c.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<font face="Calibri" size="3">Select “Administrator” (if not already Administrator).<br /><br /><img height="257" alt="1c.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/1c.jpg" width="341" border="0" /><br /><br /></font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
						<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /??>
						<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect">
								</v:path>
								<o:lock v:ext="edit" aspectratio="t">
								</o:lock>
						</v:shapetype>
				</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">d.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<font face="Calibri" size="3">Press “Change Account Type”.</font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">e.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<font face="Calibri" size="3">Select “Turn User Account Control on or off”.</font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">f.</font>
										<span style="FONT: 7pt 'Times New Roman'">        </span>
								</span>
						</span>
						<font face="Calibri" size="3">Uncheck “Use User Account Control (UAC) to help protect your computer”.<br /><br /><img height="248" alt="1f.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/1f.jpg" width="329" border="0" /><br /><br /></font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
				</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">g.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<font face="Calibri" size="3">Press “OK”.<br /><br /></font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">2.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span style="COLOR: black">
								<font face="Calibri" size="3">Ensure your user account is included in the Debugger User group.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
						<span style="mso-list: Ignore">
								<font color="#000000">
										<font face="Calibri" size="3">a.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</font>
						</span>
				</span>
				<span style="COLOR: black">
						<font size="3">
								<font face="Calibri">Note: It appears this is not possible in certain versions of Vista, such as Home Premium.<span style="mso-spacerun: yes">  </span>Click the following link for more information: <span style="mso-spacerun: yes"> </span></font>
						</font>
						<a href="http://windowshelp.microsoft.com/Windows/en-US/Help/0faddcfc-e2a9-4297-a429-3f7e83fe6e361033.mspx">
								<font face="Calibri" color="#800080" size="3">http://windowshelp.microsoft.com/Windows/en-US/Help/0faddcfc-e2a9-4297-a429-3f7e83fe6e361033.mspx</font>
						</a>
						<font face="Calibri" size="3">.<br /><br /></font>
				</span>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">3.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN">
								<font face="Calibri" size="3">Ensure that .NET 1.1 <b style="mso-bidi-font-weight: normal">**SP1**</b> is properly installed.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<font color="#000000">
						<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
								<span style="mso-list: Ignore">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">         </span>
								</span>
						</span>
						<span lang="EN" style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN">
								<font face="Calibri" size="3">Vista does not include .NET v1.1 by default.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<font color="#000000">
						<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
								<span style="mso-list: Ignore">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">         </span>
								</span>
						</span>
						<span lang="EN" style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN">
								<font face="Calibri" size="3">Because .NET 1.1 is not included by default, .NET v1.1 *SP1* is also not included.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<font color="#000000">
						<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
								<span style="mso-list: Ignore">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">         </span>
								</span>
						</span>
						<span lang="EN" style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN">
								<font face="Calibri" size="3">Without SP1, W3WP.exe will crash when running an appPool under v1.1 due to DEP</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<font color="#000000">
						<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
								<span style="mso-list: Ignore">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">         </span>
								</span>
						</span>
						<span lang="EN" style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN">
								<font face="Calibri" size="3">To check this, make sure that "c:\Windows\Microsoft.NET\Framework\v1.1.4322\mscorsvr.dll" is version "1.1.4322.2032" or higher.<br /><br /><img height="321" alt="3.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/3.jpg" width="426" border="0" /><br /><br /></font>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
				</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<font color="#000000">
						<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
								<span style="mso-list: Ignore">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">         </span>
								</span>
						</span>
						<span lang="EN" style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN">
								<font face="Calibri" size="3">Unless you are 100% sure that SP1 for .NET is installed, you *really* should double-check this.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
						<span style="mso-list: Ignore">
								<font color="#000000">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">         </span>
								</font>
						</span>
				</span>
				<span lang="EN" style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN">
						<font face="Calibri" color="#000000" size="3">If you need to install .NET 1.1 SP1, you can download the upgrade here: </font>
						<a href="http://www.microsoft.com/downloads/details.aspx?familyid=A8F5654F-088E-40B2-BBDB-A83353618B38&displaylang=en.">
								<font face="Calibri" color="#0000ff" size="3">http://www.microsoft.com/downloads/details.aspx?familyid=A8F5654F-088E-40B2-BBDB-A83353618B38&displaylang=en.<br /><br /></font>
						</a>
				</span>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">4.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<font face="Calibri" size="3">Enable IIS 6.0 compatiblity.</font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">a.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Open "Control Panel".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">b.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Double-click "Programs and Features".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">c.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Expand "Internet Information Services".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">d.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Click on “Turn Windows Features On and Off”.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">e.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Expand "Web Management Tools".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">f.</font>
										<span style="FONT: 7pt 'Times New Roman'">        </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Check “IIS 6 Management Compatibility”.<br /><br /><img height="270" alt="4f.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/4f.jpg" width="308" border="0" /><br /><br /></font>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
				</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">5.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Enable ASP.NET Application Development Features, if not already done so.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">a.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Open "Control Panel".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">b.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Double-click "Programs and Features".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">c.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Expand "Internet Information Services".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">d.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Click on “Turn Windows Features On and Off”.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">e.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<font face="Calibri" size="3">Expand “World Wide Web Services”.</font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">f.</font>
										<span style="FONT: 7pt 'Times New Roman'">        </span>
								</span>
						</span>
						<font face="Calibri" size="3">Expand “Application Development Features”.</font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">g.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<font face="Calibri" size="3">Check “ASP.NET”.<br /><br /><img height="261" alt="5g.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/5g.jpg" width="298" border="0" /><br /></font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1.5in; TEXT-INDENT: -1.5in; mso-list: l1 level3 lfo1; mso-add-space: auto; mso-text-indent-alt: -9.0pt">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<span style="FONT: 7pt 'Times New Roman'">                                                 </span>
										<font face="Calibri" size="3">Note: </font>
										<span style="FONT: 7pt 'Times New Roman'"> </span>
								</span>
						</span>
						<font face="Calibri" size="3">“.NET Extensibility”, “ISAPI Extensions”, and “ISAPI Filters” are dependencies, so they become automatically checked.</font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">6.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Register v1.1 with IIS.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">a.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Open a CMD prompt.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">b.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Change your directory to c:\Windows\MIcrosoft.net\Framework\v1.1.4322.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">c.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Run "aspnet_regiis -ir -enable".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1.5in; TEXT-INDENT: -9pt; mso-list: l2 level3 lfo3; mso-add-space: auto">
				<font color="#000000">
						<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
								<span style="mso-list: Ignore">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">"ir" registers v1.1 with IIS but doesn't change any existing script mappings.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1.5in; TEXT-INDENT: -9pt; mso-list: l2 level3 lfo3; mso-add-space: auto">
				<font color="#000000">
						<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
								<span style="mso-list: Ignore">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">"enable" marks aspnet_isapi.dll as "Allowed" under "ISAPI and CGI Restrictions".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1.5in; TEXT-INDENT: -9pt; mso-list: l2 level3 lfo3; mso-add-space: auto">
				<font color="#000000">
						<span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol">
								<span style="mso-list: Ignore">
										<font size="3">·</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">aspnet_regiis should also create a new AppPool under "Application Pools" called "ASP.NET 1.1" that is configured with the "Classic" pipline, and "Enable32BitAppOnWin64" set to true if a 64-bit OS.<br /><br /><img height="210" alt="6c.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/6c.jpg" width="414" border="0" /><br /><br /></font>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
				</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">7.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Make the new "ASP.NET 1.1" appPool the default.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">a.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Open the IIS manager.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">b.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Select the "Web Sites" folder.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">c.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Under "Actions" on the upper right, click "Set Web Site Defaults...".<br /><br /><img height="371" alt="7c.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/7c.jpg" width="304" border="0" /><br /><br /></font>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
				</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">d.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Change the "Application Pool" setting to "ASP.NET 1.1".<br /><br /><img height="209" alt="7d.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/7d.jpg" width="303" border="0" /><br /><br /></font>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
				</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">8.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">**Alternative step to 7** - Change the AppPool to "ASP.NET 1.1" after creating the ASP.NET project instead of making it the default</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">a.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Create the v1.1 ASP.NET project via Visual Studio. Attempting to run the project at this point will fail if the 1.1 appPool is not the default.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">b.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Open the IIS manager.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">c.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Right-click the newly create application directory and choose "Advanced Settings".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">d.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Change the "Application Pool" to "ASP.NET 1.1".</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">e.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Go back to Visual Studio and attempt to run/debug project.</font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
						<span style="mso-list: Ignore">
								<font color="#000000">
										<font face="Calibri" size="3">9.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</font>
						</span>
				</span>
				<span style="COLOR: black">
						<font face="Calibri" size="3">Adjust <span class="blsp-spelling-error"><span id="SPELLING_ERROR_7">ISAPI</span></span> and <span class="blsp-spelling-error"><span id="SPELLING_ERROR_8">CGI</span></span> restrictions in IIS.</font>
				</span>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">a.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</span>
						</span>
						<span class="blsp-spelling-error">
								<span style="COLOR: black">
										<font face="Calibri" size="3">Go into IIS</font>
								</span>
						</span>
				</font>
				<span style="COLOR: black">
						<font face="Calibri" size="3">7.0 manager and select your server.</font>
				</span>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
						<span style="mso-list: Ignore">
								<font color="#000000">
										<font face="Calibri" size="3">b.</font>
										<span style="FONT: 7pt 'Times New Roman'">      </span>
								</font>
						</span>
				</span>
				<span style="COLOR: black">
						<font face="Calibri" size="3">Select <span class="blsp-spelling-error"><span id="SPELLING_ERROR_13">ISAPI</span></span> and <span class="blsp-spelling-error"><span id="SPELLING_ERROR_14">CGI</span></span> restrictions.<br /><br /><img height="253" alt="9b.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/9b.jpg" width="428" border="0" /><br /><br /></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
				</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
						<span style="mso-list: Ignore">
								<font color="#000000">
										<font face="Calibri" size="3">c.</font>
										<span style="FONT: 7pt 'Times New Roman'">       </span>
								</font>
						</span>
				</span>
				<span style="COLOR: black">
						<font face="Calibri" size="3">Ensure ASP v1.1 has the <span class="blsp-spelling-corrected"><span id="SPELLING_ERROR_15">restriction</span></span> set to Allowed.<br /><br /><img height="248" alt="9c.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/9c.jpg" width="428" border="0" /><br /><br /></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span style="mso-no-proof: yes">
				</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">10.</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Launch Visual Studio 2003 as Administrator.<br /><br /></font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">11.</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<span lang="EN" style="mso-ansi-language: EN">
								<font face="Calibri" size="3">Create a simple web application with some event handling to test debugging (a button that displays text in a label control is what I used to test).<br /><br /></font>
						</span>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">12.</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<font face="Calibri" size="3">Attach to the w3wp.exe process.<br /><br /><img height="360" alt="12.jpg" src="/Common/Images/custom/Blogs/Using%20Visual%20Studio%202003%20in%20Vista%20Steps%20Images/12.jpg" width="510" border="0" /><br /></font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt"> </p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">13.</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<font face="Calibri" size="3">Set breakpoints where appropriate.</font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">14.</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<font face="Calibri" size="3">Launch the website in a browser (eg. </font>
				</font>
				<a href="http://localhost/YourWebApp/YourPage.aspx">
						<font face="Calibri" color="#0000ff" size="3">http://localhost/YourWebApp/YourPage.aspx</font>
				</a>
				<font face="Calibri" color="#000000" size="3">).</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">15.</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<font face="Calibri" size="3">Ensure your breakpoints are being hit.</font>
				</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1">
				<font color="#000000">
						<span style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin">
								<span style="mso-list: Ignore">
										<font face="Calibri" size="3">16.</font>
										<span style="FONT: 7pt 'Times New Roman'">   </span>
								</span>
						</span>
						<font face="Calibri">
								<font size="3">That’s it!<span style="mso-spacerun: yes">  </span></font>
								<font size="3">Happy coding.</font>
						</font>
				</font>
		</p>
		<p> </p>
]]></description> 
					<pubDate>Thu, 17 Jan 2008 23:14:48 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/1/17/using-vs7-in-vista/</guid>
				</item>
			
				<item>
					<title>KeyLimeTie Mass Emailer - Free!</title> 
					<link>http://keylimetie.com/blog/2008/1/2/keylimetie-mass-emailer-free/</link> 
					<description><![CDATA[Over the years, we have built a number of Mass Emailing applications for customers (some web, some windows apps).<br />I took a recent version I created and added more to it and am now making it available to anyone.<br /><br /><a href="/Common/Downloads/KeyLimeTie_MassEmailer.zip" 
onclick="urchinTracker('/Common/Downloads/KeyLimeTie_MassEmailer.zip');"><strong>Download Application</strong></a><br /><br /><strong>Features<br /></strong> - Use email list with custom fields from database or cut-and-paste in an email list.<br /> - Validate email addresses and view invalid email addresses.<br /> - Specify all fields of an email including From, Reply To, CC, BCC, Subject and Body. Attachments coming soon!<br /> - Allows for custom fields in the title and body.<br /> - Send test email to verify formatting accuracy.<br /><br /><img  alt="KLT_Mass_Emailer.jpg" src="/Common/Images/custom/Blogs/KLT_Mass_Emailer.jpg"  border="0" />]]></description> 
					<pubDate>Thu, 03 Jan 2008 02:42:02 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2008/1/2/keylimetie-mass-emailer-free/</guid>
				</item>
			
				<item>
					<title>How to Communicate between ASP.NET and Flash</title> 
					<link>http://keylimetie.com/blog/2007/12/18/how-to-communicate-between-aspnet-and-flash/</link> 
					<description><![CDATA[Ever wonder how to send data back and forth between ASP.NET and Flash?<br /><br />About a year ago, we designed and built the DIY Floor Plan website (<a href="http://www.diyfloorplan.com" target="_blank">http://www.diyfloorplan.com</a>). We needed the ability to send data between the Flash Floor Plan Designer and the ASP.NET web pages that saved the data to the database. We wanted the floor plan designer to be as "dumb" as possible...simply design the floor plan and allow the ASP.NET application manage the data. Here's some quick code snippets that will show you how to do it very easily.<br /><br /><strong>ViewFloorPlan.aspx</strong><br />This page displays the public, non-editable version of the floor plan. The important thing here is that we put the Floor Plan GUID in a Flash Parameter. We use a GUID to prevent users from seeing floor plans that are not publicly available by the floor plan administrator. The Flash application uses the GUID as the key to communicate with the ASP.NET application.<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><script type=<span style="COLOR: #848284">"text/javascript"</span>>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>    var so = <span style="COLOR: #0000ff">new</span> SWFObject(<span style="COLOR: #848284">"/flash/map_client.swf"</span>, <span style="COLOR: #848284">"map_client"</span>, <span style="COLOR: #848284">"775"</span>, <span style="COLOR: #848284">"650"</span>, <span style="COLOR: #848284">"6"</span>, <span style="COLOR: #848284">"#ececec"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>    so.addParam(<span style="COLOR: #848284">"menu"</span>, <span style="COLOR: #848284">"false"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>    so.addParam(<span style="COLOR: #848284">"quality"</span>, <span style="COLOR: #848284">"high"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>    so.addParam(<span style="COLOR: #848284">"wmode"</span>, <span style="COLOR: #848284">"transparent"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>    so.addParam(<span style="COLOR: #848284">"allowScriptAccess"</span>, <span style="COLOR: #848284">"sameDomain"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>    so.addParam(<span style="COLOR: #848284">"movie"</span>, <span style="COLOR: #848284">"/flash/map_client.swf"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>    so.addParam(<span style="COLOR: #848284">"bgcolor"</span>, <span style="COLOR: #848284">"#ffffff"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>    so.addParam(<span style="COLOR: #848284">"FlashVars"</span>, <span style="COLOR: #848284">"FloorPlanGUID=<% GetFloorPlanGUID(); %>"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>    so.write(<span style="COLOR: #848284">"flashcontent1"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span></script></pre><strong>FlashGetData.aspx</strong><br />This page is used by the Flash application to get data. The ASPX portion of this web page has no HTML or controls. When processing the Flash application's request, we output the data it needs in the HTML in a name-value pair. A little explanation...this page is called for the floor plan XML or an individual booth's details (name, address, etc.). After calling the database to get the data, it's written to the output HTML as <em>field=value</em>.<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> partial <span style="COLOR: #0000ff">class</span> FlashGetData : System.Web.UI.Page
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">protected </span><span style="COLOR: #0000ff">void</span> Page_Load(<span style="COLOR: #0000ff">object</span> sender, EventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #0000ff">       if</span> (Request.QueryString[<span style="COLOR: #848284">"Mode"</span>] != <span style="COLOR: #0000ff">null</span>)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><span style="COLOR: #0000ff">            try<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>            {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span><span style="COLOR: #008200">                //Extract mode<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>                Enums.ModeEnum mode = <br />                           (Enums.ModeEnum)<span style="COLOR: #0000ff">int</span>.Parse(Request.QueryString[<span style="COLOR: #848284">"Mode"</span>].ToString());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span><span style="COLOR: #008200">                //Process based on mode<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>                DataSet ds = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>                DataRow row;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span><span style="COLOR: #0000ff">                if</span> (mode == Enums.ModeEnum.RequestFloorPlan)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>                {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span><span style="COLOR: #008200">                    //Extract Querystring parameters<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span><span style="COLOR: #0000ff">                    string</span> floorPlanGUID = Request.QueryString[<span style="COLOR: #848284">"FloorPlanGUID"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span><span style="COLOR: #008200">                    //Get the data<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>                    ds = FloorPlans_BLL.SelectFloorPlansByFloorPlanGUID(<span style="COLOR: #0000ff">new</span> Guid(floorPlanGUID));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span>                    row = ds.Tables[0].Rows[0];
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span>                    Response.Write(<span style="COLOR: #848284">"FloorPlanXML="</span> + row[<span style="COLOR: #848284">"FloorPlanXML"</span>].ToString());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span>                }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span><span style="COLOR: #0000ff">                else </span><span style="COLOR: #0000ff">if</span> (mode == Enums.ModeEnum.RequestCompanyDetails)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span>                {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span><span style="COLOR: #008200">                    //Extract Querystring parameters<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span><span style="COLOR: #0000ff">                    string</span> floorPlanGUID = Request.QueryString[<span style="COLOR: #848284">"FloorPlanGUID"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span><span style="COLOR: #0000ff">                    string</span> boothID = Request.QueryString[<span style="COLOR: #848284">"BoothID"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span><span style="COLOR: #008200">                    //Get the data<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span>                    ds = Companies_BLL.SelectCompaniesByFloorPlanIDBoothID(<br /><span style="COLOR: #0000ff">                               new</span> Guid(floorPlanGUID), boothID);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span>                    Response.Write(<span style="COLOR: #848284">"CompanyDetails="</span> + BuildCompanyDetails(boothID, ds));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span>                }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span>            }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">36</span><span style="COLOR: #0000ff">            catch</span> (Exception ex)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">37</span>            {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">38</span>                Helpers.ProcessException(ex);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">39</span>            }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">40</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">41</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">42</span>}</pre><strong>FlashSaveData.aspx<br /></strong>This page is used in the administration area. Again, the ASPX portion of this web page has no HTML or controls.<br />The Flash movie executes a command like: xmlDoc.sendAndLoad("FlashSaveData.aspx?FloorPlanGUID=xxx-xxx-xxx-xxx", returnXML, "POST");<br />The important point of this code is Line 19. The Flash application posts data in the Request stream.<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> partial <span style="COLOR: #0000ff">class</span> FlashSaveData : System.Web.UI.Page
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">protected </span><span style="COLOR: #0000ff">void</span> Page_Load(<span style="COLOR: #0000ff">object</span> sender, EventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #008200">        //The Flash movie executes a command like:<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span><span style="COLOR: #008200">        //xmlDoc.sendAndLoad(<span style="COLOR: #848284">"FlashSaveData.aspx?FloorPlanGUID=xxx-xxx-xxx-xxx"</span>, <br />                   returnXML, <span style="COLOR: #848284">"POST"</span>);<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>         XmlDocument doc = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>         FloorPlans floorplans = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>        FloorPlanCompanies fpc = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>        DataSet ds = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span><span style="COLOR: #0000ff">        try<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span><span style="COLOR: #0000ff">            if</span> (Request.QueryString[<span style="COLOR: #848284">"FloorPlanGUID"</span>] != <span style="COLOR: #0000ff">null</span>)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>            {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span><span style="COLOR: #008200">                //Extract GUID and XML<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span><span style="COLOR: #0000ff">                string</span> floorPlanGUID = Request.QueryString[<span style="COLOR: #848284">"FloorPlanGUID"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>                doc = <span style="COLOR: #0000ff">new</span> XmlDocument();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>                doc.Load(Request.InputStream);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span><span style="COLOR: #008200">                //Get the FloorPlan row<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span>                ds = FloorPlans_BLL.SelectFloorPlansByFloorPlanGUID(<span style="COLOR: #0000ff">new</span> Guid(floorPlanGUID));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span>                DataRow row = ds.Tables[0].Rows[0];
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span><span style="COLOR: #008200">                //Build FloorPlans object<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span>                floorplans = <span style="COLOR: #0000ff">new</span> FloorPlans();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span>                floorplans.FloorPlanID = Int32.Parse(row[<span style="COLOR: #848284">"FloorPlanID"</span>].ToString());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span>                floorplans.FloorPlanGUID = <span style="COLOR: #0000ff">new</span> Guid(row[<span style="COLOR: #848284">"FloorPlanGUID"</span>].ToString());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span>                floorplans.UserID = Int32.Parse(row[<span style="COLOR: #848284">"UserID"</span>].ToString());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span>                floorplans.Title = row[<span style="COLOR: #848284">"Title"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span>                floorplans.URL = row[<span style="COLOR: #848284">"URL"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span>                floorplans.FloorPlanXML = doc.InnerXml;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span>                floorplans.Active = (<span style="COLOR: #0000ff">bool</span>)row[<span style="COLOR: #848284">"Active"</span>];
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span>                floorplans.RewriterID = Int32.Parse(row[<span style="COLOR: #848284">"RewriterID"</span>].ToString());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">36</span><span style="COLOR: #008200">                //Make sure all booths are now in the database<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">37</span>                XmlNodeList objNodes = doc.SelectNodes(<span style="COLOR: #848284">"./floorplan/booths/boothtxt"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">38</span><span style="COLOR: #0000ff">                foreach</span> (XmlNode objNode <span style="COLOR: #0000ff">in</span> objNodes)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">39</span>                {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">40</span>                    fpc = <span style="COLOR: #0000ff">new</span> FloorPlanCompanies();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">41</span>                    fpc.FloorPlanID = Int32.Parse(row[<span style="COLOR: #848284">"FloorPlanID"</span>].ToString());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">42</span>                    fpc.BoothID = objNode.InnerXml;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">43</span>                    fpc.CompanyID = 0;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">44</span>                    FloorPlanCompanies_BLL.SaveFloorPlanCompanies(fpc, <span style="COLOR: #0000ff">false</span>, <span style="COLOR: #0000ff">null</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">45</span>                }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">46</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">47</span><span style="COLOR: #008200">                //Save to database<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">48</span>                FloorPlans_BLL.UpdateFloorPlans(floorplans);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">49</span>            }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">50</span><span style="COLOR: #0000ff">            else<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">51</span><span style="COLOR: #0000ff">                throw </span><span style="COLOR: #0000ff">new</span> Exception(<span style="COLOR: #848284">"FloorPlanGUID missing"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">52</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">53</span><span style="COLOR: #0000ff">        catch</span> (Exception ex)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">54</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">55</span>            Helpers.ProcessException(ex);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">56</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">57</span><span style="COLOR: #0000ff">        finally<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">58</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">59</span><span style="COLOR: #0000ff">            if</span> (ds != <span style="COLOR: #0000ff">null</span>)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">60</span>            {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">61</span>                ds.Dispose();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">62</span>                ds = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">63</span>            }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">64</span>            fpc = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">65</span>            floorplans = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">66</span>            doc = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">67</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">68</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">69</span>}</pre><br />]]></description> 
					<pubDate>Wed, 19 Dec 2007 05:29:46 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/12/18/how-to-communicate-between-aspnet-and-flash/</guid>
				</item>
			
				<item>
					<title>How to make an AJAX Postback with JavaScript</title> 
					<link>http://keylimetie.com/blog/2007/12/3/how-to-make-an-ajax-postback-with-javascript/</link> 
					<description><![CDATA[Recently, we were working on a project that required us to make an AJAX postback with a table cell (TD) onclick event. We were "forced" to do this because the webpage designer wanted the search results displayed in a table and the TD's had onmouseover, onmouseout and onmouseclick events. The way he designed it was very nice and we didn't want to change it because AJAX for .NET didn't natively support the TD click event.<br /><br />We quickly searched the web for an answer and couldn't find anything. Over the past few months many others asked how to do it too, but nobody could provide an answer. It's really not that difficult...you just need to be a little creative and think how AJAX works in ASP.NET.<br /><br />In our project, we were binding location search results to a Repeater. In the onclick event, we added code to make a call to JavaScript function "makeAJAXPostback" and passed the ID. Originally, we tried to make a call to __doPostBack, but that forces a full page postback:<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><asp:Repeater ID=<span style="COLOR: #848284">"rptSearchResults"</span> runat=<span style="COLOR: #848284">"server"</span>>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>    <ItemTemplate>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>        <table width=<span style="COLOR: #848284">"100%"</span> border=<span style="COLOR: #848284">"0"</span> cellpadding=<span style="COLOR: #848284">"0"</span> cellspacing=<span style="COLOR: #848284">"4"</span>>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>            <tbody>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>                <tr>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>                    <td <span style="COLOR: #0000ff">class</span>=<span style="COLOR: #848284">"agentbox"</span> onmouseover=<span style="COLOR: #848284">"style.backgroundColor='#e0e8f3';"</span><br />                              onmouseout=<span style="COLOR: #848284">"style.backgroundColor='#f1f1f1';"<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>                        onclick=<span style="COLOR: #848284">"makeAJAXPostback('<%# DataBinder.Eval(Container.DataItem, "</span>ID<span style="COLOR: #848284">")%>')"</span>>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>                        <%# DataBinder.Eval(Container.DataItem, <span style="COLOR: #848284">"DisplayName"</span>)%>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>                        <br />
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>                        <%# DataBinder.Eval(Container.DataItem, <span style="COLOR: #848284">"Address1"</span>)%>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>                        <br />
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>                        <%# DataBinder.Eval(Container.DataItem, <span style="COLOR: #848284">"City"</span>)%>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>                        <br />
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>                        <%# DataBinder.Eval(Container.DataItem, <span style="COLOR: #848284">"StateIDCode"</span>)%>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>                        <%# DataBinder.Eval(Container.DataItem, <span style="COLOR: #848284">"Zip"</span>)%>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>                        <br />
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>                        <%# DataBinder.Eval(Container.DataItem, <span style="COLOR: #848284">"Phone"</span>)%>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>                    </td>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>                </tr>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>        </table>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>    </ItemTemplate>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span></asp:Repeater>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span></pre>At the bottom of the page, we added a the "makeAJAXPostback" function.<br />We also added a hidden field and a hidden HTML submit button:<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span>            <input type=<span style="COLOR: #848284">"submit"</span> id=<span style="COLOR: #848284">"btnTDClicked"</span> name=<span style="COLOR: #848284">"btnTDClicked"</span> style=<span style="COLOR: #848284">"display: none"</span> />
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>            <input type=<span style="COLOR: #848284">"hidden"</span> id=<span style="COLOR: #848284">"hidTDClickID"</span> name=<span style="COLOR: #848284">"hidTDClickID"</span> />
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>        </ContentTemplate>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>    </asp:UpdatePanel>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>    <script type=<span style="COLOR: #848284">"text/javascript"</span>>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>        function makeAJAXPostback(TDClickID)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>            document.forms[0].hidTDClickID.value = TDClickID;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>            document.forms[0].btnTDClicked.click();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>    </script>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span></asp:Content>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span></pre>When the TD cell is clicked, the "makeAJAXPostback" function is called, the ID is put in the hidden field and the hidden button is clicked. Because the AJAX Toolkit handles all form postbacks, the button click is automatically made via AJAX.<br /><br />All that's left is to handle the postback on the server. In Page_Load, we simply check if the hidden field is populated and process accordingly:<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #008200">//Handle TD Clicked Event when user clicks search results</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">if</span> (Request.Form[<span style="COLOR: #848284">"hidTDClickID"</span>] != <span style="COLOR: #0000ff">null</span> &&
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>    Request.Form[<span style="COLOR: #848284">"hidTDClickID"</span>].ToString() != <span style="COLOR: #848284">""</span>)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>    TDClicked(<span style="COLOR: #0000ff">int</span>.Parse(Request.Form[<span style="COLOR: #848284">"hidTDClickID"</span>].ToString()));<br /></pre>]]></description> 
					<pubDate>Mon, 03 Dec 2007 22:00:21 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/12/3/how-to-make-an-ajax-postback-with-javascript/</guid>
				</item>
			
				<item>
					<title>Convert Plain Text to MD5 Hash</title> 
					<link>http://keylimetie.com/blog/2007/11/20/convert-plain-text-to-md5-hash/</link> 
					<description><![CDATA[		<p>Nothing groundbreaking here, but if you need to know how to convert plain text to an MD5 Hash, here you go:<br /><br />
		<pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">using</span> System;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">using</span> System.Security.Cryptography;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">using</span> System.Text;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #0000ff">public </span><span style="COLOR: #0000ff">static </span><span style="COLOR: #0000ff">string</span> ConvertToMD5(<span style="COLOR: #0000ff">string</span> plainText)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><span style="COLOR: #0000ff">    byte</span>[] input = Encoding.UTF8.GetBytes(plainText);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #0000ff">    byte</span>[] output = MD5.Create().ComputeHash(input);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span><span style="COLOR: #0000ff">    return</span> Convert.ToBase64String(output).Trim();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>}</pre>
		<br />/html></p>]]></description> 
					<pubDate>Wed, 21 Nov 2007 04:08:32 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/11/20/convert-plain-text-to-md5-hash/</guid>
				</item>
			
				<item>
					<title>Enable File Upload on an AJAX Webpage</title> 
					<link>http://keylimetie.com/blog/2007/11/8/enable-file-upload-on-an-ajax-webpage/</link> 
					<description><![CDATA[File uploads do not work when doing async postbacks due to security restrictions. Because of this, we have to add a PostBackTrigger. PostbackTriggers enable controls inside an UpdatePanel to cause a postback instead of performing an asynchronous postback. Here's a code snippet that shows how to accomplish this. <br />  <br /><asp:Content ID="Content1" ContentPlaceHolderID="cphContent" runat="Server"> <br />    <asp:UpdatePanel ID="UpdatePanel1" runat ="server"> <br />        <Triggers> <br />            <asp:PostBackTrigger ControlID="imgbtnUpload" /> <br />        </Triggers> <br />         <ContentTemplate> <br />              <asp:FileUpload ID="txtFile" runat ="server" /> <br />            <asp:ImageButton ID="imgbtnUpload" runat="server" ImageUrl="Common/Images/upload.gif" OnClick="imgbtnNext_Click" /> <br />        </ContentTemplate> <br />    </ asp:UpdatePanel> <br /></ asp:Content> <br /><br />By adding the PostbackTrigger, you can mix controls that make AJAX calls with controls that require the postback and maintain the good user experience. ]]></description> 
					<pubDate>Fri, 09 Nov 2007 03:51:35 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/11/8/enable-file-upload-on-an-ajax-webpage/</guid>
				</item>
			
				<item>
					<title>Speed Up Your Site! 8 ASP.NET Performance Tips</title> 
					<link>http://keylimetie.com/blog/2007/10/11/speed-up-your-site-8-aspnet-performance-tips/</link> 
					<description><![CDATA[
		<p>I see these "Top 10 Ways..." articles all the time, but this one was the first in a while that didn't restate what all of the other ones talk about.<br /><br />Website: <a href="http://www.sitepoint.com/article/aspnet-performance-tips" target="_blank">http://www.sitepoint.com/article/aspnet-performance-tips</a><br /><br /><strong>1. Determine what to optimize<br /></strong>Discusses quick, simple techniques such as tracing.<br /><br /><strong>2. Decrease the size of the view state</strong><br />This one really got my attention. ViewState is so powerful, but can kill your website too. With AJAX gaining so much momentum, ViewState compression is a must. The article even gives you the C# class! Storing ViewState on the server can also be a great technique.<br /><br /><strong>3. Decrease the bandwidth that my site uses</strong><br />HTTP Compression has been around for several years. With IIS 6.0, it requires no 3rd party controls or custom code. Why wouldn't you enable it today?<br /><br /><strong>4. Improve the speed of my site</strong><br />Output caching can improve site speed very quickly and easily. Nothing new here.<br /><br /><strong>5. Refresh cache when the data changes</strong><br />Depending on how you bind data to objects or store cache, this tip may or may not apply to you. But definitely worth reading.<br /><br /><strong>6. Gain more control over the ASP.NET cache</strong><br />Using the Cache class/object is a great technique, but only when it makes sense...do not overuse it.<br /><br /><strong>7. Speed up database queries</strong><br />We have helped many clients speed up their website throughout the years. Evaluating and optimizing the database is one of the easiest and best bang for your buck approaches. Just run down the list: Indexes, Stored Procs, Views, locking, etc.<br /><br /><strong>8. Troubleshoot slow queries</strong><br />A quick guide to understanding execution plans.</p>
]]></description> 
					<pubDate>Thu, 11 Oct 2007 17:17:50 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/10/11/speed-up-your-site-8-aspnet-performance-tips/</guid>
				</item>
			
				<item>
					<title>PayPal Payment Data Transfer (PDT) WebControls Fix</title> 
					<link>http://keylimetie.com/blog/2007/9/4/paypal-payment-data-transfer-pdt-webcontrols-fix/</link> 
					<description><![CDATA[Over the past several years, we have implemented PayPal into our websites and many
of our customer websites. Since PayPal created their <a target="_blank" href="https://www.paypal.com/developer">
    Developer Program</a>, the methods to access PayPal shopping carts and checkout
has continued to grow. There are easy a half dozen ways to do it today <a target="_blank"
    href="https://www.paypal.com/us/cgi-bin/webscr?cmd=_wp-standard-overview-outside">
    [Learn More]</a>. One popular method is the <a target="_blank" href="https://www.paypal.com/IntegrationCenter/ic_pdt.html">
        Payment Data Transfer (PDT)</a> program. Back on 1/28/2006, I blogged about
how to easily implement PDT into your website.
<br />
<br />
<strong>Problem:</strong> Throughout the life of the PDF program, several versions
of the PayPal WebControls have been released. The most recent version is v1.0.22.19341.
But there's a problem with the release that PayPal never resolved. When using the
DLLs and .NET Web Controls to test in the Sandbox environment, the UseSandbox property
is always ignored and the Postaction is always set to the Production environment.
This makes it impossible to test in their Sandbox environment.
<br />
<br />
<strong>Solution</strong><br />
We created a very simple class to override the PostAction property. See code below.
<br />
<a href="/Uploads/129/PayPalCustom.zip">Download code</a>
<br />
<br />
using System;<br />
using System.Data;<br />
using System.Configuration;<br />
using System.Web;<br />
using System.Web.UI;<br />
using System.Web.UI.WebControls;<br />
<br />
using PayPal.Web.Controls;<br />
<br />
namespace PayPalCustom<br />
{<br />
    public class CustomUploadCompleteCartButton : UploadCompleteCartButton<br />
    {<br />
        public override string PostAction<br />
        {<br />
            get<br />
            {<br />
                return
this.UseSandbox ?<br />
                    "https://www.sandbox.paypal.com/cgi-bin/webscr"
:<br />
                    "https://www.paypal.com/cgi-bin/webscr";<br />
            }<br />
        }<br />
    }<br />
}<br />
<br />
To implement into your website:<br />
1. Add PayPalCustom.dll as a Reference in your application.<br />
2. Change the "Register" tag at the top of your page to:<br />
<%@ Register TagPrefix="cc1" Namespace="PayPalCustom" Assembly="PayPalCustom" %><br />
3. Change the UploadCompleteCartButton WebControl tag to<br />
<cc1:CustomUploadCompleteCartButton id="btnCheckout" runat="server" OnClick="btnCheckout_Click"></cc1:CustomUploadCompleteCartButton>


]]></description> 
					<pubDate>Tue, 04 Sep 2007 17:16:52 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/9/4/paypal-payment-data-transfer-pdt-webcontrols-fix/</guid>
				</item>
			
				<item>
					<title>PayPal PDT Sandbox Setup</title> 
					<link>http://keylimetie.com/blog/2007/8/1/paypal-pdt-sandbox-setup/</link> 
					<description><![CDATA[I recently implemented a PayPal checkout solution using Payment Data Transfer (PDT) to retrieve the transaction details. 
Testing the transaction process required using PayPal Sandbox, which I have used before and for which I already had my acccount 
set up. But when my customer wanted to do some testing, I had them set up their own Sandbox account, and was 
reminded that the initial setup is not simple. Eventually, I had to provide step by step instructions to get them up and
running correctly.<br /><br />

Here are those instructions for anyone needing to go through this for the first time:<br />
1. Go to <A href="https://developer.paypal.com/"><U>https://developer.paypal.com/</U></A> and create a new PayPal Developer 
account. After confirming the account, log in and you will see:<br />
        - Tab for Test Accounts – this is where you create Buyer and Seller accounts. A Seller account 
    provides you with a fake online store, and a Buyer account allows you to make fake purchases from that store.<br />
        - Tab for Test Email – this is where all the order/payment emails are sent during test purchases. 
    The emails are contained within the Sandbox environment, not sent to external email accounts.<br />
        - Tab for API Credentials – for a PDT application, ignore this tab completely. There is an Identity 
    Token here, but it is not the one needed for the "PayPalPDTID” in the web.config. There is also a seller password here, 
    but it is not the one you will use during testing.<br /><br />
2. In the upper right corner, click “Enter Sandbox”.<br />
        - Log in to Sandbox using the Seller Test Account credentials. For PDT to work, go to “Profile” 
    tab, then “Selling Preferences”, then “Website Payment Preferences” and confirm you have the following settings:<br />
            “Auto Return for Website Payments” is on, return URL is set to 
        http://www.yoursite.com/PDTHandler.aspx (or whatever page you use to process the transaction details.<br />
            “Payment Data Transfer” is on. Note that this is where you get the Identity Token that 
        should be used in the web.config.<br /><br />

Back in the project, you need to open the web.config and check these settings:

<pre><span style='color:#0000FF'><</span><span style='color:#800000'>appSettings</span><span style='color:#0000FF'>></span>
	<span style='color:#0000FF'><</span><span style='color:#800000'>add</span><span style='color:#FF0000'> key<span style='color:#0000FF'>="RootURL"</span> value<span style='color:#0000FF'>="http://localhost:xxxxx/ProjectName/"</span></span><span style='color:#0000FF'>/></span>
		   
	<span style='color:#008200'><</span><span style='color:#008200'>!--</span><span style='color:#008200'> Sandbox Settings --</span><span style='color:#008200'>></span>
	<span style='color:#0000FF'><</span><span style='color:#800000'>add</span><span style='color:#FF0000'> key<span style='color:#0000FF'>="PayPalServer"</span> value<span style='color:#0000FF'>="https://www.sandbox.paypal.com/cgi-bin/webscr"</span></span><span style='color:#0000FF'>/></span>
	<span style='color:#0000FF'><</span><span style='color:#800000'>add</span><span style='color:#FF0000'> key<span style='color:#0000FF'>="UseSandbox"</span> value<span style='color:#0000FF'>="true"</span></span><span style='color:#0000FF'>/></span>
	<span style='color:#0000FF'><</span><span style='color:#800000'>add</span><span style='color:#FF0000'> key<span style='color:#0000FF'>="PayPalEmailAddress"</span> value<span style='color:#0000FF'>="Seller email address used to login to Sandbox"</span></span><span style='color:#0000FF'>/></span>
	<span style='color:#0000FF'><</span><span style='color:#800000'>add</span><span style='color:#FF0000'> key<span style='color:#0000FF'>="PayPalPDTID"</span> value<span style='color:#0000FF'>="Identity Token from the Website Payment Preferences"</span></span><span style='color:#0000FF'>/></span>		
<span style='color:#0000FF'></</span><span style='color:#800000'>appSettings</span><span style='color:#0000FF'>></span></pre>
<br />
You are finally ready to run the project and make a purchase. When it redirects to PayPal, make sure it goes to 
<A href="https://www.sandbox.paypal.com/cgi-bin/webscr"><U>https://www.sandbox.paypal.com/cgi-bin/webscr</U></A> and login 
using the Buyer Test Account credentials. Complete the purchase and wait for it to redirect back to the project. You should 
have a message page advising that the transaction failed or was completed.<br /><br />

Finally, you can go back to <A href="https://developer.paypal.com/"><U>https://developer.paypal.com/</U></A>, enter Sandbox, 
login using the Seller credentials, and under My Account - History, see a report of all the transactions posted.]]></description> 
					<pubDate>Wed, 01 Aug 2007 23:16:08 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/8/1/paypal-pdt-sandbox-setup/</guid>
				</item>
			
				<item>
					<title>Some Design Principles To Consider</title> 
					<link>http://keylimetie.com/blog/2007/7/24/some-design-principles-to-consider/</link> 
					<description><![CDATA[
		<p>I came across an interesting set of principles that you might want to keep in mind the next time you set out to design an application, a website, or even improve your daily life. They are <em><strong>The Laws of Simplicity</strong></em> and were conceived by John Maeda, an artist and noted computer scientist from the MIT Media Lab. He compiled them in a short, 100-page book (and posted them on his website as well). I found them in a back issue of Wired magazine, in an article that applied them in a critique some new gadget. I have since found that they increasingly influence my own analysis of UIs and websites, and occassionally use them as the basis for discussions with clients to keep a design session on track.</p>
		<p>The Laws are:</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p> 1. Reduce - The simplest way to achieve simplicity is through thoughtful reduction of functionality.</p>
				<p> 2. Organize - Organization makes a system of many appear fewer.</p>
				<p> 3. Time - Savings in time feel like simplicity.</p>
				<p> 4. Learn - Knowledge makes everything simpler.</p>
				<p> 5. Differences - Simplicity and complexity need each other.</p>
				<p> 6. Context - What lies in the periphery of simplicity is de?nitely not peripheral.</p>
				<p> 7. Emotion - More emotions are better than less.</p>
				<p> 8. Trust - In simplicity we trust.</p>
				<p> 9. Failure - Some things can never be made simple.</p>
				<p>10. The One - Simplicity is about subtracting the obvious, and adding the meaningful.</p>
		</blockquote>
		<p>You can find a more detailed explanation of each law on his <a title="http://lawsofsimplicity.com/category/laws?order=ASC" href="http://lawsofsimplicity.com/category/laws?order=ASC" target="_blank"><strong>site</strong></a></p>
		<p> </p>
		<p>
				<a href="http://www.petermorano.com">www.petermorano.com</a>
		</p>
		<p> </p>
		<p> </p>
]]></description> 
					<pubDate>Tue, 24 Jul 2007 17:17:11 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/7/24/some-design-principles-to-consider/</guid>
				</item>
			
				<item>
					<title>Build an iPhone friendly webpage</title> 
					<link>http://keylimetie.com/blog/2007/7/14/build-an-iphone-friendly-webpage/</link> 
					<description><![CDATA[<SCRIPT type=text/javascript>
digg_url = "http://digg.com/apple/Build_an_iPhone_friendly_webpage_Sample_code_included";
</SCRIPT>

<SCRIPT src="http://digg.com/tools/diggthis.js" type=text/javascript>
		</SCRIPT>

<P>I just got the new iPhone and it's amazing. What you see it doing in the commercials is accurate...and it does a lot more! So right away, I want to know how to implement my own software. Maybe start developing some 3rd party applications. I researched a little and found out no iPhone Software Development Kit (SDK) is available. It seems like Apple is instead telling people to develop applications as webpages. But then you cannot actually interact with the iPhone...and you cannot access the iPhone database (Contacts, Favorites, etc.).<BR><BR>I searched a bit more and found the following sample webpage released by Apple:<BR><A href="http://developer.apple.com/samplecode/Puzzler/" target=_blank><U>http://developer.apple.com/samplecode/Puzzler/</U></A><BR><BR>View webpage with your iPhone:<BR><A href="/Uploads/126/index.html"><U>http://www.iarchitect.net/Uploads/126/index.html</U></A><BR><BR>Note: When trying to view the webpage in a standard browser (IE, Firefox), it doesn't display much. The weird thing is that if you click "Print Preview", you'll see the game.<BR><BR><STRONG>Description</STRONG><BR>"Puzzler" is a fun and interactive game that illustrates the use of web standards and JavaScript for the iPhone. This application makes advanced usage of mouse-handlers for user-input.<BR><BR>To play the game simply double-click or double-tap on any set of 2 or more balls of the same color that are touching. The balls will disappear and any balls above or to the left of the balls you just eliminated will shift into new positions. The goal is to clear all the balls from the screen.<BR><BR><STRONG>Screenshots</STRONG><BR>Click any image to see a larger version<BR><BR></P>
<TABLE style="WIDTH: 100%" cellSpacing=0 cellPadding=2 border=0>
<TBODY>
<TR>
<TD align=middle><A href="/Uploads/126/iPhone-iArchitect-large.jpg" target=_blank><IMG src="/Uploads/126/iPhone-iArchitect.jpg" border=0> </A> <BR>Navigate to iArchitect.net</TD>
<TD align=middle><A href="/Uploads/126/iPhone-Blog-large.jpg" target=_blank><IMG src="/Uploads/126/iPhone-Blog.jpg" border=0> </A> <BR>Click into this Blog</TD>
<TD align=middle><A href="/Uploads/126/iPhone-Puzzler-Start-large.jpg" target=_blank><IMG src="/Uploads/126/iPhone-Puzzler-Start.jpg" border=0> </A> <BR>Start Game</TD></TR>
<TR>
<TD align=middle> </TD>
<TD align=middle></TD>
<TD align=middle></TD></TR>
<TR>
<TD align=middle><A href="/Uploads/126/iPhone-Puzzler-In-Progress-.jpg" target=_blank><IMG src="/Uploads/126/iPhone-Puzzler-In-Progress.jpg" border=0> </A> <BR>Tap circles with finger</TD>
<TD align=middle><A href="/Uploads/126/iPhone-Puzzler-Complete-large.jpg" target=_blank><IMG src="/Uploads/126/iPhone-Puzzler-Complete.jpg" border=0> </A> <BR>All cleared. You win!</TD>
<TD align=middle></TD></TR></TBODY></TABLE><BR>]]></description> 
					<pubDate>Sat, 14 Jul 2007 23:21:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/7/14/build-an-iphone-friendly-webpage/</guid>
				</item>
			
				<item>
					<title>I Forgot The sa Account Password!</title> 
					<link>http://keylimetie.com/blog/2007/7/12/i-forgot-the-sa-account-password/</link> 
					<description><![CDATA[
		<p>At one time or another, we will all find ourselves trying to remember the sa password. Now, thanks to Rodney Landrum's article and the <strong>sp_help_revlogin</strong> stored procedure, there is an easy way to deal with this.</p>
		<p>You can find his article <a href="http://www.simple-talk.com/sql/t-sql-programming/temporarily-changing-an-unknown-password-of-the-sa-account-/" target="_blank"><strong>here</strong></a></p>
		<p> </p>
		<p>
				<a href="http://www.petermorano.com">www.petermorano.com</a>
		</p>
]]></description> 
					<pubDate>Thu, 12 Jul 2007 16:47:12 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/7/12/i-forgot-the-sa-account-password/</guid>
				</item>
			
				<item>
					<title>Use Dynamic Connection Strings MDAAB</title> 
					<link>http://keylimetie.com/blog/2007/7/4/dynamic-connection-strings-microsoft-daab/</link> 
					<description><![CDATA[I recently came across a situation where I needed to pass the Microsoft Data Access Application Blocks a dynamic connection string. Out of the box, the DAAB does not support this. <br /><br />Solution: Create a simple method that accepts a connection string and return a Database object. <br /><br /><strong>Code Before:</strong><br /><span style="COLOR: #000000">Database db = DatabaseFactory.CreateDatabase();</span><br /><br /><strong>Code After:</strong><br /><span style="COLOR: #000000">Database db = CustomDatabaseFactory.CreateDatabase(connstring);</span><br /><br /><br /><strong>Class Code:</strong><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">using</span> System;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">using</span> System.Collections.Generic;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">using</span> System.Data.Common;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><span style="COLOR: #0000ff">using</span> System.Text;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #0000ff">using</span> Microsoft.Practices.EnterpriseLibrary.Data;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span><span style="COLOR: #0000ff">namespace</span> Satisfyd.DataAccessLayer
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #008200">//This class is used to dynamically set the connection string<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span><span style="COLOR: #008200">//while using the Microsoft Data Application Blocks<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #0000ff">class</span> CustomDatabaseFactory
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #0000ff">readonly</span> DbProviderFactory dbProviderFactory =
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>            DbProviderFactories.GetFactory(<span style="COLOR: #848284">"System.Data.SqlClient"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">static</span> Database CreateDatabase(<span style="COLOR: #0000ff">string</span> connectionString)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #0000ff">new</span> GenericDatabase(connectionString, dbProviderFactory);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>}</pre>]]></description> 
					<pubDate>Wed, 04 Jul 2007 16:00:24 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/7/4/dynamic-connection-strings-microsoft-daab/</guid>
				</item>
			
				<item>
					<title>Re-Enable A Disabled SQL Server 2005 Service Broker</title> 
					<link>http://keylimetie.com/blog/2007/6/27/re-enable-a-disabled-sql-server-2005-service-broker/</link> 
					<description><![CDATA[
		<p>If you are caching data using SQL Cache Dependency with the SqlCacheDependency parameter set to "CommandNotification", and then restore or detach/attach your database (say, during a deployment), you will likely see this error: </p>
		<p>
				<em>
						<strong>"The SQL Server Service Broker for the current database is not enabled, and as a result query notifications are not supported. Please enable the Service Broker for this database if you wish to use notifications." </strong>
				</em>
		</p>
		<p>This is caused by the fact that the service broker is disabled automatically during these operations. To re-enable it, you need to run the following:</p>
		<p>
		</p>
		<div align="left">
				<span style="COLOR: #0000ff">   ALTER DATABASE </span>
				<span style="FONT-FAMILY: Verdana">YOUR_DATABASE </span>
				<span style="COLOR: #0000ff">SET ENABLE_BROKER</span>
		</div>
		<div align="left"> </div>
		<div align="left"> </div>
		<div align="left">
				<a href="http://www.petermorano.com">www.petermorano.com</a>
		</div>
]]></description> 
					<pubDate>Wed, 27 Jun 2007 23:56:53 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/6/27/re-enable-a-disabled-sql-server-2005-service-broker/</guid>
				</item>
			
				<item>
					<title>Acropolis: The Future Of Windows Client Development</title> 
					<link>http://keylimetie.com/blog/2007/6/21/acropolis-the-future-of-windows-client-development/</link> 
					<description><![CDATA[
		<p>Microsoft has released the Acropolis CTP, a set of tools and components <font size="2">that help developers quickly assemble applications from loosely-coupled parts and services. With Acropolis you will be able to:</font></p>
		<span lang="EN" style="FONT-SIZE: 10pt; mso-ansi-language: EN">
				<font color="#000000">
						<font face="Times New Roman">
								<ul type="disc">
										<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; COLOR: gray; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in">
												<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-ansi-language: EN">Quickly create WPF enabled user experiences for your client applications. <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??><o:p></o:p></span>
										</li>
										<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; COLOR: gray; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in">
												<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-ansi-language: EN">Build client applications from reusable, connectable, modules that allow you to easily create complex, business-focused applications in less time. <o:p></o:p></span>
										</li>
										<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; COLOR: gray; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in">
												<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-ansi-language: EN">Integrate and host your modules in applications such as Microsoft Office, or quickly build stand-alone client interfaces. <o:p></o:p></span>
										</li>
										<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; COLOR: gray; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in">
												<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-ansi-language: EN">Change the look and feel of your application quickly using built-in themes, or custom designs using XAML. <o:p></o:p></span>
										</li>
										<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; COLOR: gray; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in">
												<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-ansi-language: EN">Add features such as workflow navigation and user-specific views with minimal coding. <o:p></o:p></span>
										</li>
										<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; COLOR: gray; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in">
												<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-ansi-language: EN">Manage, update, and deploy your application modules quickly and easily.</span>
										</li>
								</ul>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; COLOR: gray; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in">
										<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-ansi-language: EN">David Hill has put together a short video walkthrough of using Acropolis: </span>
								</p>
								<ul>
										<li>
												<div class="MsoNormal" style="MARGIN: 0in 0in 0pt; COLOR: gray; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in">
														<span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-ansi-language: EN">
																<a title="http://windowsclient.net/learn/video.aspx?v=4225 " href="http://windowsclient.net/learn/video.aspx?v=4225 " target="_blank" temp_href="http://windowsclient.net/learn/video.aspx?v=4225 ">
																		<font color="#808080">Acropolis Video</font>
																</a>
														</span>
												</div>
										</li>
								</ul>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto">
										<span lang="EN" style="FONT-SIZE: 10pt; COLOR: gray; FONT-FAMILY: Tahoma; mso-ansi-language: EN">You can download the CTP here:</span>
								</p>
								<ul>
										<li>
												<div class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto">
														<span lang="EN" style="FONT-SIZE: 10pt; COLOR: gray; FONT-FAMILY: Tahoma; mso-ansi-language: EN">
																<a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=72386CE5-F206-4D5C-AB09-413B5F31F935&displaylang=en " href="http://www.microsoft.com/downloads/details.aspx?FamilyId=72386CE5-F206-4D5C-AB09-413B5F31F935&displaylang=en " target="_blank" temp_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=72386CE5-F206-4D5C-AB09-413B5F31F935&displaylang=en ">
																		<font color="#808080">Acropolis CTP Download</font>
																</a>
														</span>
												</div>
										</li>
								</ul>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto">
										<span lang="EN" style="FONT-SIZE: 10pt; COLOR: gray; FONT-FAMILY: Tahoma; mso-ansi-language: EN">
										</span>
										<span lang="EN" style="FONT-SIZE: 10pt; COLOR: gray; FONT-FAMILY: Tahoma; mso-ansi-language: EN"> </span>
								</p>
						</font>
				</font>
		</span>
]]></description> 
					<pubDate>Thu, 21 Jun 2007 20:21:36 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/6/21/acropolis-the-future-of-windows-client-development/</guid>
				</item>
			
				<item>
					<title>How to Add a Digg Link to Your Website</title> 
					<link>http://keylimetie.com/blog/2007/6/3/how-to-add-a-digg-link-to-your-website/</link> 
					<description><![CDATA[<P>If you're not familiar with Digg.com, you might want to check it out.<BR><BR><STRONG>What is Digg?</STRONG><BR><EM>"Digg is a user driven social content website. Ok, so what the heck does that mean? Well, everything on Digg is submitted by our community (that would be you). After you submit content, other people read your submission and Digg what they like best. If your story rocks and receives enough Diggs, it is promoted to the front page for the millions of visitors to see.</EM></P>
<P><EM>What can you do as a Digg user? Lots. Every person can digg (help promote), bury (help remove spam), and comment on stories... you can even Digg and bury comments you like or dislike. Digg also allows you to track your friends' activity throughout the site — want to share a video or news story with a friend? Digg it!"</EM> </P>
<P>I have been visiting Digg at least 2-3 times per week to read the quick posts. I usually jump directly to "Top in 24 Hours" page. This page usually has some really interesting links: <A href="http://www.digg.com/news/popular/24hours" target=_blank><U>http://www.digg.com/news/popular/24hours</U></A><BR><BR>If you decide to post a link, be sure your server can handle the hits. Everyday, sites crash due to too many hits too fast from Digg users. Or if your hosting provider has limits on bandwidth, you might lose your account all together. Fortunately, we have our own servers and can handle this type of traffic.<BR><BR>Back to the topic of this blog...if you decide to post a link on Digg, here's the snippet of code you need to add to your website to add the Digg Link to your website:<BR><BR><script type="text/javascript"><BR>    digg_url = "digg url to your link";<BR></script><BR><script src="<A href="http://digg.com/tools/diggthis.js">http://digg.com/tools/diggthis.js</A>" type="text/javascript"></script><BR><BR>For example:<BR><script type="text/javascript"><BR>    digg_url = "<A href="http://digg.com/software/20_Promo_Code_SGMAY07_good_for_1_week">http://digg.com/software/20_Promo_Code_SGMAY07_good_for_1_week</A>";<BR></script><BR><script src="<A href="http://digg.com/tools/diggthis.js">http://digg.com/tools/diggthis.js</A>" type="text/javascript"></script><BR><BR>results in this:<BR><BR>
<SCRIPT type=text/javascript>
digg_url = "http://digg.com/software/20_Promo_Code_SGMAY07_good_for_1_week";
</SCRIPT>

<SCRIPT src="http://digg.com/tools/diggthis.js" type=text/javascript></SCRIPT>
</P>]]></description> 
					<pubDate>Sun, 03 Jun 2007 19:56:56 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/6/3/how-to-add-a-digg-link-to-your-website/</guid>
				</item>
			
				<item>
					<title>Google Street View</title> 
					<link>http://keylimetie.com/blog/2007/5/28/google-street-view/</link> 
					<description><![CDATA[Within the past few days, Google has released a new feature to its Google Maps website. This new feature, Street View, is only available in a few cities like New York, Miami, Denver, San Francisco and Las Vegas. Not sure how it can be useful, but it is kind of cool. Just zoom into the street level and click on the blue outlined street. You will then see a photo view taken from a car.
<br /><br />
<a target=_blank href="http://maps.google.com/maps?f=q&hl=en&q=Las+Vegas,+NV,+USA&ie=UTF8&om=1&layer=c&cbll=36.112708,-115.172795&hq=&hnear=Las+Vegas,+Nevada&ll=36.114165,-115.175343&spn=0.009326,0.045447&t=h&z=15&panoid=bRrRAoT8WaOyD83y4xWg1g&cbp=11,274.98,,0,-8.68"><u>View Las Vegas Street View</u></a>
<br /><br />
Screenshot:<br/>
<a target=_blank href="/Blog/2007/5/28/Google-Street-View/Google-Maps-Vegas-large.jpg"><img border=0 src="/Blog/2007/5/28/Google-Street-View/Google-Maps-Vegas.jpg"></a>]]></description> 
					<pubDate>Mon, 28 May 2007 06:00:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/5/28/google-street-view/</guid>
				</item>
			
				<item>
					<title>unescape() in Code Behind</title> 
					<link>http://keylimetie.com/blog/2007/5/22/unescape-code-behind/</link> 
					<description><![CDATA[Ever have the need to unescape a string in your code-behind?
 Here's how:<br /><br />
<strong>value = Microsoft.JScript.GlobalObject.unescape(value);</strong><br />
<br />
Just remember to add a reference to Microsoft.JScript in your project.<br />
You now have access to all javascript functions in your code-behind.]]></description> 
					<pubDate>Tue, 22 May 2007 06:00:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/5/22/unescape-code-behind/</guid>
				</item>
			
				<item>
					<title>Some cool websites we&amp;quot;ve recently found...</title> 
					<link>http://keylimetie.com/blog/2007/5/17/cool-websites/</link> 
					<description><![CDATA[Some cool websites we've recently found...<br />
<br />
<strong>kuler</strong><br />
<a target="_blank" href="http://kuler.adobe.com"><u>http://kuler.adobe.com</u></a><br />
<i>"Explore, create and share color themes. Use it online or download themes to use
    with Adobe CS2 and 3."</i><br />
Basically, it's an interactive color theme designer. Download any of the 1,000+
themes which are rated by visitors, or creeate your own.
<br />
<br />
<strong>Simply Google</strong><br />
<a target="_blank" href="http://lloydi.com/blog/simplygoogleoriginal.htm"><u>http://lloydi.com/blog/simplygoogleoriginal.htm</u></a><br />
The owner of this website basically put most (if not all) Google features and websites
into one easy to use page.
<br />
<br />
<strong>SitePoint Contests</strong><br />
<a target="_blank" href="http://www.sitepoint.com/contests/"><u>http://www.sitepoint.com/contests/</u></a><br />
Over the past 10 years, we have tried all kinds of approaches to web design. Some
worked out, but most do not. Here's the pros and cons of what we have tried and
some comments on each approach:
<ul>
    <li><strong>Professional designers</strong><br />
        Pros: Original work. Direct communication with designer.<br />
        Cons: Expensive. Only get ideas from one designer, not a pool or designers. Depending
        on the person, their availability might be limited.<br />
        Comments: Unless the customer specifically requires it, we will not use a designer
        unless we know the person very well and he/she has consistently developed excellent
        work and is good to work with. This means he/she needs to stick to the project schedule,
        be available during core business hours and keep us up to date with progress.<br />
        <br />
    </li>
    <li><strong>Template websites</strong><br />
        Pros: Very cheap ($50-$70 for Flash, PSD, HTML & CSS). 1,000 of designs to choose
        from. A lot of the designs are very professional.<br />
        Cons: Your website design will not be unique.<br />
        Comments: For customers who have a decent budget and need a unique design, this
        is not an option. Templates work very well for businesses where the budget is tight
        and the website design doesn't have to be unique. And realistically, what's the
        chances of you seeing your website somewhere else...maybe 1 in a million? Also you
        do get the PSD, so you can easily modify parts of it. We still use templates all
        the time. When we choose a template, we buy it for the overall look-and-feel. Most,
        if not all, of the images are swapped out with our own. And of course the logo is
        replaced with ours.<br />
        <br />
    </li>
    <li><strong>Crowdsourcing websites</strong><br />
        Pros: Affordable (Price amount + $25 flat fee or 10%). Unique designs. Designers
        fight over prize money.<br />
        Cons: There's a chance only a few designers may participate in your contest and
        you won't have anything good to choose from.<br />
        Comments: We have been using <a target="_blank" href="http://www.designoutpost.com">
            <u>Design Outpost</u></a> for a few months now (posted 6 projects). For the most part,
        it has worked out well until my most recent project received only one entry the
        day before the project was supposed to end. We had to cancel it. Then we found <a
            target="_blank" href="http://www.sitepoint.com/contests/"><u>SitePoint</u></a>. So
        far, it's been great, but we have only posted two projects...a logo project that
        has received over 60 entries so far (ends tonight) and a template project that has
        received only 2 entries (but doesn't end for 3 for days).
    </li>
</ul>]]></description> 
					<pubDate>Thu, 17 May 2007 06:00:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/5/17/cool-websites/</guid>
				</item>
			
				<item>
					<title>Cool Business Card Designs</title> 
					<link>http://keylimetie.com/blog/2007/5/8/cool-business-card-designs/</link> 
					<description><![CDATA[<p><br />A few months ago, I renamed my company from New Vision to iArchitect. With any business name change comes the need for a new logo, new stationary, a new website and new business cards. Fortunately, I have been doing this long enough to create great relationships with excellent designers and also found great resources for one off jobs here and there. <br /><br />Today, I came across a great blog on "Cool Business Card Designs":<br /><a target=_blank href="http://creativebits.org/cool_business_card_designs"><u>http://creativebits.org/cool_business_card_designs</u></a><br /><br />I am not a very creative person, but the people who designed these business cards sure are.I thought I might share it with those of you who have businesses or are planning to start a new business. These kinds of touches can make a nice first impression.</p>]]></description> 
					<pubDate>Tue, 08 May 2007 06:00:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/5/8/cool-business-card-designs/</guid>
				</item>
			
				<item>
					<title>AJAX Animated GIF</title> 
					<link>http://keylimetie.com/blog/2007/4/29/ajax-animated-gif/</link> 
					<description><![CDATA[
<br />
I have been doing a lot of work with the Microsoft AJAX Toolkit lately.
Most recently, I have implemented it on a major insurance website I am always adding features to.
I am also updating the iArchitect CMS to be 100% AJAX-enabled. Very soon, you will see it on this website.
<br />
<br />
If you're not familiar with AJAX, here's the <a target=_blank href="http://en.wikipedia.org/wiki/AJAX"><u>Wikipedia definition</u></a>.
Basically, it's the process of updating small portions of a webpage instead of refreshing the entire page. For example,
when you leave a comment to a blog on this website, instead of refreshing the entire page, I can now just refresh the comments area.
This presents a much more enjoyable user experience and speeds up the website.
<br />
<br />
When a portion of a webpage is being updated, you will see an animated image indicating so.
While working on these websites, I found the need to create custom animated images.
These are not easy to create...until now.
Visit the following link and you can create your own animated AJAX image in seconds!<br />
<a target=_blank href="http://www.ajaxload.info"><u>http://www.ajaxload.info</u></a>
]]></description> 
					<pubDate>Mon, 30 Apr 2007 04:12:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/4/29/ajax-animated-gif/</guid>
				</item>
			
				<item>
					<title>Google PageRank</title> 
					<link>http://keylimetie.com/blog/2007/4/26/google-page-rank/</link> 
					<description><![CDATA[<br />A very interesting article on Google PageRank:<br /><br /><a target=_blank href="http://searchengineland.com/070426-011828.php"><u>http://searchengineland.com/070426-011828.php</u></a>]]></description> 
					<pubDate>Fri, 27 Apr 2007 04:12:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/4/26/google-page-rank/</guid>
				</item>
			
				<item>
					<title>Simple XML Validator</title> 
					<link>http://keylimetie.com/blog/2007/3/24/simple-xml-validator/</link> 
					<description><![CDATA[I recently had the need to validate an XML document against its schema, so I quickly threw together this application.<br /><br />It includes the XSD document (schema) for the Google Sitemaps program.<br /><br />To use:<br />1. <a href="/Uploads/108/SitemapXMLValidator.zip"><u>Download</u></a> the application<br />2. Unzip the two files to a folder on your computer.<br />3. Run the application and change the XSD location to where the "sitemap.xsd" file is located.<br />4. Enter in the path of the XML document and click "Validate".<br /><br />The application will return with a success message or a list of error messages.]]></description> 
					<pubDate>Sat, 24 Mar 2007 17:19:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/3/24/simple-xml-validator/</guid>
				</item>
			
				<item>
					<title>20 Things To Remember For Good Web Copy</title> 
					<link>http://keylimetie.com/blog/2007/3/14/good-web-copy/</link> 
					<description><![CDATA[<p>1. Tight writing. That doesn't mean bad or easy writing.<br />2. Copy of about 600-800 words is better for SEO and catching the long tail of search.<br />3. Title – Subject – Support, in that order, like subject, verb, object.<br />4. Titles should be snappy and informative – clickable, but clear.<br />5. Leads (first sentence or paragraph) should get to the point. Tell the reader what the article's about first thing.<br />6. No fancy, wordy intros where it's not clear what you're talking about.<br />7. Information beats fluff every time. Pretty is for books and newspapers (and only sometimes).<br />8. Information does not beat style every time. Style keeps people awake.<br />9. Sans serif fonts are easier and faster to read on computer screens.<br />10. White space is awesome – even better than big, pretty pictures.<br />11. Content should be scannable.<br />12. Think in bullets and subtitles.<br />13. People like lists.<br />14. Pictures should be specific and informative, not generic, decorative and ad-like.<br />15. Photos should be relevant to content.<br />16. People in pictures should look friendly and approachable (and have their whole head).<br />17. Photos should be full body if possible.<br />18. Spell stuff right. It makes you look smarter.<br />19. Grammar IS important. Unless you're not really a professional.<br />20. Online press releases should be even tighter than Web copy.<br /><br />Source: WebProNews</p>]]></description> 
					<pubDate>Thu, 15 Mar 2007 05:03:45 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/3/14/good-web-copy/</guid>
				</item>
			
				<item>
					<title>Sitemap Generator v4.1.1 Beta Available</title> 
					<link>http://keylimetie.com/blog/2007/3/13/sitemap-generator-v411-released/</link> 
					<description><![CDATA[<p>Version 4.1.1 is now available with some bug fixes:<br /> - Scheduling Service may run multiple times if spidering process takes over 1 hour.<br /> - FTP cannot communicate with server in some rare scenarios.<br /> - Edit Results vertical scrollbar sometimes becomes disabled.<br /> - Spidering error message "Object reference not set" occurs when spidering stopped before completing.<br /><br />This is a beta release and has been tested.<br />New users: I recommend all visitors who have not installed my Google software to install this beta version.<br />Existing users: Please uninstall the current version and install this version. All websites and preferences will remain.<br /><br /><a href="/Uploads/106/iArchitect_SG411.zip"><u>Download Sitemap Generator v4.1.1</u></a></p>]]></description> 
					<pubDate>Tue, 13 Mar 2007 06:45:09 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/3/13/sitemap-generator-v411-released/</guid>
				</item>
			
				<item>
					<title>Sitemap Generator v4.1 Released!!!</title> 
					<link>http://keylimetie.com/blog/2007/3/4/sitemap-generator-v41-released/</link> 
					<description><![CDATA[<img src="/Uploads/70/google_sm_logo.gif" border="0" /><br /><br /><strong>Version 4.1 Released with all of the features you asked for and much more!</strong>		<br />		<br />Generate Google, Yahoo and HTML Sitemaps....and now RSS Feeds!<br />Version 4.0 was released only one and a half weeks ago, but I've received a lot of great response.<br />Because of all of the great feature requests, I decided to jump on them right away and get them out in a v4.1.<br />Download it today and check it out.<br /><br /><b>Download<font color="#ff0000"> - Try it today for FREE!</font></b><br /><a href="/Products/Sitemap-Generator/"><u>Download Sitemap Generator v4.1</u></a><br /><br /><strong>New Features in v4.1:</strong><br />- Preferences: Ability to specify the spider start directory.<br />- Preferences: Ability to disable advertising<br />- Preferences: Last Modified Date has been overhauled! Instead of just specifying a default date, your options are:<br />"Use server's modified date" - While spidering, the application will read the webpage headers to get the last modified date (if available). This is the best option.<br />"Use today's date" - Especially useful when your server doesn't supply the last modified date and you want to schedule your updates.<br />"Let me specify the date" - Some people might still want to specify a default date.<br />- Ability to export to RSS: Another format to publish your website! RSS is very popular and getting more attention everyday.</p>]]></description> 
					<pubDate>Mon, 05 Mar 2007 04:39:51 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/3/4/sitemap-generator-v41-released/</guid>
				</item>
			
				<item>
					<title>Automating Database Maintenance in SQL Server 2005 Express</title> 
					<link>http://keylimetie.com/blog/2007/2/21/sql-2005-express-maintenance/</link> 
					<description><![CDATA[<p>When building highly scalable applications, you need a powerful database. My database of choice right now is SQL Server 2005. Since a full SQL Server license costs a few thousand dollars per processor, I use SQL Server Express. Why not...it's free! It's basically the same thing as the full blown SQL Server 2005, except there are some limitations on memory, database capacity and other things I will not hit with the websites I build on the side. It also doesn't allow you Import/Export data which is a vey useful feature. That's OK, we can script our database updates. And finally, it doesn't include scheduled maintenance. This is not good. All websites and databases MUST be backed up daily in case of a disaster.<br /><br /><strong>So how do we implement this?</strong><br />I did a quick search on Google and found the following webpage:<br /><a href="http://www.sqldbatips.com/showarticle.asp?ID=27" target="_blank">http://www.sqldbatips.com/showarticle.asp?ID=27</a><br /><br /><a href="/Uploads/104/expressmaint.txt">Download SQL script</a><br /><br />Basically, it's a SQL script that does the maintenance tasks for you. Simply specify the parameters based on your needs and schedule it to run with Windows Task Scheduler. That's it!<br /><br /><strong>Example execute call<br /></strong>This call executes a Full Database Backup of all user databases to c:\backups.<br />It also verifies the backups and reports to c: eports.<br />It keeps the backups for 2 weeks and reports for 1 week<br /><br /><font color="#006400"><font color="#000080">  exec expressmaint<br />      @database      = 'ALL_USER', <br />      @optype         = 'DB',<br />      @backupfldr    = 'c:\backups',<br />      @reportfldr      = 'c: eports',<br />      @verify          = 2,<br />      @dbretainunit  = 'weeks',<br />      @dbretainval   = 1,<br />      @rptretainunit  = 'weeks',<br />      @rptretainval   = 1,<br />      @report          = 1</font><br /></font><font color="#000000"><br /><strong>Example Scheduled Task</strong><br />On my server, I have it scheduled with the following parameters. It's set to run everyday at 3am.<br /><br /><em>Run: </em>"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -S.\SQLExpress -i"D:\DBBackups\UserFullBackup.sql"</font></p>
		<p>
				<font color="#000000">
						<em>Start in:</em> "C:\Program Files\Microsoft SQL Server\90\Tools\Binn"<br /><br /><strong>Additional comments</strong><br />1. When I ran the script for the first time, I received the following error:<br /></font>
				<font color="#000000">
						<font color="#ff0000">SQL Server blocked access to procedure 'sys.sp_OACreate' of component 'Ole Automation Procedures' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Procedures' by using sp_configure. For more information about enabling 'Ole Automation Procedures', see "Surface Area Configuration" in SQL Server Books Online. </font>
						<br />
						<br />To resolve it, run the following SQL commands:<br /><font color="#800000" size="2"><font color="#0000ff" size="2">USE</font><font size="2"><font color="#000000"> master<br /></font>GO<br /></font>sp_configure </font><font size="2"></font><font color="#ff0000" size="2">'show advanced options'</font><font color="#808080" size="2">,</font><font size="2"> 1</font><font color="#808080" size="2">;<br /></font><font size="2">GO<br /></font><font color="#0000ff" size="2">RECONFIGURE</font><font color="#808080" size="2">;<br /></font><font size="2">GO<br /></font><font color="#800000" size="2">sp_configure </font><font size="2"></font><font color="#ff0000" size="2">'Ole Automation Procedures'</font><font color="#808080" size="2">,</font><font size="2"> 1</font><font color="#808080" size="2">;<br /></font><font size="2">GO<br /></font><font color="#0000ff" size="2">RECONFIGURE</font><font color="#808080" size="2">;<br /></font><font size="2">GO<br /><br />2. I then received error:<br /></font></font>
				<font color="#ff0000">SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online. </font>
				<br />
				<br />To resolve it, run the following SQL commands:<br /><font color="#0000ff" size="2">USE</font><font size="2"> master<br />GO<br /></font><font color="#0000ff" size="2">EXEC </font><font size="2"></font><font color="#800000" size="2">sp_configure </font><font size="2"></font><font color="#ff0000" size="2">'show advanced options'</font><font color="#808080" size="2">,</font><font size="2"> 1<br />GO<br /></font><font color="#0000ff" size="2">RECONFIGURE </font><font size="2"></font><font color="#0000ff" size="2">WITH</font><font size="2"> OVERRIDE<br />GO<br /></font><font color="#0000ff" size="2">EXEC </font><font size="2"></font><font color="#800000" size="2">sp_configure </font><font size="2"></font><font color="#ff0000" size="2">'xp_cmdshell'</font><font color="#808080" size="2">,</font><font size="2"> 1<br />GO<br /></font><font color="#0000ff" size="2">RECONFIGURE </font><font size="2"></font><font color="#0000ff" size="2">WITH</font><font size="2"> OVERRIDE<br />GO<br /></font><font color="#0000ff" size="2">EXEC </font><font size="2"></font><font color="#800000" size="2">sp_configure </font><font size="2"></font><font color="#ff0000" size="2">'show advanced options'</font><font color="#808080" size="2">,</font><font size="2"> 0<br />GO</font></p>]]></description> 
					<pubDate>Thu, 22 Feb 2007 03:14:24 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/2/21/sql-2005-express-maintenance/</guid>
				</item>
			
				<item>
					<title>Sitemap Generator v4.0 Pre-Release</title> 
					<link>http://keylimetie.com/blog/2007/2/19/sitemap-generator-4-pre-release/</link> 
					<description><![CDATA[<p>
				<br />
				<br />I have tested the main application and it's solid. It runs very fast and all of the new features run great. The scheduling part appears to be running great, but I still want to test it out on a couple more operating systems (it's very complicated code and I want to make sure it runs perfectly). I have finished testing it on Windows XP and Windows 2003, but still want to test it on Windows 2000. I plan to complete this tomorrow and release ALL of version 4.0. But if you want to get a jump start with the new features, the download link is below. When I publish the final v4 tomorrow, it will be an installation package. And if you don't care about the scheduling feature, then the download link below will be perfect for you.<br /><br />You'll notice the entire application is now branded with my company name, iArchitect. This is a decision I recently made to push the product under my company name with other products I will be releasing soon. <u><strong>One product coming soon, Web Analyzer, will be free for all licensed Sitemap Generator users!</strong></u> I'll let you know when it's available.</p>]]></description> 
					<pubDate>Tue, 20 Feb 2007 05:39:42 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/2/19/sitemap-generator-4-pre-release/</guid>
				</item>
			
				<item>
					<title>Sitemap Generator v4.0 being released tonight!</title> 
					<link>http://keylimetie.com/blog/2007/2/19/sitemap-generator-4/</link> 
					<description><![CDATA[<p>After a long, long wait, I finally have version 4.0 ready! A few licensed users have been using it for the past week and have identified only a couple minor glitches. I am confident the code is solid and ready to be released. I am finishing up some installation package items and will be releasing the new version Monday night (tonight). Thank you everyone for the wait. It will be well worth it! In case you're curious, here are the features that have been added:</p>
		<table width="100%">
				<tbody>
						<tr>
								<td>
										<ul>
												<li>
														<font size="2">When creating a new website profile, you can now copy the preferences from another profile</font>
												</li>
												<li>
														<font size="2">Ability to specify Google sitemap file name</font>
												</li>
												<li>
														<font size="2">HTML title is now extracted while spidering and displayed on the HTML sitemaps</font>
												</li>
												<li>
														<font size="2">When spidering websites, the software now sets the "User Agent" property to "iArchitect Sitemap Generator v4.0"</font>
												</li>
												<li>
														<font size="2">When spidering websites, the software now handles "302 Redirect" response codes</font>
												</li>
												<li>
														<font size="2">When spidering is completed, all found webpage paths are sorted</font>
												</li>
												<li>
														<font size="2">Updated XML header element per Google's update</font>
												</li>
												<li>
														<font size="2">Customize your HTML sitemaps with header and footer templates</font>
												</li>
												<li>
														<font size="2">Ability to export to RSS format</font>
												</li>
												<li>
														<font size="2">Ability to copy sitemaps to a local path (useful when running software on web server)</font>
												</li>
												<li>
														<font size="2">Ability to schedule application to run automatically</font>
												</li>
												<li>
														<font size="2">Help tab added which displays online forums website</font>
												</li>
												<li>
														<font size="2">Small advertising image area added in header of software; Licensed users can disable it</font>
												</li>
												<li>
														<font size="2">Rebranded software; instead of seeing Brian Pautsch, you will now see iArchitect (my company name)</font>
												</li>
												<li>
														<font size="2">Bug: When deleting a website profile, not all files were deleted</font>
												</li>
												<li>
														<font size="2">Bug: For very large sites, the google sitemap index file had "/google/" in the paths </font>
												</li>
										</ul>
								</td>
						</tr>
				</tbody>
		</table>]]></description> 
					<pubDate>Mon, 19 Feb 2007 06:57:33 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/2/19/sitemap-generator-4/</guid>
				</item>
			
				<item>
					<title>Windows 2003 Server does not stream FLV videos</title> 
					<link>http://keylimetie.com/blog/2007/1/16/windows-2003-flv-videos/</link> 
					<description><![CDATA[<p>A friend of mine came across a problem trying to stream a FLV video on his customer's website. Before deploying it to their web server, he tested it successfully on his local machine and on a UNIX test server...no problems. Once he migrated the code and FLV file to the Production Windows 2003 Server, it didn't work anymore. He figured out the problem and told me about it.<br /><br /><strong>Issue</strong><br />When Flash Player movie files that stream external FLV files (Flash videos) are placed on a Microsoft Windows 2003 server and then viewed in a browser, the SWF file plays correctly, but the FLV video does not stream. These files work correctly if tested on other operating systems. The issue affects all FLV files played via Windows 2003 server, including files made with the Flash Video Kit for Dreamweaver MX 2004.</p>
		<p>This TechNote describes the steps necessary to allow Windows 2003 to stream Flash Video files.</p>
		<p>Note: These instructions are provided as a courtesy for customers and address the issue in Microsoft Internet Information Services (IIS) 6.0 rather than Flash.</p>
		<p>
				<strong>Reason</strong>
				<br />With IIS 6.0, Microsoft changed the way streaming media is handled. Previous versions of IIS did not require any modification to stream Flash Video. Microsoft IIS 6.0, the default web server that ships with Windows 2003, requires a MIME type to recognize that FLV files are streamed media.</p>
		<p>
				<strong>Solution</strong>
				<br />Please be aware that these steps do not resolve any issue with Flash, but are a configuration step for Microsoft Windows 2003 and Microsoft IIS Server 6.0. Any difficulties in executing these instructions or any errors that may arise from modifying your system settings should be addressed to Microsoft. For more details, please refer to your IIS documentation.</p>
		<p>1. On the Windows 2003 server, open the Internet Information Services Manager. <br />2. Expand the Local Computer Server. <br />3. Right-click the local computer server and select Properties. <br />4. Select the MIME Types tab. <br />5. Click New and enter the following information: <br />    Associated Extension box: .FLV <br />    MIME Type box:flv-application/octet-stream <br />6. Click OK. <br />7. Restart the World Wide Web Publishing service. <br /><br /><strong>Source</strong><br /><a href="http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_19439" target="_blank">http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_19439</a></p>]]></description> 
					<pubDate>Wed, 17 Jan 2007 02:58:10 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/1/16/windows-2003-flv-videos/</guid>
				</item>
			
				<item>
					<title>Microsoft Enterprise Library - Hosting in &quot;Medium Trust&quot; Environment</title> 
					<link>http://keylimetie.com/blog/2007/1/4/enterprise-library/</link> 
					<description><![CDATA[I have been using the Microsoft Enterprise Library for many years now. For the first time, I had serious problems deploying them to a production environment today. After about an hour of searching online, I found out that a lot of people were having this problem and only a few people had figured out how to resolve it. Here's what I did....very easy, very fast. <br /><br /><strong>Problem:</strong><br />Deployed web application with any Microsoft Enterprise Library component and received the follow error: <br /><br /><table width="98%" bgcolor="#c0d8f0" border="0"><tbody><tr><td><strong>Server Error in '/' Application</strong><br /><br />Required permissions cannot be acquired.<br /><br />Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.<br /><br />Exception Details: System.Security.Policy.PolicyException: Required permissions cannot be acquired.<br /><br />Source Error:<br />An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.<br /><br />Stack Trace:<br />[PolicyException: Required permissions cannot be acquired.]<br />System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Boolean checkExecutionPermission) +2736869<br />System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Int32& securitySpecialFlags, Boolean checkExecutionPermission) +57<br /><br />blah blah blah... </td></tr></tbody></table><br /><strong>Explanation:</strong><br />Simply put, the Microsoft Enterprise Library is trying to perform operations that it is not allowed based on the trust level set on that server.<br />I have never received this error before since I host all of my code on my own dedicated servers (where I have a "Full" trust set).<br />Recently, I have been opening accounts for customers at WebHost4Life.com (I'm sort of trying to get out of the hosting business due to the liabilities). WebHost4Life must also have the trust level set to "Full" since I've never had problems there. Just today, I deployed code to a new hosting provider. I believe they have their trust level set to "Medium" and this is why I'm getting the error. <br /><br /><strong>Resolution:</strong><br />1. A few months ago, Microsoft released updated code to resolve this issue. <br /><a href="/Uploads/97/EntLib2-Patch-2554-Partial-Trust.zip">Click here to download the code updates</a><br /><br />2. For any application block to read information from configuration files, it is necessary to grant the application ConfigurationPermission (which is not provided by default in medium trust). You can add the requirePermission="false" attribute to the application's configuration section definitions. For example: <pre><span style="COLOR: #0000ff"><?</span><span style="COLOR: #800000">xml</span><span style="COLOR: #ff0000"> version<span style="COLOR: #0000ff">="1.0"</span></span><span style="COLOR: #0000ff">?></span><br /><span style="COLOR: #0000ff">  <</span><span style="COLOR: #800000">configuration</span><span style="COLOR: #0000ff">><br /></span><span style="COLOR: #0000ff">    <</span><span style="COLOR: #800000">configSections</span><span style="COLOR: #0000ff">><br /></span><span style="COLOR: #0000ff">    <</span><span style="COLOR: #800000">section</span><span style="COLOR: #ff0000"> name<span style="COLOR: #0000ff">="dataConfiguration" </span>requirePermission<span style="COLOR: #0000ff">="false"<br /></span>       type<span style="COLOR: #0000ff">="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,<br />             Microsoft.Practices.EnterpriseLibrary.Data"</span></span><span style="COLOR: #0000ff">/><br /></span><span style="COLOR: #0000ff">    </</span><span style="COLOR: #800000">configSections</span><span style="COLOR: #0000ff">></span>
	.
	.
	.
<span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">configuration</span><span style="COLOR: #0000ff">></span></pre>That's it...pretty easy and fast.]]></description> 
					<pubDate>Fri, 05 Jan 2007 04:12:55 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2007/1/4/enterprise-library/</guid>
				</item>
			
				<item>
					<title>SQL Server 2005 - Generate INSERT statements for easy migrations</title> 
					<link>http://keylimetie.com/blog/2006/12/12/generate-insert/</link> 
					<description><![CDATA[I often work in a local environment and later need to migrate data to a remote database server. If the ports are open on the remote server, I can just export the data. Often this is not the case. In the past, I have either<br />- Export the data, FTP it to the other location and import the data (what a pain!)<br />- Used code I wrote to export the data to INSERT statements, copy/paste text to other location and execute scripts (not too bad)<br /><br />I was looking for an easier approach and came across Narayana Vyas Kondreddi's website. He has written a ton of code (VB and SQL) to do a lot of the everyday things we do.<br /><br />Here's a link to a "Procedure to script your data (to generate INSERT statements from the existing data)":<br /><a href="http://vyaskn.tripod.com/code.htm#inserts" target="_blank">http://vyaskn.tripod.com/code.htm#inserts</a><br /><br />It's great. It installs in the master database and is available to all users for all databases.<br />It even has options to filter results, omit certain data types, get only n rows, and much more.<br />Be sure to check it out for yourself.<br /><br />In case the site ever shuts down, here's a <a href="/Uploads/94/sp_generate_inserts.zip">link to the SQL 2005 script</a>.]]></description> 
					<pubDate>Wed, 13 Dec 2006 05:01:19 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/12/12/generate-insert/</guid>
				</item>
			
				<item>
					<title>Google Checkout Processing Free Now through 2007!!!</title> 
					<link>http://keylimetie.com/blog/2006/12/6/free-google-checkout/</link> 
					<description><![CDATA[<p>Announced this morning on Google.com...<br /><br /><span class="header"><strong><font color="#3366cc" size="3">To celebrate the holidays, Google is processing your Checkout sales for free<br /><br /></font></strong></span>As you may know, for every $1 you spend on AdWords, you can process $10 of Google Checkout sales for free. Just in time for the holidays, we're giving you even more by processing your Google Checkout sales for free through the end of 2007! Here's how it works:<br /><br />- From November 8, 2006 through December 31, 2007, we'll process your Checkout transactions for free, even if you aren't an AdWords advertiser. If you're already an AdWords advertiser, we'll process your Checkout transactions for free regardless of what you spend on AdWords.* <br />- Valid Checkout orders you receive during the promotion will automatically qualify. <br />- You can take full advantage of this promotion by encouraging your buyers to use Google Checkout on your site. <br />- Other applicable fees (e.g. chargeback fees) may apply. This promotion is subject to the Google Checkout Terms of Service. Google may revoke the promotion for accounts that do not comply with these terms.<br /><br />On January 1, 2008, the standard transaction fee will apply again. Also, if applicable, your regular free transaction processing (based on your December, 2007 AdWords spend) will resume.<br /><br />Using Google Checkout to increase sales and lower costs during this busy holiday season has never been easier. If we can do anything else to help, feel free to drop us a line. Happy holidays from Google Checkout!<br /><br />* AdWords advertisers: Because this promotion begins on 11/8/06, the free transaction processing based on your AdWords spend will still apply to your Checkout sales from 11/1/06 through 11/7/06. Any Checkout orders you receive and process from 11/8/06 through 12/31/07 will then be eligible for free processing under this promotion.<br /></p>]]></description> 
					<pubDate>Wed, 06 Dec 2006 14:18:51 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/12/6/free-google-checkout/</guid>
				</item>
			
				<item>
					<title>How To Get Around Having To Click Flash Movies</title> 
					<link>http://keylimetie.com/blog/2006/11/29/click-flash-movies/</link> 
					<description><![CDATA[<p>If you use Internet Explorer, I’m sure you’re just as annoyed as me with the need to click a Flash movie once just to activate it. Not sure what I’m talking about? Check out this website I built: <a href="http://www.coyledevelopment.com" target="_blank">http://www.coyledevelopment.com</a></p>
		<img src="/Uploads/92/flash.jpg" />
		<p>Notice the Flash object is disabled (it runs, but you can’t interact with it) and your cursor has a little message that states “Click to activate and use this control”. Once you click it, it becomes “unlocked” and you can use it. What a pain, right? If the Flash object does any kind of posting back to the webpage and re-renders itself, you’ll have to click it again…meaning, your choice to activate it isn’t “saved” during your session.</p>
		<p>Why must we deal with this? It’s because of a dispute between Microsoft and Eolas. Eolas owns the patent to the technology for rendering plug-ins in web browsers. Microsoft must license the technology in order to use it in IE. They don’t want to so they added this annoyance to better their case. Read more at: <a href="http://en.wikipedia.org/wiki/Eolas" target="_blank">http://en.wikipedia.org/wiki/Eolas</a></p>
		<p>So how can I get around it? It’s easy now thanks to <a href="http://blog.deconcept.com/swfobject/" target="_blank">deconcept</a> and SWFObject.<br />1. <a href="http://blog.deconcept.com/swfobject/swfobject_source.js" target="_blank">Download the SWFObject Javascript file</a><br /><br />2. Include the swfobject.js Javascript file and write a small amount of Javascript on your page to embed your Flash movie. Here is an example showing the minimum amount of code needed to embed a Flash movie:<br /><br /><script type="text/javascript" src="swfobject.js"></script>  <br /><div id="flashcontent"><br />  This text is replaced by the Flash movie.<br /></div><br /><script type="text/javascript"><br />   var so = new SWFObject("movie.swf", "mymovie", "200", "100", "7", "#336699");<br />   so.write("flashcontent");<br /></script><br /><br />This is just the basic explanation. You might want to know more about required parameters versus optional parameters or how to pass variables into the movie. For this information, <a href="http://blog.deconcept.com/swfobject/" target="_blank">visit their website</a> to learn more.<br /></p>]]></description> 
					<pubDate>Thu, 30 Nov 2006 05:43:53 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/11/29/click-flash-movies/</guid>
				</item>
			
				<item>
					<title>Important SEO Tips Everyone Should Know</title> 
					<link>http://keylimetie.com/blog/2006/11/18/seotips/</link> 
					<description><![CDATA[<p>From a WebProNews email I received recently:<br /><br />Important SEO Tips Everyone Should Know<br />Chris Richardson | Staff Writer<br /><br />During the Interactive Site Review session at the 2007 Las Vegas PubCon, various site owners submitted their site for the panel to pick apart. The panel consisted of heavy hitters like Matt Cutts from Google, Tim Mayer from Yahoo, Greg Boser from WebGuerrilla, and Danny Sullivan.<br /><br />While some of the sites they reviewed may have been lacking in certain departments, the knowledge the panel bestowed is quite valuable for SEOers of all types. What follows is are some quotes and paraphrases that go a long way to demonstrating what it is search engines are looking for:<br /><br />- each page of your site is an entry point, optimize (title tags, keyphrases) for what each page targets - Greg<br /><br />- strive for quality links over quantity links - the entire panel<br /><br />- if you are targeting your site geographically, get links from local entities (Chamber of Commerce, local directories)<br /><br />- unique content is important (this and link bait are the prevailing themes of the Las Vegas PubCon)<br /><br />- if you can get into the top 3 of Google Local, you will be on the front page of Google's standard search if the query is geographically based... - Danny Sullivan<br /><br />- when optimizing for Google Local, navigate to the Google Local Business Center - this was suggested by Matt as a source to assist with being indexed by Google Local's index as well as a place to claim your business, similar to Technorati's blog claim function.<br /><br />- one of the sites reviewed was a real estate site... during this portion, Greg revealed some interesting information about how this industry markets to the search industry: the real estate industry conducts SEO much like they did in 98, it's a bad field in reference to SEO...and while this may not be a tip per se, it's good information to be aware of especially if you are considering this industry...<br /><br />- ditch javascript menus altogether... they are a red flag to ranking algos - Boser<br /><br />- template-based sites may not rank well because they appear alike to the crawlers... - Tim Mayer and Matt Cutts both iterated this thought.<br /><br />- Session IDs urls need to be blocked from crawlers because of duplicate content issues (don't serve session ids to bots)... this was emphasized by Matt who said: "session ids can be poison for crawlers"<br /><br />- if your site sells manufactured products, don't use manufacturer copy... use your own descriptions - this was also stated by Heather Lloyd-Martin during the effective web copy session<br /><br />- there's no good use for 302 redirects, ever - the entire panel<br /><br />- blog about your product or target area, this provide so much of the original content the search engines are looking for - paraphrased from Matt Cutts<br /><br />This last point plays into the whole link bait theory that was incredibly prominent during this conference (I cannot count the number of times I heard this phrase...). Keep these tips and ideas in mind when you are conducting any SEO or SEM-related process. They will serve you well.</p>
		<p>
				<br /> </p>]]></description> 
					<pubDate>Sat, 18 Nov 2006 19:13:43 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/11/18/seotips/</guid>
				</item>
			
				<item>
					<title>Gmail Spam Trick</title> 
					<link>http://keylimetie.com/blog/2006/11/18/gmail-spam-trick/</link> 
					<description><![CDATA[<p>
				<strong>I saw this forum entry on digg.com and had to share...pretty tricky:<br /></strong>
				<br />
		</p>When you give your email address to a website, you hope that they don't sell or trade your address to a bunch of spammers. Well if they do, here is a simple way to see what sites are responsible for what particular piece of email. This requires you have a Gmail account. 
<p></p><p>If your Gmail login name was <a href="mailto:username@gmail.com">mailto:username@gmail.com</a>and you went to samplesite.com to fill out a registration form, instead of just entering <a href="mailto:username@gmail.com">mailto:username@gmail.com</a>as your email, enter it as <a href="mailto:username+samplesitecom@gmail.com">mailto:username+samplesitecom@gmail.com</a>instead. When Gmail sees a "+" in an email address, it uses all the characters to the left of the plus sign to know who to send it to. In this example it would still send it to <a href="mailto:username@gmail.com">mailto:username@gmail.com</a>. </p><p>Now whats cool is if you search Gmail for username+samplesitecom, you will see all massages that were sent to that email address. </p><p>To see who is responsible for sending a specific message click the Show Details link and you will see the complete address. </p>]]></description> 
					<pubDate>Wed, 15 Nov 2006 23:38:15 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/11/18/gmail-spam-trick/</guid>
				</item>
			
				<item>
					<title>Create a Web Layout with Adobe Photoshop</title> 
					<link>http://keylimetie.com/blog/2006/10/24/create-layout-photoshop/</link> 
					<description><![CDATA[<p>Learn step by step how to create a web layout with Adobe Photoshop. <br />Really amazing and useful for web design beginners.</p>
		<p>
				<a target="_blank" href="http://www.13dots.com/index.php?categoryid=33&p2_articleid=65">http://www.13dots.com/index.php?categoryid=33&p2_articleid=65</a>
		</p>]]></description> 
					<pubDate>Wed, 25 Oct 2006 02:21:20 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/10/24/create-layout-photoshop/</guid>
				</item>
			
				<item>
					<title>Free Photoshop-compatible Plugins</title> 
					<link>http://keylimetie.com/blog/2006/10/22/photoshop-plugins/</link> 
					<description><![CDATA[Free Photoshop-compatible Plugins <br /><br /><a target="_blank" href="http://thepluginsite.com/resources/freeps.htm">http://thepluginsite.com/resources/freeps.htm</a>]]></description> 
					<pubDate>Mon, 23 Oct 2006 04:45:14 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/10/22/photoshop-plugins/</guid>
				</item>
			
				<item>
					<title>Gartner: Five reasons why offshore deals go bust</title> 
					<link>http://keylimetie.com/blog/2006/10/18/offshore-deals-go-bust/</link> 
					<description><![CDATA[Over the past few years, I have worked with companies that have used offshore resources to work on part of or complete projects. I also have been "hands on" with some of the projects and in my experience, it rarely works.<br /><br />I was recently in a meeting discussing the possibility of offshoring some work. Since I have been down this road all too many times, I voiced my opinion. Most people also didn't like the idea and I took it upon myself to gather some facts. Now I know there are arguments for both sides, but when I was browsing the web I came across a study by Gartner Inc.<br /><br />If you're not familiar with Gartner Inc., they are pretty much the authority on gathering, analyzing and reporting statistical data in an unbiased manner. Companies all over the world utilize Gartner's services to gather data on pretty much anything...and because they are so thorough, it's not cheap.<br /><br />The 5 high level reasons are:<br />1. Unrealized cost savings<br />2. Loss of productivity<br />3. Poor commitment and communications<br />4. Cultural differences<br />5. Lack of offshore expertise and readiness<br /><br /><a href="http://www.computerworld.com/managementtopics/outsourcing/story/0,10801,102677,00.html" target="_blank">Click here read the entire article</a>]]></description> 
					<pubDate>Thu, 19 Oct 2006 03:31:39 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/10/18/offshore-deals-go-bust/</guid>
				</item>
			
				<item>
					<title>The 18 Mistakes That Kill Startups</title> 
					<link>http://keylimetie.com/blog/2006/10/16/18mistakes/</link> 
					<description><![CDATA[<p>I found this great article on the "18 Mistakes That Kill Startups", by Paul Graham.<br /><br />I have been a part of several start ups, some successful, some not so successful.<br />A lot of the points Paul makes I have seen first hand.<br />I learned a few really good things from his article.<br /><br /><a href="http://paulgraham.com/startupmistakes.html" target="_blank">http://paulgraham.com/startupmistakes.html</a></p>]]></description> 
					<pubDate>Tue, 17 Oct 2006 05:34:41 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/10/16/18mistakes/</guid>
				</item>
			
				<item>
					<title>21,600 Developers Email Addresses found with Google Code Search</title> 
					<link>http://keylimetie.com/blog/2006/10/12/googleemailaddresses/</link> 
					<description><![CDATA[<p>
A few days ago, I blogged about <a href="/Blog/2006/10/5/FindDBCredentials/">how to find database credentials using Google Code Search</a>.<br />Here's another interesting search:<br /><br />
Google Code Search supports regular expressions...try:<br /><br />
<a target="_blank" href="http://www.google.com/codesearch?q=%5E%5Cw%2B%28%5B-%2B.%5D%5Cw%2B%29*@%5Cw%2B%28%5B-.%5D%5Cw%2B%29*%5C.%5Cw%2B%28%5B-.%5D%5Cw%2B%29*%24&btnG=Search+Code">^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$</a>
<br /><br />
21,600 results with is probably at least 30,000 email addresses.
<br /><br />
<img src="/Uploads/85/screenshot.jpg" />
</p>]]></description> 
					<pubDate>Fri, 13 Oct 2006 02:05:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/10/12/googleemailaddresses/</guid>
				</item>
			
				<item>
					<title>How to Add a WinForm DataGridView Header CheckBox</title> 
					<link>http://keylimetie.com/blog/2006/10/10/datagridview/</link> 
					<description><![CDATA[A recent project required that we figure out how to add a "Select All" checkbox to the header column header of a DataGridViewCheckBoxColumn Windows Forms. After searching the web for possible solutions, it became clear that the actual control cound not be added dynamically. The best approach we could find was to paint a checkbox image into the header and respond to the DataGridView's "ColumnHeaderMouseClick" event. Here's the solution in detail:<br /><br /><a href="/Uploads/84/GridViewHeaderCheckbox.zip">Download source code</a><br /><br /><img src="/Uploads/84/screenshot.jpg" /><br /><br />1. Create a Resource File and add in the two attached images. When I dragged them in, they were renamed to “_checked” and “_unchecked”. <br /><br />2. Declare a “Select All” private variable. <br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #0000ff">bool</span> _selectAll = <span style="COLOR: #0000ff">false</span>;</pre>3. Wherever you bind your DataGridView (I did in Page_Load for this example), add in the checkbox column (unless you already have it in your design view). <br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private </span><span style="COLOR: #0000ff">void</span> Form1_Load(<span style="COLOR: #0000ff">object</span> sender, EventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">    try<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #008200">        //Bind XML dataset to DataGridView<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>        DataSet ds = <span style="COLOR: #0000ff">new</span> DataSet();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>        ds.ReadXml(_xmlFilePath);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>        dataGridView1.DataSource = ds.Tables[0];
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span><span style="COLOR: #008200">        //Add the checkbox column<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>        dataGridView1.Columns.Insert(0, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span><span style="COLOR: #0000ff">            new</span> DataGridViewCheckBoxColumn());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span><span style="COLOR: #0000ff">    catch</span> (Exception ex)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>        MessageBox.Show(<span style="COLOR: #848284">"Exception: "</span> + ex.ToString());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>}</pre>4. Create the CellPainting Event. <br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #0000ff">void</span> dataGridView1_CellPainting(<span style="COLOR: #0000ff">object</span> sender, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>    DataGridViewCellPaintingEventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><span style="COLOR: #008200">    //Is this the checkbox column header?<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #0000ff">    if</span> (e.RowIndex == -1 && e.ColumnIndex == 0)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><span style="COLOR: #0000ff">        try<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span><span style="COLOR: #008200">            //Erase the cell<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><span style="COLOR: #0000ff">            using</span> (Brush backColorBrush = 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span><span style="COLOR: #0000ff">                new</span> SolidBrush(e.CellStyle.BackColor))
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>            {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>                e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>            }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span><span style="COLOR: #008200">            //Draw 1 bottom line...<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>            e.Graphics.DrawLine(Pens.DarkGray, e.CellBounds.Left, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>                e.CellBounds.Bottom - 1, e.CellBounds.Right, e.CellBounds.Bottom - 1);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span><span style="COLOR: #008200">            //Draw 2 top lines...<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>            e.Graphics.DrawLine(Pens.DarkGray, e.CellBounds.Left, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>                e.CellBounds.Top, e.CellBounds.Right, e.CellBounds.Top);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span>            e.Graphics.DrawLine(Pens.White, e.CellBounds.Left, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span>                e.CellBounds.Top + 1, e.CellBounds.Right, e.CellBounds.Top + 1);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span><span style="COLOR: #008200">            //Draw right line...<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span>            e.Graphics.DrawLine(Pens.DarkGray, e.CellBounds.Right - 1, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span>                e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span><span style="COLOR: #008200">            //Draw left line...<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span>            e.Graphics.DrawLine(Pens.White, e.CellBounds.Left, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span>                e.CellBounds.Top, e.CellBounds.Left, e.CellBounds.Bottom);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span><span style="COLOR: #008200">            //Get the image from the resource file<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span>            Image imgChecked = (Image)Resource1._checked;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span>            Image imgUnchecked = (Image)Resource1._unchecked;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span><span style="COLOR: #008200">            //Determine paint coordinates<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">36</span><span style="COLOR: #0000ff">            int</span> X = e.CellBounds.Left + 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">37</span>                ((e.CellBounds.Width - imgChecked.Width) / 2) - 1;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">38</span><span style="COLOR: #0000ff">            int</span> Y = e.CellBounds.Top + 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">39</span>                ((e.CellBounds.Height - imgChecked.Height) / 2) - 1;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">40</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">41</span><span style="COLOR: #008200">            //Draw checkbox in header<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">42</span><span style="COLOR: #0000ff">            if</span> (_selectAll)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">43</span>                e.Graphics.DrawImage(imgChecked, X, Y);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">44</span><span style="COLOR: #0000ff">            else<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">45</span>                e.Graphics.DrawImage(imgUnchecked, X, Y);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">46</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">47</span><span style="COLOR: #008200">            //Set event as handled<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">48</span>            e.Handled = <span style="COLOR: #0000ff">true</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">49</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">50</span><span style="COLOR: #0000ff">        catch<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">51</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">52</span><span style="COLOR: #008200">            //Handle exception<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">53</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">54</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">55</span>}</pre>5. Handle the Select All click event. <br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #0000ff">void</span> dataGridView1_ColumnHeaderMouseClick(<span style="COLOR: #0000ff">object</span> sender, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>    DataGridViewCellMouseEventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><span style="COLOR: #0000ff">    if</span> (e.ColumnIndex == 0)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>        _selectAll = !_selectAll;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><span style="COLOR: #0000ff">        for</span> (<span style="COLOR: #0000ff">int</span> i = 0; i < dataGridView1.Rows.Count; i++)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>            dataGridView1.Rows[i].Cells[0].Value = _selectAll;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>}</pre>]]></description> 
					<pubDate>Wed, 11 Oct 2006 04:15:40 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/10/10/datagridview/</guid>
				</item>
			
				<item>
					<title>Find Database Credentials with Google Code Search</title> 
					<link>http://keylimetie.com/blog/2006/10/5/finddbcredentials/</link> 
					<description><![CDATA[I was messing around with Google Code Search today and decided to see if people were dumb enough to publish web.config files with their private database credentials.<br /><br />Yep...there are a few out there. Check out this example:<br /><br /><a target="_blank" href="http://google.com/codesearch?hl=en&lr=&q=database+file%3A%22web.config%22&btnG=Search">http://google.com/codesearch?hl=en&lr=&q=database+file%3A%22web.config%22&btnG=Search</a>]]></description> 
					<pubDate>Fri, 06 Oct 2006 03:31:19 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/10/5/finddbcredentials/</guid>
				</item>
			
				<item>
					<title>Google Code Search</title> 
					<link>http://keylimetie.com/blog/2006/10/4/googlecodesearch/</link> 
					<description><![CDATA[<p>Today, Google announced "Google Code Search":<br /><a href="http://www.google.com/codesearch" target="_blank">http://www.google.com/codesearch</a><br /><br />"It's a site that simplifies how software developers search for programming code to improve existing software or create new programs."<br /><br />The Basic Search is OK, but you really need to check out the Advanced Search.<br />Here's you can specify a few things, most importantly the language.<br /><br />In the example below, I search for "PayPal" in C# code.<br /><br /><img src="/Uploads/82/search.jpg" /><br /><br />Results return in code snippet format. Check out result #11...that's some amazing code!<br /><br /><img src="/Uploads/82/results.jpg" /><br /><br />Click into each result and the entire code file is displayed with links to related project files. </p>]]></description> 
					<pubDate>Thu, 05 Oct 2006 05:46:31 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/10/4/googlecodesearch/</guid>
				</item>
			
				<item>
					<title>ViewStateException solved!</title> 
					<link>http://keylimetie.com/blog/2006/9/24/viewstate/</link> 
					<description><![CDATA[<p>A few months ago, I started receiving the following exception on my website for one of my blogs:<br /><br /><em>System.Web.HttpException: The state information is invalid for this page and might be corrupted. ---> System.Web.UI.ViewStateException: Invalid viewstate</em><br /><br />Immediately, I visited the webpage and it displayed fine. So I refreshed a bunch of times without receiving any errors. Then I tried viewing and posting comments with several browsers...nothing wrong. Then I opened up the code and reviewed it...it looked good. Since it was only happening to one blog, I thought it might have to do with the content of that blog...maybe I accidentally dropped a <strong>"<form>"</strong> or <strong>"<__VIEWSTATE>"</strong> tag in the content...nope! I was puzzled and kind of dismissed it for awhile.<br /><br />Then it started happening more and more...on average, I now receive 2-3 of these errors per day. I started getting a little worried that a handful of visitors couldn't post comments to my website...but I had no ideas what to do.<br /><br />Then I got a call from a customer. They purchased some blog spamming software and asked me to come to their office, figure out how it works and show them how to use it. Before going there, I researched the product and that's when I figured out my problem. The software I was reading up on asks you what keywords to search blog sites for. Next, it asks you for a blog comment. Finally, it searches the blog sites with the keywords you entered and posts the comment you entered. Not only does it get people to read your comment and visit your website, but it also increases your Google "PageRank" over time...genius! But be careful...if Google sniffs this out, you'll be blacklisted.<br /><br />This is what is happening to my website...people are running software programs to leave spam comments and are causing exceptions to be thrown. The good news is that I now know it's now my software causing the problems and that I'm successfully blocking a lot of spam thanks to my <a href="/Blog/2005/12/1/Captcha/Default.aspx">Captcha code</a>.<br /><br />Below is the full exception message...I'm posting it so that it is indexed is search engines and others having this problem will now have resolution.<br /><br /><b>Page:</b> Global.asax<br /><b>Method:</b> Application_Error<br /><b>Exception:</b> System.Web.HttpException: The state information is invalid for this page and might be corrupted. ---> System.Web.UI.ViewStateException: Invalid viewstate.<br /><b>Additional Details:</b><br />Client IP: 65.88.129.2 Port: 46644 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322) ViewState: sssssss Referer: Path: /BlogEntry.aspx ---> System.FormatException: Invalid length for a Base-64 char array. at System.Convert.FromBase64String(String s) at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) at System.Web.UI.HiddenFieldPageStatePersister.Load() --- End of inner exception stack trace --- --- End of inner exception stack trace --- at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) at System.Web.UI.HiddenFieldPageStatePersister.Load() at System.Web.UI.Page.LoadPageStateFromPersistenceMedium() at System.Web.UI.Page.LoadAllState() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) at System.Web.UI.Page.ProcessRequest(HttpContext context) at ASP.blogentry_aspx.ProcessRequest(HttpContext context) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files oot\6486194d\28a90c6b\App_Web_znedlsbn.2.cs:line 0 at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)Inner Exc:System.Web.UI.ViewStateException: Invalid viewstate. Client IP: 65.88.129.2 Port: 46644 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322) ViewState: sssssss Referer: Path: /BlogEntry.aspx ---> System.FormatException: Invalid length for a Base-64 char array. at System.Convert.FromBase64String(String s) at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) at System.Web.UI.HiddenFieldPageStatePersister.Load() --- End of inner exception stack trace ---Inner/Inner Exc:System.FormatException: Invalid length for a Base-64 char array. at System.Convert.FromBase64String(String s) at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) at System.Web.UI.HiddenFieldPageStatePersister.Load() </p>]]></description> 
					<pubDate>Sun, 24 Sep 2006 22:31:52 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/9/24/viewstate/</guid>
				</item>
			
				<item>
					<title>Extract Current Webpage HTML (and maybe generate a PDF)</title> 
					<link>http://keylimetie.com/blog/2006/9/20/extracthtmlpdf/</link> 
					<description><![CDATA[I recently had a requirement from a customer to generate a PDF that looked exactly like the webpage. Instead of trying to recreate the webpage in Crystal or SQL Server Reports, I decided it would be much easier, cheaper and maintainable to simply take the webpage's HTML, load it into a 3rd party PDF generator and create a PDF. <br /><br />Below is the code you need to do this.<br />The important part is that you need to override the page's "OnPreRenderComplete" event and extract the HTML from the base. <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #0000ff">void</span> OnPreRenderComplete(EventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>    GeneratePDFFromPageHTML();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>}
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span><span style="COLOR: #0000ff">protected </span><span style="COLOR: #0000ff">void</span> GeneratePDFFromPageHTML()
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>    StringWriter sw;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>    HtmlTextWriter htmltw;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span><span style="COLOR: #0000ff">    try<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span><span style="COLOR: #008200">        //Get the current page's HTML<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>        sw = <span style="COLOR: #0000ff">new</span> StringWriter();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>        htmltw = <span style="COLOR: #0000ff">new</span> HtmlTextWriter(sw);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span><span style="COLOR: #0000ff">        base</span>.Render(htmltw);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>        StringBuilder html = sw.GetStringBuilder();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span><span style="COLOR: #008200">        //Generate PDF with HTML here. Code not supplied <br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span><span style="COLOR: #008200">        //since there are so many 3rd party PDF generators.<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span><span style="COLOR: #008200">        //When done generating PDF, either load it into the<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span><span style="COLOR: #008200">        //browser or stream it back as an attachment<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span><span style="COLOR: #0000ff">    catch</span> (Exception ex)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span><span style="COLOR: #008200">        //Handle exception<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span><span style="COLOR: #0000ff">    finally<br /></span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span><span style="COLOR: #0000ff">        if</span> (htmltw != <span style="COLOR: #0000ff">null</span>)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span>            htmltw.Close();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span>            htmltw.Dispose();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span>            htmltw = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">36</span><span style="COLOR: #0000ff">        if</span> (sw != <span style="COLOR: #0000ff">null</span>)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">37</span>        {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">38</span>            sw.Close();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">39</span>            sw.Dispose();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">40</span>            sw = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">41</span>        }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">42</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">43</span>}</pre>]]></description> 
					<pubDate>Thu, 21 Sep 2006 05:04:25 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/9/20/extracthtmlpdf/</guid>
				</item>
			
				<item>
					<title>Great Regular Expression Resource</title> 
					<link>http://keylimetie.com/blog/2006/9/18/regularexpression/</link> 
					<description><![CDATA[<p>Regular Expressions can be very helpful when searching for strings of text.<br />I use them all the time and recently came across and amazing website:<br /><a href="http://regexlib.com">http://regexlib.com</a> - Regular Expression Library<br /><br />Some of the pages I use a lot:<br />Cheat Sheet: <a href="http://regexlib.com/CheatSheet.aspx">http://regexlib.com/CheatSheet.aspx</a><br />Tester: <a href="http://regexlib.com/RETester.aspx">http://regexlib.com/RETester.aspx</a></p>]]></description> 
					<pubDate>Tue, 19 Sep 2006 05:12:01 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/9/18/regularexpression/</guid>
				</item>
			
				<item>
					<title>8 Things Businesses Should Know Before Building A Website</title> 
					<link>http://keylimetie.com/blog/2006/9/12/8things/</link> 
					<description><![CDATA[Over the past 10 years, I have had the pleasure to work with some great customers. I also have had the unfortunate honor of working with some "difficult" customers. Below are a few things I have learned and my advice to you if you're looking to build or re-build your company website. Good luck!<br /><br /><strong>1. Do Your Homework</strong><br />The number one complaint from designers and developers is that customers cannot articulate what they want. Designers and developers are not mind readers and often are not very familiar with your industry. You need to specify what features you want exactly with great detail. Visit competitor sites and see what they have. It's OK to copy ideas, but make them unique in your own way if possible. The design process is very important and takes time. There will be several iterations until a finished design is made. But if you have a clear vision, you can save time and money because the designers won't have to keep reworking the design while you figure out what you want.<br /><br /><strong>2. Don't Cut Corners</strong><br />There are several phases to any website project. A typical life cycle is:<br /><ul><i>1. Project Inception</i> - Imagine how great the site could be if it were created without limits. Write these ideas down.<br /><i>2. Project Launch Meeting</i> - Brainstorming session. No decisions will be made, but you'll talk about things like colors, fonts, logos, navigation and who the site will target (very important!).<br /><i>3. Project Requirements Document</i> - Essentially you want this document to summarize what the team currently thinks the project will look like when it's completed. There's no need to get it all right or feel tied down.<br /><i>4. Discovery Documents</i> - With these documents, you'll get down to working out who your target audience is, what they want, the sections of the site, and what they will contain. This will become the true roadmap for the project.<br /><i>5. Prototype</i> - The prototype will turn your documents into a reality. Now is the time to simply produce a visual that the client can see.<br /><i>6. Development</i> - The designers will give the developers the necessary files and developers will build the website. After some time, a rough website will be produced and give everyone a chance to see where the project now stands...and appreciate how far it has come.<br /><i>7. Testing and Final Approval</i> - Get lots of people to use your site and make sure they enjoy it. Take their comments into consideration and tweak where appropriate.<br /><i>8. Go Live</i> - Turn the site onto the world. Monitor the usage, watch for errors and fix them. Get people's reaction. </ul>Maintenance will be necessary. A lot of people think that once the site is live, it's done. Not true at all. I'll discuss this more later (#7 below).<br /><br /><strong>3. You Need To Provide Content</strong><br />Once you have your Discovery documents complete, the designers and developers will start working. This is when you need to start building the content for the website. Start early and stay on top of it! Writing content for most people is difficult and takes a lot of time. It's very easy to push it off until the end...this will severely push back your timeline. Also, some customers think the web designers or developers write the content. This doesn't make any sense. It's your business, you're the expert. You have to write the content.<br /><br /><strong>4. Too Flashy = No Traffic</strong><br />Web sites don't need to be over-the-top to get results. Some clients will ask for lots of animation and cool graphics. They want a splash page built in Flash, and Javascript rollover images for menu items. They don't understand that (a) these things can turn off visitors who don't have a fast Internet connection or up-to-date browsers or extensions; (b) these things eat up bandwidth; (c) these things make a web site much less visible to search engines. In short, they rarely help, and often hurt, the majority of business web sites. The structure should be defined by the content, not the look. The look is important but only to support the content...not to control the content. A lot of designers are user interface experts - listen to them.<br /><br /><strong>5. It Costs More And Takes Longer than You Think</strong><br />Just because you can create a website in a few minutes with an off-the-shelf package doesn't mean it's the right solution for your business. These off-the-shelf packages are bought by thousands of people and your website will looked like a cheesy, canned solution. They also only have a limited feature set. If the feature you need isn't there, you will not get it and no developer will be able to add it in. <br /><br />It's not that the website is hard to build, it's just that it takes time. Good, experienced developers who have built hundreds of websites over that time typically create a library of common code. These developers can help you save a lot of money by reusing their common code...but if you have something unique it needs to be created from scratch. Just remember that you only get what you pay for. If you get something cheap, there is always a catch. The lowest bidder is the lowest bidder for a reason. Also, most people in the Web industry are clueless. The majority of web developers need to update their skills to what is required for the 21st century. Anyone can build a website...but it doesn’t always mean that they should.<br /><br /><strong>6. If You Build It, They Won't Necessarily Come</strong><br />There's a commercial where a company launches their website and immediately starts getting millions of sales. That doesn't happen. Your website will not be the first result in any Google search the first day you go live. Getting your website on the first page of Google takes time (it'll take months), commitment and money. Building the site is not the same thing as marketing it. There are hundreds of companies whose sole purpose is to help you market you website. It's not "If we build it, they will come, and throw money at us." For most businesses, it's more like "If we build it, and dedicate effort to keeping it fresh and up to date and interesting, and if we're selling something people really want to buy, and if we think of the web site as only a part of our marketing effort, and if we pay attention to having clean code and optimized pages and tweak our pay-per-click keywords effectively, we should be more successful with a website than without."<br /><br /><strong>7. Maintenance Is A Must</strong><br />I know a lot of developers who do not create maintenance sites for their customers. Whenever the customer needs an update, they have to pay for the developer's services. This nickle-and-diming approach should be avoided. When creating your Project Requirements document, be sure a secure administrative section of your website is developed. Every reasonable feature of your website must be maintainable...meaning products and content, but not the design and most look-and-feel. You also need to have the ability to move your website from one provider to the next without having to contact a developer. All web sites require at least some degree of maintenance. Try to control that maintenance yourself. After a year or two, major changes (i.e. complete website redesign) may be needed.<br /><br /><strong>8. Designers And Developers Are Professionals</strong><br />Many web designers and developers are appalled at assumptions that their skills are basic and valueless. Professional design takes a lot of work, skill, education and ability. Do you think that a professional chef is a person who puts a bunch of ingredients that don't match into a big pan and sticks it in the oven? You should expect to assign one person from your company to interact with the designers and developers. There is nothing that will cause more confusion, anger and disappointment than the fact that one designer has 3 or 4 people calling and e-mailing them every 5 minutes...each person changing what the last person said.<br /><br /><strong>Conclusion<br /></strong>I believe these points are very important. As a developer, I try to have a discussion about these points with all new customers. Almost all "get it" and agree...and it's a pleasure to do business with these people. In fact, if I know they will work this way, I know the process will be faster and easier and, therefore, much more affordable for them. If I know the customer is going to do things the hard way, I will add in the necessary hours to compensate for the extra time needed to complete their project.<br /><br /><strong>Bonus (for Developers): From My Experience...</strong><br />Over the past 10 years, I have built hundreds of websites and still learn new things everyday. Here are some of my practices that allow me to work very fast and efficiently:<br /><br /><ul><i>Design:</i> I used to use graphic artists, but now use templates whenever possible. Why? A custom design costs between $1,000 and $4,000. Professional templates are about $60. Sure, other people can buy these templates too, but for most small-medium businesses, who cares? It's worth saving the thousands of dollars. Also, you get all of the source files, so you can tweak them to make them your own. All you'd have in common with others is the colors/style...it's your own logo and content...change the graphics. My favorite template site: http://www.templatemonster.com <br /><br /><i>Development:</i> I write all code in .NET, C# specifically. The .NET 1.0 platform came out in 2001 and has developed into the most amazing development platform. The set of libraries and namespaces is so large and includes everything you could possibly want to do. .NET is by far the fastest development platform and is the future of software. (Bold, but true statement) When appropriate, use the <a href="http://msdn.microsoft.com/practices/guidetype/AppBlocks/" target="_blank">Microsoft Application Blocks</a>... I use several of them in most of my projects. <br /><br /><i>Development:</i> Build your own library of reusable code. Over the past few years, I have continued to extend my "BrianPautsch" namespace. It contains distinct classes and methods for specific tasks including exception handling, validation, emailing, form helpers, database access, ecommerce, SSL, image handling, captcha, advanced search engines, etc. When I start on a new project, I can complete more than 1/2 the project requirements in less than an hour because of my library of code. <br /><br /><i>Development:</i> Use a code generator. There are a bunch out there, so you don't have to create your own. I created my own a few years ago and use it to generate parts of the Business layer, the Database layer and all related Stored Procedures. Once I have the database schema completed, I can generate code and stored procedures in seconds with just one click. Not only am I saving hours and hours of work (extremely boring work!), but the code is 100% perfect and ready to be used. Now, with my library of code and the code generator, I can have a website 75% complete in only an hour or so. This is how I can create a fully functional ecommerce site in a weekend. <br /><br /><i>Search Engines:</i> Create Google Sitemaps with my Google Sitemap Generator (shameless plug). I have seen websites get into the Google index within 24 hours this way. I have also seen sites already in Google jump in the results by simply creating a Google Sitemap. </ul>]]></description> 
					<pubDate>Wed, 13 Sep 2006 00:29:42 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/9/12/8things/</guid>
				</item>
			
				<item>
					<title>Website Testing Part II - Automation, Autofill, etc. for Frames</title> 
					<link>http://keylimetie.com/blog/2006/8/7/websitetesting2/</link> 
					<description><![CDATA[Back on 3/9/2005, I published a blog titled
<a href="/Blog/2006/3/9/WebsiteTesting/Default.aspx">Website Testing - Automation, Autofill, etc. (C# WinForms)</a>.
Since then, dozens of people have downloaded it and used it successfully to build projects with similar technology.
Today, "Herman" asked how to populate forms, click buttons, etc. in frames. Of course, frames are a big no no, but they do exist.
This blog explains how to do what Herman is asking for.
<br /><br /><a href="/Uploads/73/AutoFillFrames.zip">Download code</a><br /><br />
The only real difference from the previous blog is lines 5-29. In lines 5-14, I iterate through the frames collection and find
the specific frame by name. on line 20, I load that frame into its own IHTMLDocument2 object. And finally, on lines 22-28, I find
the controls and manipulate them. That's it!
<br /><pre style="color: #000000"><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">1</span><span style="color: #008200">//Get the web browser document</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">2</span>myDoc = <span style="color: #0000FF">new</span> HTMLDocumentClass();<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">3</span>myDoc = (HTMLDocument) WebBrowser.Document;<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">4</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">5</span><span style="color: #008200">//Find the frame named <span style="color: #848284">"content"</span></span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">6</span>FramesCollection myFramesColl = myDoc.frames;<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">7</span>IHTMLWindow2 myContentFrame = <span style="color: #0000FF">null</span>;<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">8</span><span style="color: #0000FF">for</span> (<span style="color: #0000FF">int</span> i = 0; i < myFramesColl.length; i++)<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">9</span>{<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">10</span><span style="color: #0000FF">object</span> refIndex = i;<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">11</span>	mshtml.IHTMLWindow2 frame = (mshtml.IHTMLWindow2)myFramesColl.item(<span style="color: #0000FF">ref</span> refIndex);<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">12</span><span style="color: #0000FF">if</span> (frame.name == <span style="color: #848284">"content"</span>)<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">13</span>		myContentFrame = frame;<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">14</span>}<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">15</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">16</span><span style="color: #008200">//Frame found?</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">17</span><span style="color: #0000FF">if</span> (myContentFrame != <span style="color: #0000FF">null</span>)<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">18</span>{<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">19</span><span style="color: #008200">//Load into IHTMLDocument2 object</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">20</span>	IHTMLDocument2 myContentFrameDoc = myContentFrame.document;<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">21</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">22</span><span style="color: #008200">//Find the textbox</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">23</span>	HTMLInputElement objTextBox = (HTMLInputElement) <br />myContentFrameDoc.all.item(<span style="color: #848284">"txtEmail"</span>, 0);<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">24</span>	objTextBox.value = txtEmail.Text;<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">25</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">26</span><span style="color: #008200">//Click the selected button</span><br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">27</span>	HTMLInputElement btnSearch = (HTMLInputElement) <br />myContentFrameDoc.all.item(<span style="color: #848284">"cmdJoin"</span>, 0);<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">28</span>	btnSearch.click();<br /><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">29</span>}</pre>]]></description> 
					<pubDate>Tue, 08 Aug 2006 05:39:13 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/8/7/websitetesting2/</guid>
				</item>
			
				<item>
					<title>How Google Ranks Pages</title> 
					<link>http://keylimetie.com/blog/2006/8/2/howgooglerankspages/</link> 
					<description><![CDATA[From the Stanford archives...
<br /><br /><hr /><br /><br /><center><h2>The Anatomy of a Large-Scale Hypertextual Web Search Engine</h2></center><center><b>Sergey Brin and Lawrence Page</b></center><center>{sergey, page}@cs.stanford.edu</center><center>Computer Science Department, Stanford University, Stanford, CA 94305</center><center><h3>Abstract</h3></center><blockquote>       In this paper, we present Google, a prototype of a large-scale search engine which makes heavy use of the structure present in hypertext. Google is designed to crawl and index the Web efficiently and produce much more satisfying search results than existing systems. The prototype with a full text and hyperlink database of at least 24 million pages is available at <a href="http://google.stanford.edu/">http://google.stanford.edu/</a><br />       To engineer a search engine is a challenging task. Search engines index tens to hundreds of millions of web pages involving a comparable number of distinct terms. They answer tens of millions of queries every day. Despite the importance of large-scale search engines on the web, very little academic research has been done on them. Furthermore, due to rapid advance in technology and web proliferation, creating a web search engine today is very different from three years ago. This paper provides an in-depth description of our large-scale web search engine -- the first such detailed public description we know of to date. <br />       Apart from the problems of scaling traditional search techniques to data of this magnitude, there are new technical challenges involved with using the additional information present in hypertext to produce better search results. This paper addresses this question of how to build a practical large-scale system which can exploit the additional information present in hypertext. Also we look at the problem of how to effectively deal with uncontrolled hypertext collections where anyone can publish anything they want. 
<center><b> Keywords</b>: World Wide Web, Search Engines, Information Retrieval, PageRank, Google</center></blockquote><h2>1. Introduction</h2><i>(Note: There are two versions of this paper -- a longer full version and a shorter printed version. The full version is available on the web and the conference CD-ROM.)</i><br />The web creates new challenges for information retrieval. The amount of information on the web is growing rapidly, as well as the number of new users inexperienced in the art of web research. People are likely to surf the web using its link graph, often starting with high quality human maintained indices such as <a href="http://www.yahoo.com/">Yahoo!</a> or with search engines. Human maintained lists cover popular topics effectively but are subjective, expensive to build and maintain, slow to improve, and cannot cover all esoteric topics. Automated search engines that rely on keyword matching usually return too many low quality matches. To make matters worse, some advertisers attempt to gain people's attention by taking measures meant to mislead automated search engines. We have built a large-scale search engine which addresses many of the problems of existing systems. It makes especially heavy use of the additional structure present in hypertext to provide much higher quality search results. We chose our system name, Google, because it is a common spelling of googol, or 10<sup>100</sup> and fits well with our goal of building very large-scale search engines. 
<h3>1.1 Web Search Engines -- Scaling Up: 1994 - 2000</h3>Search engine technology has had to scale dramatically to keep up with the growth of the web. In 1994, one of the first web search engines, the World Wide Web Worm (WWWW) <a href="http://www.cs.colorado.edu/home/mcbryan/mypapers/www94.ps">[McBryan 94] </a>had an index of 110,000 web pages and web accessible documents. As of November, 1997, the top search engines claim to index from 2 million (WebCrawler) to 100 million web documents (from <a href="http://www.searchenginewatch.com/">Search Engine Watch)</a>. It is foreseeable that by the year 2000, a comprehensive index of the Web will contain over a billion documents. At the same time, the number of queries search engines handle has grown incredibly too. In March and April 1994, the World Wide Web Worm received an average of about 1500 queries per day. In November 1997, Altavista claimed it handled roughly 20 million queries per day. With the increasing number of users on the web, and automated systems which query search engines, it is likely that top search engines will handle hundreds of millions of queries per day by the year 2000. The goal of our system is to address many of the problems, both in quality and scalability, introduced by scaling search engine technology to such extraordinary numbers. 
<h3>1.2. Google: Scaling with the Web</h3>Creating a search engine which scales even to today's web presents many challenges. Fast crawling technology is needed to gather the web documents and keep them up to date. Storage space must be used efficiently to store indices and, optionally, the documents themselves. The indexing system must process hundreds of gigabytes of data efficiently. Queries must be handled quickly, at a rate of hundreds to thousands per second. 
<p>These tasks are becoming increasingly difficult as the Web grows. However, hardware performance and cost have improved dramatically to partially offset the difficulty. There are, however, several notable exceptions to this progress such as disk seek time and operating system robustness. In designing Google, we have considered both the rate of growth of the Web and technological changes. Google is designed to scale well to extremely large data sets. It makes efficient use of storage space to store the index. Its data structures are optimized for fast and efficient access (see section <a href="#data">4.2</a>). Further, we expect that the cost to index and store text or HTML will eventually decline relative to the amount that will be available (see <a href="#b">Appendix B</a>). This will result in favorable scaling properties for centralized systems like Google. 
</p><h3>1.3 Design Goals</h3><h4>1.3.1 Improved Search Quality</h4>Our main goal is to improve the quality of web search engines. In 1994, some people believed that a complete search index would make it possible to find anything easily. According to <a href="http://botw.org/1994/awards/navigators.html">Best of the Web 1994 -- Navigators,</a>  "The best navigation service should make it easy to find almost anything on the Web (once all the data is entered)."  However, the Web of 1997 is quite different. Anyone who has used a search engine recently, can readily testify that the completeness of the index is not the only factor in the quality of search results. "Junk results" often wash out any results that a user is interested in. In fact, as of November 1997, only one of the top four commercial search engines finds itself (returns its own search page in response to its name in the top ten results). One of the main causes of this problem is that the number of documents in the indices has been increasing by many orders of magnitude, but the user's ability to look at documents has not. People are still only willing to look at the first few tens of results. Because of this, as the collection size grows, we need tools that have very high precision (number of relevant documents returned, say in the top tens of results). Indeed, we want our notion of "relevant" to only include the very best documents since there may be tens of thousands of slightly relevant documents. This very high precision is important even at the expense of recall (the total number of relevant documents the system is able to return). There is quite a bit of recent optimism that the use of more hypertextual information can help improve search and other applications [<a href="#ref">Marchiori 97</a>] [<a href="#ref">Spertus 97</a>] [<a href="#ref">Weiss 96</a>] [<a href="#ref">Kleinberg 98</a>]. In particular, link structure [<a href="#ref">Page 98</a>] and link text provide a lot of information for making relevance judgments and quality filtering. Google makes use of both link structure and anchor text (see Sections <a href="#pr">2.1</a> and <a href="#anchor">2.2</a>). 
<h4>1.3.2 Academic Search Engine Research</h4>Aside from tremendous growth, the Web has also become increasingly commercial over time. In 1993, 1.5% of web servers were on .com domains. This number grew to over 60% in 1997. At the same time, search engines have migrated from the academic domain to the commercial. Up until now most search engine development has gone on at companies with little publication of technical details. This causes search engine technology to remain largely a black art and to be advertising oriented (see <a href="#a">Appendix A</a>). With Google, we have a strong goal to push more development and understanding into the academic realm. 
<p>Another important design goal was to build systems that reasonable numbers of people can actually use. Usage was important to us because we think some of the most interesting research will involve leveraging the vast amount of usage data that is available from modern web systems. For example, there are many tens of millions of searches performed every day. However, it is very difficult to get this data, mainly because it is considered commercially valuable. 
</p><p>Our final design goal was to build an architecture that can support novel research activities on large-scale web data. To support novel research uses, Google stores all of the actual documents it crawls in compressed form. One of our main goals in designing Google was to set up an environment where other researchers can come in quickly, process large chunks of the web, and produce interesting results that would have been very difficult to produce otherwise. In the short time the system has been up, there have already been several papers using databases generated by Google, and many others are underway. Another goal we have is to set up a Spacelab-like environment where researchers or even students can propose and do interesting experiments on our large-scale web data. 
</p><h2>2. System Features</h2>The Google search engine has two important features that help it produce high precision results. First, it makes use of the link structure of the Web to calculate a quality ranking for each web page. This ranking is called PageRank and is described in detail in [Page 98]. Second, Google utilizes link to improve search results. 
<h3><a name="pr"></a>2.1 PageRank: Bringing Order to the Web</h3>The citation (link) graph of the web is an important resource that has largely gone unused in existing web search engines. We have created maps containing as many as 518 million of these hyperlinks, a significant sample of the total. These maps allow rapid calculation of a web page's "PageRank", an objective measure of its citation importance that corresponds well with people's subjective idea of importance. Because of this correspondence, PageRank is an excellent way to prioritize the results of web keyword searches. For most popular subjects, a simple text matching search that is restricted to web page titles performs admirably when PageRank prioritizes the results (demo available at <a href="http://google.stanford.edu/">google.stanford.edu</a>). For the type of full text searches in the main Google system, PageRank also helps a great deal. 
<h4>2.1.1 Description of PageRank Calculation</h4>Academic citation literature has been applied to the web, largely by counting citations or backlinks to a given page. This gives some approximation of a page's importance or quality. PageRank extends this idea by not counting links from all pages equally, and by normalizing by the number of links on a page. PageRank is defined as follows: 
<blockquote><i>We assume page A has pages T1...Tn which point to it (i.e., are citations). The parameter d is a damping factor which can be set between 0 and 1. We usually set d to 0.85. There are more details about d in the next section. Also C(A) is defined as the number of links going out of page A. The PageRank of a page A is given as follows:</i><p><i>PR(A) = (1-d) + d (PR(T1)/C(T1) + ... + PR(Tn)/C(Tn))</i></p><p><i>Note that the PageRanks form a probability distribution over web pages, so the sum of all web pages' PageRanks will be one.</i></p></blockquote>PageRank or <i>PR(A) </i>can be calculated using a simple iterative algorithm, and corresponds to the principal eigenvector of the normalized link matrix of the web. Also, a PageRank for 26 million web pages can be computed in a few hours on a medium size workstation. There are many other details which are beyond the scope of this paper. 
<h4>2.1.2 Intuitive Justification</h4>PageRank can be thought of as a model of user behavior. We assume there is a "random surfer" who is given a web page at random and keeps clicking on links, never hitting "back" but eventually gets bored and starts on another random page. The probability that the random surfer visits a page is its PageRank. And, the <i>d</i> damping factor is the probability at each page the "random surfer" will get bored and request another random page. One important variation is to only add the damping factor <i>d</i> to a single page, or a group of pages. This allows for personalization and can make it nearly impossible to deliberately mislead the system in order to get a higher ranking. We have several other extensions to PageRank, again see [<a href="#ref">Page 98</a>]. 
<p>Another intuitive justification is that a page can have a high PageRank if there are many pages that point to it, or if there are some pages that point to it and have a high PageRank. Intuitively, pages that are well cited from many places around the web are worth looking at. Also, pages that have perhaps only one citation from something like the <a href="http://www.yahoo.com/">Yahoo!</a> homepage are also generally worth looking at. If a page was not high quality, or was a broken link, it is quite likely that Yahoo's homepage would not link to it. PageRank handles both these cases and everything in between by recursively propagating weights through the link structure of the web. 
</p><h3><a name="anchor"></a>2.2 Anchor Text</h3>The text of links is treated in a special way in our search engine. Most search engines associate the text of a link with the page that the link is on. In addition, we associate it with the page the link points to. This has several advantages. First, anchors often provide more accurate descriptions of web pages than the pages themselves. Second, anchors may exist for documents which cannot be indexed by a text-based search engine, such as images, programs, and databases. This makes it possible to return web pages which have not actually been crawled. Note that pages that have not been crawled can cause problems, since they are never checked for validity before being returned to the user. In this case, the search engine can even return a page that never actually existed, but had hyperlinks pointing to it. However, it is possible to sort the results, so that this particular problem rarely happens. 
<p>This idea of propagating anchor text to the page it refers to was implemented in the World Wide Web Worm [<a href="#ref">McBryan 94</a>] especially because it helps search non-text information, and expands the search coverage with fewer downloaded documents. We use anchor propagation mostly because anchor text can help provide better quality results. Using anchor text efficiently is technically difficult because of the large amounts of data which must be processed. In our current crawl of 24 million pages, we had over 259 million anchors which we indexed. 
</p><h3>2.3 Other Features</h3>Aside from PageRank and the use of anchor text, Google has several other features. First, it has location information for all hits and so it makes extensive use of proximity in search. Second, Google keeps track of some visual presentation details such as font size of words. Words in a larger or bolder font are weighted higher than other words. Third, full raw HTML of pages is available in a repository. 
<h2>3 Related Work</h2>Search research on the web has a short and concise history. The World Wide Web Worm (WWWW) <a href="http://www.cs.colorado.edu/home/mcbryan/mypapers/www94.ps">[McBryan 94] </a>was one of the first web search engines. It was subsequently followed by several other academic search engines, many of which are now public companies. Compared to the growth of the Web and the importance of search engines there are precious few documents about recent search engines [<a href="http://info.webcrawler.com/bp/WWW94.html">Pinkerton 94</a>]. According to Michael Mauldin (chief scientist, Lycos Inc) <a href="http://www.computer.org/pubs/expert/1997/trends/x1008/mauldin.htm">[Mauldin]</a>, "the various services (including Lycos) closely guard the details of these databases". However, there has been a fair amount of work on specific features of search engines. Especially well represented is work which can get results by post-processing the results of existing commercial search engines, or produce small scale "individualized" search engines. Finally, there has been a lot of research on information retrieval systems, especially on well controlled collections. In the next two sections, we discuss some areas where this research needs to be extended to work better on the web. 
<h3>3.1 Information Retrieval</h3>Work in information retrieval systems goes back many years and is well developed [<a href="#ref">Witten 94</a>]. However, most of the research on information retrieval systems is on small well controlled homogeneous collections such as collections of scientific papers or news stories on a related topic. Indeed, the primary benchmark for information retrieval, the Text Retrieval Conference [<a href="#ref">TREC 96</a>], uses a fairly small, well controlled collection for their benchmarks. The "Very Large Corpus" benchmark is only 20GB compared to the 147GB from our crawl of 24 million web pages. Things that work well on TREC often do not produce good results on the web. For example, the standard vector space model tries to return the document that most closely approximates the query, given that both query and document are vectors defined by their word occurrence. On the web, this strategy often returns very short documents that are the query plus a few words. For example, we have seen a major search engine return a page containing only "Bill Clinton Sucks" and picture from a "Bill Clinton" query. Some argue that on the web, users should specify more accurately what they want and add more words to their query. We disagree vehemently with this position. If a user issues a query like "Bill Clinton" they should get reasonable results since there is a enormous amount of high quality information available on this topic. Given examples like these, we believe that the standard information retrieval work needs to be extended to deal effectively with the web. 
<h3>3.2 Differences Between the Web and Well Controlled Collections</h3>The web is a vast collection of completely uncontrolled heterogeneous documents. Documents on the web have extreme variation internal to the documents, and also in the external meta information that might be available. For example, documents differ internally in their language (both human and programming), vocabulary (email addresses, links, zip codes, phone numbers, product numbers), type or format (text, HTML, PDF, images, sounds), and may even be machine generated (log files or output from a database). On the other hand, we define external meta information as information that can be inferred about a document, but is not contained within it. Examples of external meta information include things like reputation of the source, update frequency, quality, popularity or usage, and citations. Not only are the possible sources of external meta information varied, but the things that are being measured vary many orders of magnitude as well. For example, compare the usage information from a major homepage, like Yahoo's which currently receives millions of page views every day with an obscure historical article which might receive one view every ten years. Clearly, these two items must be treated very differently by a search engine. 
<p>Another big difference between the web and traditional well controlled collections is that there is virtually no control over what people can put on the web. Couple this flexibility to publish anything with the enormous influence of search engines to route traffic and companies which deliberately manipulating search engines for profit become a serious problem. This problem that has not been addressed in traditional closed information retrieval systems. Also, it is interesting to note that metadata efforts have largely failed with web search engines, because any text on the page which is not directly represented to the user is abused to manipulate search engines. There are even numerous companies which specialize in manipulating search engines for profit. 
</p><h2>4 System Anatomy</h2>First, we will provide a high level discussion of the architecture. Then, there is some in-depth descriptions of important data structures. Finally, the major applications: crawling, indexing, and searching will be examined in depth. 
<div align="right"><table cols="1" width="27%" align="right"><tbody><tr><td><center><img height="333" src="/Uploads/72/over.gif" width="299" align="absBottom" /></center><dl><center><dt>Figure 1. High Level Google Architecture</dt></center></dl></td></tr></tbody></table></div>   
<h3>4.1 Google Architecture Overview</h3>In this section, we will give a high level overview of how the whole system works as pictured in Figure 1. Further sections will discuss the applications and data structures not mentioned in this section. Most of Google is implemented in C or C++ for efficiency and can run in either Solaris or Linux. 
<p>In Google, the web crawling (downloading of web pages) is done by several distributed crawlers. There is a URLserver that sends lists of URLs to be fetched to the crawlers. The web pages that are fetched are then sent to the storeserver. The storeserver then compresses and stores the web pages into a repository. Every web page has an associated ID number called a docID which is assigned whenever a new URL is parsed out of a web page. The indexing function is performed by the indexer and the sorter. The indexer performs a number of functions. It reads the repository, uncompresses the documents, and parses them. Each document is converted into a set of word occurrences called hits. The hits record the word, position in document, an approximation of font size, and capitalization. The indexer distributes these hits into a set of "barrels", creating a partially sorted forward index. The indexer performs another important function. It parses out all the links in every web page and stores important information about them in an anchors file. This file contains enough information to determine where each link points from and to, and the text of the link. 
</p><p>The URLresolver reads the anchors file and converts relative URLs into absolute URLs and in turn into docIDs. It puts the anchor text into the forward index, associated with the docID that the anchor points to. It also generates a database of links which are pairs of docIDs. The links database is used to compute PageRanks for all the documents. 
</p><p>The sorter takes the barrels, which are sorted by docID (this is a simplification, see <a href="#hits">Section 4.2.5</a>), and resorts them by wordID to generate the inverted index. This is done in place so that little temporary space is needed for this operation. The sorter also produces a list of wordIDs and offsets into the inverted index. A program called DumpLexicon takes this list together with the lexicon produced by the indexer and generates a new lexicon to be used by the searcher. The searcher is run by a web server and uses the lexicon built by DumpLexicon together with the inverted index and the PageRanks to answer queries. 
</p><h3><a name="data"></a>4.2 Major Data Structures</h3>Google's data structures are optimized so that a large document collection can be crawled, indexed, and searched with little cost. Although, CPUs and bulk input output rates have improved dramatically over the years, a disk seek still requires about 10 ms to complete. Google is designed to avoid disk seeks whenever possible, and this has had a considerable influence on the design of the data structures. 
<h4>4.2.1 BigFiles</h4>BigFiles are virtual files spanning multiple file systems and are addressable by 64 bit integers. The allocation among multiple file systems is handled automatically. The BigFiles package also handles allocation and deallocation of file descriptors, since the operating systems do not provide enough for our needs. BigFiles also support rudimentary compression options. 
<h4>4.2.2 Repository</h4>   
<div align="right"><table cols="1" width="27%" align="right"><tbody><tr><td><center><img height="103" src="/Uploads/72/repos.gif" width="283" /></center><dl><center><dt>Figure 2. Repository Data Structure</dt></center></dl></td></tr></tbody></table></div>The repository contains the full HTML of every web page. Each page is compressed using zlib (see <a href="ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html">RFC1950</a>). The choice of compression technique is a tradeoff between speed and compression ratio. We chose zlib's speed over a significant improvement in compression offered by <a href="http://www.muraroa.demon.co.uk/">bzip</a>. The compression rate of bzip was approximately 4 to 1 on the repository as compared to zlib's 3 to 1 compression. In the repository, the documents are stored one after the other and are prefixed by docID, length, and URL as can be seen in Figure 2. The repository requires no other data structures to be used in order to access it. This helps with data consistency and makes development much easier; we can rebuild all the other data structures from only the repository and a file which lists crawler errors. 
<h4>4.2.3 Document Index</h4>The document index keeps information about each document. It is a fixed width ISAM (Index sequential access mode) index, ordered by docID. The information stored in each entry includes the current document status, a pointer into the repository, a document checksum, and various statistics. If the document has been crawled, it also contains a pointer into a variable width file called docinfo which contains its URL and title. Otherwise the pointer points into the URLlist which contains just the URL. This design decision was driven by the desire to have a reasonably compact data structure, and the ability to fetch a record in one disk seek during a search 
<p>Additionally, there is a file which is used to convert URLs into docIDs. It is a list of URL checksums with their corresponding docIDs and is sorted by checksum. In order to find the docID of a particular URL, the URL's checksum is computed and a binary search is performed on the checksums file to find its docID. URLs may be converted into docIDs in batch by doing a merge with this file. This is the technique the URLresolver uses to turn URLs into docIDs. This batch mode of update is crucial because otherwise we must perform one seek for every link which assuming one disk would take more than a month for our 322 million link dataset. 
</p><h4>4.2.4 Lexicon</h4>The lexicon has several different forms. One important change from earlier systems is that the lexicon can fit in memory for a reasonable price. In the current implementation we can keep the lexicon in memory on a machine with 256 MB of main memory. The current lexicon contains 14 million words (though some rare words were not added to the lexicon). It is implemented in two parts -- a list of the words (concatenated together but separated by nulls) and a hash table of pointers. For various functions, the list of words has some auxiliary information which is beyond the scope of this paper to explain fully. 
<h4><a name="hits"></a>4.2.5 Hit Lists</h4>A hit list corresponds to a list of occurrences of a particular word in a particular document including position, font, and capitalization information. Hit lists account for most of the space used in both the forward and the inverted indices. Because of this, it is important to represent them as efficiently as possible. We considered several alternatives for encoding position, font, and capitalization -- simple encoding (a triple of integers), a compact encoding (a hand optimized allocation of bits), and Huffman coding. In the end we chose a hand optimized compact encoding since it required far less space than the simple encoding and far less bit manipulation than Huffman coding. The details of the hits are shown in Figure 3. 
<p>Our compact encoding uses two bytes for every hit. There are two types of hits: fancy hits and plain hits. Fancy hits include hits occurring in a URL, title, anchor text, or meta tag. Plain hits include everything else. A plain hit consists of a capitalization bit, font size, and 12 bits of word position in a document (all positions higher than 4095 are labeled 4096). Font size is represented relative to the rest of the document using three bits (only 7 values are actually used because 111 is the flag that signals a fancy hit). A fancy hit consists of a capitalization bit, the font size set to 7 to indicate it is a fancy hit, 4 bits to encode the type of fancy hit, and 8 bits of position. For anchor hits, the 8 bits of position are split into 4 bits for position in anchor and 4 bits for a hash of the docID the anchor occurs in. This gives us some limited phrase searching as long as there are not that many anchors for a particular word. We expect to update the way that anchor hits are stored to allow for greater resolution in the position and docIDhash fields. We use font size relative to the rest of the document because when searching, you do not want to rank otherwise identical documents differently just because one of the documents is in a larger font. 
</p><div align="right"><table cols="1" width="27%" align="right"><tbody><tr><td><center><img height="293" src="/Uploads/72/barrels.gif" width="294" /></center><dl><center><dt>Figure 3. Forward and Reverse Indexes and the Lexicon</dt></center></dl></td></tr></tbody></table></div>  
<p>The length of a hit list is stored before the hits themselves. To save space, the length of the hit list is combined with the wordID in the forward index and the docID in the inverted index. This limits it to 8 and 5 bits respectively (there are some tricks which allow 8 bits to be borrowed from the wordID). If the length is longer than would fit in that many bits, an escape code is used in those bits, and the next two bytes contain the actual length. 
</p><h4>4.2.6 Forward Index</h4>The forward index is actually already partially sorted. It is stored in a number of barrels (we used 64). Each barrel holds a range of wordID's. If a document contains words that fall into a particular barrel, the docID is recorded into the barrel, followed by a list of wordID's with hitlists which correspond to those words. This scheme requires slightly more storage because of duplicated docIDs but the difference is very small for a reasonable number of buckets and saves considerable time and coding complexity in the final indexing phase done by the sorter. Furthermore, instead of storing actual wordID's, we store each wordID as a relative difference from the minimum wordID that falls into the barrel the wordID is in. This way, we can use just 24 bits for the wordID's in the unsorted barrels, leaving 8 bits for the hit list length. 
<h4>4.2.7 Inverted Index</h4>The inverted index consists of the same barrels as the forward index, except that they have been processed by the sorter. For every valid wordID, the lexicon contains a pointer into the barrel that wordID falls into. It points to a doclist of docID's together with their corresponding hit lists. This doclist represents all the occurrences of that word in all documents. 
<p>An important issue is in what order the docID's should appear in the doclist. One simple solution is to store them sorted by docID. This allows for quick merging of different doclists for multiple word queries. Another option is to store them sorted by a ranking of the occurrence of the word in each document. This makes answering one word queries trivial and makes it likely that the answers to multiple word queries are near the start. However, merging is much more difficult. Also, this makes development much more difficult in that a change to the ranking function requires a rebuild of the index. We chose a compromise between these options, keeping two sets of inverted barrels -- one set for hit lists which include title or anchor hits and another set for all hit lists. This way, we check the first set of barrels first and if there are not enough matches within those barrels we check the larger ones. 
</p><h3>4.3 Crawling the Web</h3>Running a web crawler is a challenging task. There are tricky performance and reliability issues and even more importantly, there are social issues. Crawling is the most fragile application since it involves interacting with hundreds of thousands of web servers and various name servers which are all beyond the control of the system. 
<p>In order to scale to hundreds of millions of web pages, Google has a fast distributed crawling system. A single URLserver serves lists of URLs to a number of crawlers (we typically ran about 3). Both the URLserver and the crawlers are implemented in Python. Each crawler keeps roughly 300 connections open at once. This is necessary to retrieve web pages at a fast enough pace. At peak speeds, the system can crawl over 100 web pages per second using four crawlers. This amounts to roughly 600K per second of data. A major performance stress is DNS lookup. Each crawler maintains a its own DNS cache so it does not need to do a DNS lookup before crawling each document. Each of the hundreds of connections can be in a number of different states: looking up DNS, connecting to host, sending request, and receiving response. These factors make the crawler a complex component of the system. It uses asynchronous IO to manage events, and a number of queues to move page fetches from state to state. 
</p><p>It turns out that running a crawler which connects to more than half a million servers, and generates tens of millions of log entries generates a fair amount of email and phone calls. Because of the vast number of people coming on line, there are always those who do not know what a crawler is, because this is the first one they have seen. Almost daily, we receive an email something like, "Wow, you looked at a lot of pages from my web site. How did you like it?" There are also some people who do not know about the <a href="http://info.webcrawler.com/mak/projects/robots/norobots.html">robots exclusion protocol</a>, and think their page should be protected from indexing by a statement like, "This page is copyrighted and should not be indexed", which needless to say is difficult for web crawlers to understand. Also, because of the huge amount of data involved, unexpected things will happen. For example, our system tried to crawl an online game. This resulted in lots of garbage messages in the middle of their game! It turns out this was an easy problem to fix. But this problem had not come up until we had downloaded tens of millions of pages. Because of the immense variation in web pages and servers, it is virtually impossible to test a crawler without running it on large part of the Internet. Invariably, there are hundreds of obscure problems which may only occur on one page out of the whole web and cause the crawler to crash, or worse, cause unpredictable or incorrect behavior. Systems which access large parts of the Internet need to be designed to be very robust and carefully tested. Since large complex systems such as crawlers will invariably cause problems, there needs to be significant resources devoted to reading the email and solving these problems as they come up. 
</p><h3>4.4 Indexing the Web</h3><ul><li><b>Parsing -- </b>Any parser which is designed to run on the entire Web must handle a huge array of possible errors. These range from typos in HTML tags to kilobytes of zeros in the middle of a tag, non-ASCII characters, HTML tags nested hundreds deep, and a great variety of other errors that challenge anyone's imagination to come up with equally creative ones. For maximum speed, instead of using YACC to generate a CFG parser, we use flex to generate a lexical analyzer which we outfit with its own stack. Developing this parser which runs at a reasonable speed and is very robust involved a fair amount of work. 
</li><li><b>Indexing</b><b>Documents into Barrels -- </b>After each document is parsed, it is encoded into a number of barrels. Every word is converted into a wordID by using an in-memory hash table -- the lexicon. New additions to the lexicon hash table are logged to a file. Once the words are converted into wordID's, their occurrences in the current document are translated into hit lists and are written into the forward barrels. The main difficulty with parallelization of the indexing phase is that the lexicon needs to be shared. Instead of sharing the lexicon, we took the approach of writing a log of all the extra words that were not in a base lexicon, which we fixed at 14 million words. That way multiple indexers can run in parallel and then the small log file of extra words can be processed by one final indexer. 
</li><li><b>Sorting</b> -- In order to generate the inverted index, the sorter takes each of the forward barrels and sorts it by wordID to produce an inverted barrel for title and anchor hits and a full text inverted barrel. This process happens one barrel at a time, thus requiring little temporary storage. Also, we parallelize the sorting phase to use as many machines as we have simply by running multiple sorters, which can process different buckets at the same time. Since the barrels don't fit into main memory, the sorter further subdivides them into baskets which do fit into memory based on wordID and docID. Then the sorter, loads each basket into memory, sorts it and writes its contents into the short inverted barrel and the full inverted barrel. </li></ul><h3>4.5 Searching</h3>The goal of searching is to provide quality search results efficiently. Many of the large commercial search engines seemed to have made great progress in terms of efficiency. Therefore, we have focused more on quality of search in our research, although we believe our solutions are scalable to commercial volumes with a bit more effort. The google query evaluation process is show in Figure 4. 
<div align="right"><table cols="1" width="41%" align="right" border="2"><tbody><tr><td><ol><li>Parse the query. 
</li><li>Convert words into wordIDs. 
</li><li>Seek to the start of the doclist in the short barrel for every word. 
</li><li>Scan through the doclists until there is a document that matches all the search terms. 
</li><li>Compute the rank of that document for the query. 
</li><li>If we are in the short barrels and at the end of any doclist, seek to the start of the doclist in the full barrel for every word and go to step 4. 
</li><li>If we are not at the end of any doclist go to step 4. <br />Sort the documents that have matched by rank and return the top k.</li></ol><dl><center><dt>Figure 4. Google Query Evaluation</dt></center></dl></td></tr></tbody></table></div>  
<p>To put a limit on response time, once a certain number (currently 40,000) of matching documents are found, the searcher automatically goes to step 8 in Figure 4. This means that it is possible that sub-optimal results would be returned. We are currently investigating other ways to solve this problem. In the past, we sorted the hits according to PageRank, which seemed to improve the situation. 
</p><h4>4.5.1 The Ranking System</h4>Google maintains much more information about web documents than typical search engines. Every hitlist includes position, font, and capitalization information. Additionally, we factor in hits from anchor text and the PageRank of the document. Combining all of this information into a rank is difficult. We designed our ranking function so that no particular factor can have too much influence. First, consider the simplest case -- a single word query. In order to rank a document with a single word query, Google looks at that document's hit list for that word. Google considers each hit to be one of several different types (title, anchor, URL, plain text large font, plain text small font, ...), each of which has its own type-weight. The type-weights make up a vector indexed by type. Google counts the number of hits of each type in the hit list. Then every count is converted into a count-weight. Count-weights increase linearly with counts at first but quickly taper off so that more than a certain count will not help. We take the dot product of the vector of count-weights with the vector of type-weights to compute an IR score for the document. Finally, the IR score is combined with PageRank to give a final rank to the document. 
<p>For a multi-word search, the situation is more complicated. Now multiple hit lists must be scanned through at once so that hits occurring close together in a document are weighted higher than hits occurring far apart. The hits from the multiple hit lists are matched up so that nearby hits are matched together. For every matched set of hits, a proximity is computed. The proximity is based on how far apart the hits are in the document (or anchor) but is classified into 10 different value "bins" ranging from a phrase match to "not even close". Counts are computed not only for every type of hit but for every type and proximity. Every type and proximity pair has a type-prox-weight. The counts are converted into count-weights and we take the dot product of the count-weights and the type-prox-weights to compute an IR score. All of these numbers and matrices can all be displayed with the search results using a special debug mode. These displays have been very helpful in developing the ranking system. 
</p><h4>4.5.2 Feedback</h4>The ranking function has many parameters like the type-weights and the type-prox-weights. Figuring out the right values for these parameters is something of a black art. In order to do this, we have a user feedback mechanism in the search engine. A trusted user may optionally evaluate all of the results that are returned. This feedback is saved. Then when we modify the ranking function, we can see the impact of this change on all previous searches which were ranked. Although far from perfect, this gives us some idea of how a change in the ranking function affects the search results. 
<h2>5 Results and Performance</h2>   
<div align="right"><table cols="1" width="420" align="right" border="2"><tbody><tr><td><b>Query: bill clinton</b><br /><font size="-1"><a href="http://www.whitehouse.gov/">http://www.whitehouse.gov/</a> </font>  <br /><font size="-1">100.00% <img height="5" src="/Uploads/72/red.gif" width="49" /><img height="5" src="/Uploads/72/white.gif" width="1" /> (no date) (0K) </font>  <br /><font size="-1">http://www.whitehouse.gov/ </font>  <br />      <font size="-1"><a href="http://www.whitehouse.gov/WH/EOP/OP/html/OP_Home.html">Office of the President</a> </font>  <br /><font size="-1">        99.67%<img height="5" src="/Uploads/72/red.gif" width="49" /><img height="5" src="/Uploads/72/white.gif" width="1" /> (Dec 23 1996) (2K)  </font>  <br /><font size="-1">        http://www.whitehouse.gov/WH/EOP/OP/html/OP_Home.html</font>  <br /><font size="-1"> </font>     <font size="-1"><a href="http://www.whitehouse.gov/WH/Welcome.html">Welcome To The White House</a> </font>  <br /><font size="-1">        99.98% <img height="5" src="/Uploads/72/red.gif" width="49" /><img height="5" src="/Uploads/72/white.gif" width="1" /> (Nov 09 1997) (5K)</font>  <br /><font size="-1">        http://www.whitehouse.gov/WH/Welcome.html  </font>  <br /><font size="-1"> </font>     <font size="-1"><a href="http://www.whitehouse.gov/WH/Mail/html/Mail_President.html">Send Electronic Mail to the President</a> </font>  <br /><font size="-1">        99.86% <img height="5" src="/Uploads/72/red.gif" width="49" /><img height="5" src="/Uploads/72/white.gif" width="1" /> (Jul 14 1997) (5K)  </font>  <br /><font size="-1">        http://www.whitehouse.gov/WH/Mail/html/Mail_President.html </font>  <br /><font size="-1"><a href="mailto:president@whitehouse.gov">mailto:president@whitehouse.gov</a> </font>  <br /><font size="-1">99.98% <img height="5" src="/Uploads/72/red.gif" width="49" /><img height="5" src="/Uploads/72/white.gif" width="1" /> </font>  <br /><font size="-1"> </font>     <font size="-1"><a href="mailto:President@whitehouse.gov">mailto:President@whitehouse.gov</a> </font>  <br /><font size="-1">        99.27% <img height="5" src="/Uploads/72/red.gif" width="49" /><img height="5" src="/Uploads/72/white.gif" width="1" /> </font>  <br /><font size="-1"><a href="http://zpub.com/un/un-bc.html">The "Unofficial" Bill Clinton </a> </font>  <br /><font size="-1">94.06%<img height="5" src="/Uploads/72/red.gif" width="47" /><img height="5" src="/Uploads/72/white.gif" width="3" /> (Nov 11 1997) (14K) </font>  <br /><font size="-1">http://zpub.com/un/un-bc.html </font>  <br /><font size="-1"> </font>      <font size="-1"><a href="http://zpub.com/un/un-bc9.html">Bill Clinton Meets The Shrinks </a> </font>  <br /><font size="-1">         86.27% <img height="5" src="/Uploads/72/red.gif" width="43" /><img height="5" src="/Uploads/72/white.gif" width="7" /> (Jun 29 1997) (63K)  </font>  <br /><font size="-1">         http://zpub.com/un/un-bc9.html </font>  <br /><font size="-1"><a href="http://www.realchange.org/clinton.htm">President Bill Clinton - The Dark Side</a> </font>  <br /><font size="-1">97.27% <img height="5" src="/Uploads/72/red.gif" width="48" /><img height="5" src="/Uploads/72/white.gif" width="2" /> (Nov 10 1997) (15K) </font>  <br /><font size="-1">http://www.realchange.org/clinton.htm </font>  <br /><font size="-1"><a href="http://www.gatewy.net/~tjohnson/clinton1.html">$3 Bill Clinton</a> </font>  <br /><font size="-1">94.73% <img height="5" src="/Uploads/72/red.gif" width="47" /><img height="5" src="/Uploads/72/white.gif" width="3" /> (no date) (4K) http://www.gatewy.net/~tjohnson/clinton1.html </font>  
<dl><center><dt>Figure 4. Sample Results from Google</dt></center></dl></td></tr></tbody></table></div>The most important measure of a search engine is the quality of its search results. While a complete user evaluation is beyond the scope of this paper, our own experience with Google has shown it to produce better results than the major commercial search engines for most searches. As an example which illustrates the use of PageRank, anchor text, and proximity, Figure 4 shows Google's results for a search on "bill clinton". These results demonstrates some of Google's features. The results are clustered by server. This helps considerably when sifting through result sets. A number of results are from the whitehouse.gov domain which is what one may reasonably expect from such a search. Currently, most major commercial search engines do not return any results from whitehouse.gov, much less the right ones. Notice that there is no title for the first result. This is because it was not crawled. Instead, Google relied on anchor text to determine this was a good answer to the query. Similarly, the fifth result is an email address which, of course, is not crawlable. It is also a result of anchor text. 
<p>All of the results are reasonably high quality pages and, at last check, none were broken links. This is largely because they all have high PageRank. The PageRanks are the percentages in red along with bar graphs. Finally, there are no results about a Bill other than Clinton or about a Clinton other than Bill. This is because we place heavy importance on the proximity of word occurrences. Of course a true test of the quality of a search engine would involve an extensive user study or results analysis which we do not have room for here. Instead, we invite the reader to try Google for themselves at <a href="http://google.stanford.edu">http://google.stanford.edu</a>. 
</p><h3>5.1 Storage Requirements</h3>Aside from search quality, Google is designed to scale cost effectively to the size of the Web as it grows. One aspect of this is to use storage efficiently. Table 1 has a breakdown of some statistics and storage requirements of Google. Due to compression the total size of the repository is about 53 GB, just over one third of the total data it stores. At current disk prices this makes the repository a relatively cheap source of useful data. More importantly, the total of all the data used by the search engine requires a comparable amount of storage, about 55 GB. Furthermore, most queries can be answered using just the short inverted index. With better encoding and compression of the Document Index, a high quality web search engine may fit onto a 7GB drive of a new PC. <br />   
<div align="right"><table cols="1" width="290" align="right"><tbody><tr align="right"><td align="right" width="100%"><table align="right" border="2"><tbody><tr><th colspan="2"><center>Storage Statistics</center></th></tr><tr><td>Total Size of Fetched Pages</td><td>147.8 GB</td></tr><tr><td>Compressed Repository</td><td>53.5 GB</td></tr><tr><td>Short Inverted Index</td><td>4.1 GB</td></tr><tr><td>Full Inverted Index</td><td>37.2 GB</td></tr><tr><td>Lexicon</td><td>293 MB</td></tr><tr><td>Temporary Anchor Data  <br />(not in total)</td><td>6.6 GB</td></tr><tr><td>Document Index Incl.  <br />Variable Width Data</td><td>9.7 GB</td></tr><tr><td>Links Database</td><td>3.9 GB</td></tr><tr><th>Total Without Repository</th><th>55.2 GB</th></tr><tr><th>Total With Repository</th><th>108.7 GB</th></tr></tbody></table><center> </center></td></tr><tr><td align="right"><table align="left" border="2"><tbody><tr><th colspan="2">Web Page Statistics</th></tr><tr><td>Number of Web Pages Fetched</td><td>24 million</td></tr><tr><td>Number of Urls Seen</td><td>76.5 million</td></tr><tr><td>Number of Email Addresses</td><td>1.7 million</td></tr><tr><td>Number of 404's</td><td>1.6 million</td></tr></tbody></table> </td></tr><tr><td><center>Table 1. Statistics</center></td></tr></tbody></table></div>   
<h3> 5.2 System Performance</h3>It is important for a search engine to crawl and index efficiently. This way information can be kept up to date and major changes to the system can be tested relatively quickly. For Google, the major operations are Crawling, Indexing, and Sorting. It is difficult to measure how long crawling took overall because disks filled up, name servers crashed, or any number of other problems which stopped the system. In total it took roughly 9 days to download the 26 million pages (including errors). However, once the system was running smoothly, it ran much faster, downloading the last 11 million pages in just 63 hours, averaging just over 4 million pages per day or 48.5 pages per second. We ran the indexer and the crawler simultaneously. The indexer ran just faster than the crawlers. This is largely because we spent just enough time optimizing the indexer so that it would not be a bottleneck. These optimizations included bulk updates to the document index and placement of critical data structures on the local disk. The indexer runs at roughly 54 pages per second. The sorters can be run completely in parallel; using four machines, the whole process of sorting takes about 24 hours. 
<h3>5.3 Search Performance</h3>Improving the performance of search was not the major focus of our research up to this point. The current version of Google answers most queries in between 1 and 10 seconds. This time is mostly dominated by disk IO over NFS (since disks are spread over a number of machines). Furthermore, Google does not have any optimizations such as query caching, subindices on common terms, and other common optimizations. We intend to speed up Google considerably through distribution and hardware, software, and algorithmic improvements. Our target is to be able to handle several hundred queries per second. Table 2 has some sample query times from the current version of Google. They are repeated to show the speedups resulting from cached IO. 
<div align="right"><table width="350" align="right"><tbody><tr><td><center><table width="54%" align="right" border="2"><tbody><tr><td> </td><td colspan="2"><b>Initial Query</b></td><td colspan="2"><b>Same Query Repeated (IO mostly cached) </b></td></tr><tr><th><b>Query</b></th><th><b>CPU Time(s)</b></th><th><b>Total Time(s)</b></th><td><b>CPU Time(s)</b></td><td><b>Total Time(s)</b></td></tr><tr><td>al gore</td><td>0.09</td><td>2.13</td><td>0.06</td><td>0.06</td></tr><tr><td>vice president</td><td>1.77</td><td>3.84</td><td>1.66</td><td>1.80</td></tr><tr><td>hard disks</td><td>0.25</td><td>4.86</td><td>0.20</td><td>0.24</td></tr><tr><td>search engines</td><td>1.31</td><td>9.63</td><td>1.16</td><td>1.16</td></tr></tbody></table></center> </td></tr><tr><td colspan="2"><center>Table 2. Search Times</center></td></tr></tbody></table></div>   
<h2>6 Conclusions</h2>Google is designed to be a scalable search engine. The primary goal is to provide high quality search results over a rapidly growing World Wide Web. Google employs a number of techniques to improve search quality including page rank, anchor text, and proximity information. Furthermore, Google is a complete architecture for gathering web pages, indexing them, and performing search queries over them. 
<h3>6.1 Future Work</h3>A large-scale web search engine is a complex system and much remains to be done. Our immediate goals are to improve search efficiency and to scale to approximately 100 million web pages. Some simple improvements to efficiency include query caching, smart disk allocation, and subindices. Another area which requires much research is updates. We must have smart algorithms to decide what old web pages should be recrawled and what new ones should be crawled. Work toward this goal has been done in [<a href="#ref">Cho 98</a>]. One promising area of research is using proxy caches to build search databases, since they are demand driven. We are planning to add simple features supported by commercial search engines like boolean operators, negation, and stemming. However, other features are just starting to be explored such as relevance feedback and clustering (Google currently supports a simple hostname based clustering). We also plan to support user context (like the user's location), and result summarization. We are also working to extend the use of link structure and link text. Simple experiments indicate PageRank can be personalized by increasing the weight of a user's home page or bookmarks. As for link text, we are experimenting with using text surrounding links in addition to the link text itself. A Web search engine is a very rich environment for research ideas. We have far too many to list here so we do not expect this Future Work section to become much shorter in the near future. 
<h3>6.2 High Quality Search</h3>The biggest problem facing users of web search engines today is the quality of the results they get back. While the results are often amusing and expand users' horizons, they are often frustrating and consume precious time. For example, the top result for a search for "Bill Clinton" on one of the most popular commercial search engines was the <a href="http://www.io.com/~cjburke/clinton/970414.html">Bill Clinton Joke of the Day: April 14, 1997</a>. Google is designed to provide higher quality search so as the Web continues to grow rapidly, information can be found easily. In order to accomplish this Google makes heavy use of hypertextual information consisting of link structure and link (anchor) text. Google also uses proximity and font information. While evaluation of a search engine is difficult, we have subjectively found that Google returns higher quality search results than current commercial search engines. The analysis of link structure via PageRank allows Google to evaluate the quality of web pages. The use of link text as a description of what the link points to helps the search engine return relevant (and to some degree high quality) results. Finally, the use of proximity information helps increase relevance a great deal for many queries. 
<h3>6.3 Scalable Architecture</h3>Aside from the quality of search, Google is designed to scale. It must be efficient in both space and time, and constant factors are very important when dealing with the entire Web. In implementing Google, we have seen bottlenecks in CPU, memory access, memory capacity, disk seeks, disk throughput, disk capacity, and network IO. Google has evolved to overcome a number of these bottlenecks during various operations. Google's major data structures make efficient use of available storage space. Furthermore, the crawling, indexing, and sorting operations are efficient enough to be able to build an index of a substantial portion of the web -- 24 million pages, in less than one week. We expect to be able to build an index of 100 million pages in less than a month. 
<h3>6.4 A Research Tool</h3>In addition to being a high quality search engine, Google is a research tool. The data Google has collected has already resulted in many other papers submitted to conferences and many more on the way. Recent research such as [<a href="#ref">Abiteboul 97</a>] has shown a number of limitations to queries about the Web that may be answered without having the Web available locally. This means that Google (or a similar system) is not only a valuable research tool but a necessary one for a wide range of applications. We hope Google will be a resource for searchers and researchers all around the world and will spark the next generation of search engine technology. 
<h2>7 Acknowledgments</h2>Scott Hassan and Alan Steremberg have been critical to the development of Google. Their talented contributions are irreplaceable, and the authors owe them much gratitude. We would also like to thank Hector Garcia-Molina, Rajeev Motwani, Jeff Ullman, and Terry Winograd and the whole WebBase group for their support and insightful discussions. Finally we would like to recognize the generous support of our equipment donors IBM, Intel, and Sun and our funders. The research described here was conducted as part of the Stanford Integrated Digital Library Project, supported by the National Science Foundation under Cooperative Agreement IRI-9411306. Funding for this cooperative agreement is also provided by DARPA and NASA, and by Interval Research, and the industrial partners of the Stanford Digital Libraries Project. 
<h2>References</h2><ul><li>Best of the Web 1994 -- Navigators <a href="http://botw.org/1994/awards/navigators.html">http://botw.org/1994/awards/navigators.html</a></li><li>Bill Clinton Joke of the Day: April 14, 1997. <a href="http://www.io.com/~cjburke/clinton/970414.html">http://www.io.com/~cjburke/clinton/970414.html</a></li><li>Bzip2 Homepage <a href="http://www.muraroa.demon.co.uk/">http://www.muraroa.demon.co.uk/</a></li><li>Google Search Engine <a href="http://google.stanford.edu">http://google.stanford.edu</a></li><li>Harvest <a href="http://harvest.transarc.com/">http://harvest.transarc.com/</a></li><li>Mauldin, Michael L. Lycos Design Choices in an Internet Search Service, IEEE Expert Interview <a href="http://www.computer.org/pubs/expert/1997/trends/x1008/mauldin.htm">http://www.computer.org/pubs/expert/1997/trends/x1008/mauldin.htm</a></li><li>The Effect of Cellular Phone Use Upon Driver Attention <a href="http://www.webfirst.com/aaa/text/cell/cell0toc.htm">http://www.webfirst.com/aaa/text/cell/cell0toc.htm</a></li><li>Search Engine Watch <a href="http://www.searchenginewatch.com/">http://www.searchenginewatch.com/</a></li><li>RFC 1950 (zlib) <a href="ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html">ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html</a></li><li>Robots Exclusion Protocol: <a href="http://info.webcrawler.com/mak/projects/robots/exclusion.html">http://info.webcrawler.com/mak/projects/robots/exclusion.html</a></li><li>Web Growth Summary: <a href="http://www.mit.edu/people/mkgray/net/web-growth-summary.html">http://www.mit.edu/people/mkgray/net/web-growth-summary.html</a></li><li>Yahoo! <a href="http://www.yahoo.com/">http://www.yahoo.com/</a><a name="ref"></a></li></ul><ul><li>[Abiteboul 97] Serge Abiteboul and Victor Vianu, <i>Queries and Computation on the Web</i>. Proceedings of the International Conference on Database Theory. Delphi, Greece 1997. 
</li><li>[Bagdikian 97] Ben H. Bagdikian. <i>The Media Monopoly</i>. 5th Edition. Publisher: Beacon, ISBN: 0807061557 
</li><li>[Chakrabarti 98] S.Chakrabarti, B.Dom, D.Gibson, J.Kleinberg, P. Raghavan and S. Rajagopalan. <i>Automatic Resource Compilation by Analyzing Hyperlink Structure and Associated Text.</i> Seventh International Web Conference (WWW 98). Brisbane, Australia, April 14-18, 1998. 
</li><li>[Cho 98] Junghoo Cho, Hector Garcia-Molina, Lawrence Page. <i>Efficient Crawling Through URL Ordering.</i> Seventh International Web Conference (WWW 98). Brisbane, Australia, April 14-18, 1998. 
</li><li>[Gravano 94] Luis Gravano, Hector Garcia-Molina, and A. Tomasic. <i>The Effectiveness of GlOSS for the Text-Database Discovery Problem.</i> Proc. of the 1994 ACM SIGMOD International Conference On Management Of Data, 1994. 
</li><li>[Kleinberg 98] Jon Kleinberg, <i>Authoritative Sources in a Hyperlinked Environment</i>, Proc. ACM-SIAM Symposium on Discrete Algorithms, 1998. 
</li><li>[Marchiori 97] Massimo Marchiori. <i>The Quest for Correct Information on the Web: Hyper Search Engines.</i> The Sixth International WWW Conference (WWW 97). Santa Clara, USA, April 7-11, 1997. 
</li><li>[McBryan 94] Oliver A. McBryan. GENVL and <i>WWWW: Tools for Taming the Web. First International Conference on the World Wide Web. </i>CERN, Geneva (Switzerland), May 25-26-27 1994. <a href="http://www.cs.colorado.edu/home/mcbryan/mypapers/www94.ps">http://www.cs.colorado.edu/home/mcbryan/mypapers/www94.ps</a></li><li>[Page 98] Lawrence Page, Sergey Brin, Rajeev Motwani, Terry Winograd. <i>The PageRank Citation Ranking: Bringing Order to the Web. </i>Manuscript in progress. <a href="http://google.stanford.edu/~backrub/pageranksub.ps">http://google.stanford.edu/~backrub/pageranksub.ps</a></li><li>[Pinkerton 94] Brian Pinkerton, <i>Finding What People Want: Experiences with the WebCrawler. </i>The Second International WWW Conference Chicago, USA, October 17-20, 1994. <a href="http://info.webcrawler.com/bp/WWW94.html">http://info.webcrawler.com/bp/WWW94.html</a></li><li>[Spertus 97] Ellen Spertus. <i>ParaSite: Mining Structural Information on the Web. </i>The Sixth International WWW Conference (WWW 97). Santa Clara, USA, April 7-11, 1997. 
</li><li>[TREC 96] <i>Proceedings of the fifth Text REtrieval Conference (TREC-5). </i>Gaithersburg, Maryland, November 20-22, 1996. Publisher: Department of Commerce, National Institute of Standards and Technology. Editors: D. K. Harman and E. M. Voorhees. Full text at: <a href="http://trec.nist.gov/">http://trec.nist.gov/</a></li><li>[Witten 94] Ian H Witten, Alistair Moffat, and Timothy C. Bell. <i>Managing Gigabytes: Compressing and Indexing Documents and Images. </i>New York: Van Nostrand Reinhold, 1994. 
</li><li>[Weiss 96] Ron Weiss, Bienvenido Velez, Mark A. Sheldon, Chanathip Manprempre, Peter Szilagyi, Andrzej Duda, and David K. Gifford. <i>HyPursuit: A Hierarchical Network Search Engine that Exploits Content-Link Hypertext Clustering. </i>Proceedings of the 7th ACM Conference on Hypertext. New York, 1996. </li></ul><h2>Vitae</h2><img height="218" src="/Uploads/72/sergey.jpg" width="151" align="left" /><img height="218" src="/Uploads/72/larry.jpg" width="163" align="left" /><br /><b>Sergey Brin</b> received his B.S. degree in mathematics and computer science from the University of Maryland at College Park in 1993. Currently, he is a Ph.D. candidate in computer science at Stanford University where he received his M.S. in 1995. He is a recipient of a National Science Foundation Graduate Fellowship. His research interests include search engines, information extraction from unstructured sources, and data mining of large text collections and scientific data. 
<p><b>Lawrence Page</b> was born in East Lansing, Michigan, and received a B.S.E. in Computer Engineering at the University of Michigan Ann Arbor in 1995. He is currently a Ph.D. candidate in Computer Science at Stanford University. Some of his research interests include the link structure of the web, human computer interaction, search engines, scalability of information access interfaces, and personal data mining. 
</p><h2><a name="a"></a>8 Appendix A: Advertising and Mixed Motives</h2>Currently, the predominant business model for commercial search engines is advertising. The goals of the advertising business model do not always correspond to providing quality search to users. For example, in our prototype search engine one of the top results for cellular phone is "<a href="http://www.webfirst.com/aaa/text/cell/cell0toc.htm">The Effect of Cellular Phone Use Upon Driver Attention</a>", a study which explains in great detail the distractions and risk associated with conversing on a cell phone while driving. This search result came up first because of its high importance as judged by the PageRank algorithm, an approximation of citation importance on the web [<a href="#ref">Page, 98</a>]. It is clear that a search engine which was taking money for showing cellular phone ads would have difficulty justifying the page that our system returned to its paying advertisers. For this type of reason and historical experience with other media [<a href="#ref">Bagdikian 83</a>], we expect that advertising funded search engines will be inherently biased towards the advertisers and away from the needs of the consumers. 
<p>Since it is very difficult even for experts to evaluate search engines, search engine bias is particularly insidious. A good example was OpenText, which was reported to be selling companies the right to be listed at the top of the search results for particular queries [<a href="#ref">Marchiori 97</a>]. This type of bias is much more insidious than advertising, because it is not clear who "deserves" to be there, and who is willing to pay money to be listed. This business model resulted in an uproar, and OpenText has ceased to be a viable search engine. But less blatant bias are likely to be tolerated by the market. For example, a search engine could add a small factor to search results from "friendly" companies, and subtract a factor from results from competitors. This type of bias is very difficult to detect but could still have a significant effect on the market. Furthermore, advertising income often provides an incentive to provide poor quality search results. For example, we noticed a major search engine would not return a large airline's homepage when the airline's name was given as a query. It so happened that the airline had placed an expensive ad, linked to the query that was its name. A better search engine would not have required this ad, and possibly resulted in the loss of the revenue from the airline to the search engine. In general, it could be argued from the consumer point of view that the better the search engine is, the fewer advertisements will be needed for the consumer to find what they want. This of course erodes the advertising supported business model of the existing search engines. However, there will always be money from advertisers who want a customer to switch products, or have something that is genuinely new. But we believe the issue of advertising causes enough mixed incentives that it is crucial to have a competitive search engine that is transparent and in the academic realm. 
</p><h2><a name="b"></a>9 Appendix B: Scalability</h2><h3>9. 1 Scalability of Google</h3>We have designed Google to be scalable in the near term to a goal of 100 million web pages. We have just received disk and machines to handle roughly that amount. All of the time consuming parts of the system are parallelize and roughly linear time. These include things like the crawlers, indexers, and sorters. We also think that most of the data structures will deal gracefully with the expansion. However, at 100 million web pages we will be very close up against all sorts of operating system limits in the common operating systems (currently we run on both Solaris and Linux). These include things like addressable memory, number of open file descriptors, network sockets and bandwidth, and many others. We believe expanding to a lot more than 100 million pages would greatly increase the complexity of our system. 
<h3>9.2 Scalability of Centralized Indexing Architectures</h3>As the capabilities of computers increase, it becomes possible to index a very large amount of text for a reasonable cost. Of course, other more bandwidth intensive media such as video is likely to become more pervasive. But, because the cost of production of text is low compared to media like video, text is likely to remain very pervasive. Also, it is likely that soon we will have speech recognition that does a reasonable job converting speech into text, expanding the amount of text available. All of this provides amazing possibilities for centralized indexing. Here is an illustrative example. We assume we want to index everything everyone in the US has written for a year. We assume that there are 250 million people in the US and they write an average of 10k per day. That works out to be about 850 terabytes. Also assume that indexing a terabyte can be done now for a reasonable cost. We also assume that the indexing methods used over the text are linear, or nearly linear in their complexity. Given all these assumptions we can compute how long it would take before we could index our 850 terabytes for a reasonable cost assuming certain growth factors. Moore's Law was defined in 1965 as a doubling every 18 months in processor power. It has held remarkably true, not just for processors, but for other important system parameters such as disk as well. If we assume that Moore's law holds for the future, we need only 10 more doublings, or 15 years to reach our goal of indexing everything everyone in the US has written for a year for a price that a small company could afford. Of course, hardware experts are somewhat concerned Moore's Law may not continue to hold for the next 15 years, but there are certainly a lot of interesting centralized applications even if we only get part of the way to our hypothetical example. 
<p>Of course a distributed systems like G<i>l</i>oss [<a href="#ref">Gravano 94</a>] or <a href="http://harvest.transarc.com/">Harvest</a> will often be the most efficient and elegant technical solution for indexing, but it seems difficult to convince the world to use these systems because of the high administration costs of setting up large numbers of installations. Of course, it is quite likely that reducing the administration cost drastically is possible. If that happens, and everyone starts running a distributed indexing system, searching would certainly improve drastically. 
</p><p>Because humans can only type or speak a finite amount, and as computers continue improving, text indexing will scale even better than it does now. Of course there could be an infinite amount of machine generated content, but just indexing huge amounts of human generated content seems tremendously useful. So we are optimistic that our centralized web search engine architecture will improve in its ability to cover the pertinent text information over time and that there is a bright future for search. </p>]]></description> 
					<pubDate>Thu, 03 Aug 2006 05:08:33 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/8/2/howgooglerankspages/</guid>
				</item>
			
				<item>
					<title>How Google Can Find Your Secret Page</title> 
					<link>http://keylimetie.com/blog/2006/24/7/googlesecretpage/</link> 
					<description><![CDATA[From author David A. Utter of WebProNews<br /><a href="http://www.webpronews.com/topnews/topnews/wpn-60-20060721HowGoogleCanFindYourSecretPage.html" target="_blank">http://www.webpronews.com/topnews/topnews/wpn-60-20060721HowGoogleCanFindYourSecretPage.html</a><br /><br /><strong>Amazingly enough, some webmasters haven't learned about Google yet, and how easy it is to retrieve pages that have been poorly 
protected from being viewed.</strong><br /><br />
When the blogger behind the brand new 
<a href="http://evolvedlight.co.uk/" target="_blank">EvolvedLight</a> blog wanted to find out more information regarding an 
<a target="_blank" href="http://www.timesonline.co.uk/article/0,,2-2279031,00.html">accident</a> at Alton Towers amusement park in Staffordshire, 
England, the quest for information led to the park's 
<a target="_blank" href="http://press.altontowers.com/">media</a> page.
<br /><br />
"This site is for Media use only. To gain an access password please call 01538 704015," reads the page. Instead, the blogger turned 
to the ubiquitous Google to indulge in a little Google hacking.
<br /><br />
In looking at the source code, one section revealed that whatever is entered as a password would trigger a redirect to a page 
named {password}.html. The right password would reveal the press page.
<br /><br />
So the blogger sent Google a simple search string: * 
site:http://press.altontowers.com and guess what was revealed as the third result in the SERPs? 
<br /><br />
"<a target="_blank" href="http://press.altontowers.com/pressxpsa.html">Welcome</a> 
to the Alton Towers Press Site," said the revealed page, called pressxpsa.html. That means the password would be 
pressxpsa. <br /><br />And indeed it is. To call this a poorly designed page would be an insult to poorly designed pages everywhere. 
In the interest of helping out someone in need, here is a Microsoft link on 
<a target="_blank" href="http://support.microsoft.com/kb/299987/EN-US/">securing ASP pages</a> for the amusement park's Windows Server 
2003 <a target="_blank" href="http://toolbar.netcraft.com/site_report?url=http://www.altontowers.com">host running IIS 6</a>.]]></description> 
					<pubDate>Tue, 25 Jul 2006 05:49:50 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/24/7/googlesecretpage/</guid>
				</item>
			
				<item>
					<title>SQL Server Everywhere, not for me</title> 
					<link>http://keylimetie.com/blog/2006/7/11/sqlservereverywhere/</link> 
					<description><![CDATA[From Microsoft.com: "Microsoft SQL Server 2005 Everywhere Edition offers essential relational database functionality in a compact footprint ideal for embedding in mobile and desktop applications including a new generation of occasionally connected dynamic applications." I'm not sure I agree.<br /><br />Here is my inital list of pros/cons from a developers point of view:<br /><strong><u>Pros</u><br /></strong>Completely run in-proc, meaning there is no installation required<br />Free to develop, deploy and redistribute<br />Allows up to 4GB databases<br />Support for up to 256 connections<br />Very compact (max of 7 DLLs required at 1.4 MB)<br /><strong><u>Cons</u></strong><br />No user interface available (I had to create my database through code)...I'm sure a 3rd party will develop one very soon.<br />Support for only a limited number of datatypes - for example, supports nvarchar, but not varchar or the XML data type!<br />Does not support stored procedures, views,  triggers, extended stored procedures, or macros.<br /><br /><strong>Sample Application<br /></strong>The code is not that complicated, so I'm not going to write up a technical explanation. But in my overall opinion, this product seems to be a much more powerful version of Access without the interface. I don't see myself using it anytime soon.<br /><br />I spent a few hours reading about SQL Server Everywhere and put together this sample application.<br /><a href="/Uploads/69/SQLEverywhere.zip">Download Sample Application</a><br /><a href="/Uploads/69/Form1.cs.htm" target="_blank">Form1.cs</a><br /><br /><img src="/Uploads/69/Screenshot.jpg" /><br /><br /><strong>Useful links</strong><br />Downloaded SQL Server Everywhere: <a href="http://www.microsoft.com/sql/ctp_sqleverywhere.mspx" target="_blank">http://www.microsoft.com/sql/ctp_sqleverywhere.mspx</a><br />Paul Flessner announced SQL Server Everywhere: <a href="http://www.microsoft.com/sql/letter.mspx" target="_blank">http://www.microsoft.com/sql/letter.mspx</a><br />Steve Lasker's Blog -  Interview with Paul Flessner: <a href="http://blogs.msdn.com/stevelasker/archive/2006/04/10/SqlEverywhereInfo.aspx" target="_blank">http://blogs.msdn.com/stevelasker/archive/2006/04/10/SqlEverywhereInfo.aspx</a><br /><br />]]></description> 
					<pubDate>Wed, 12 Jul 2006 00:07:54 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/7/11/sqlservereverywhere/</guid>
				</item>
			
				<item>
					<title>Getting Your Site Indexed Before You Launch</title> 
					<link>http://keylimetie.com/blog/2006/7/5/indexsitebeforelaunch/</link> 
					<description><![CDATA[Here's an interesting article on getting your site indexed on search engines before it's really live.<br /><br /><a href="http://www.site-reference.com/articles/Search-Engines/Getting-Your-Site-Indexed-Before-You-Launch.html" target="_blank">http://www.site-reference.com/articles/Search-Engines/Getting-Your-Site-Indexed-Before-You-Launch.html</a>]]></description> 
					<pubDate>Thu, 06 Jul 2006 03:13:20 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/7/5/indexsitebeforelaunch/</guid>
				</item>
			
				<item>
					<title>10 Recommendations for Software Developers</title> 
					<link>http://keylimetie.com/blog/2006/7/4/tenrecommendations/</link> 
					<description><![CDATA[<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Over the past 10 years, I have spent a good amount of time teaching software development. First in college, I was a teaching assistant at <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:place w:st="on"><st1:placename w:st="on">Northern</st1:placename><st1:placename w:st="on">Illinois</st1:placename><st1:placetype w:st="on">University</st1:placetype></st1:place>. Then after graduating, I worked for a couple companies and did some internal training. Over the years, I have helped a few friends get into the IT industry…taught them the basics and helped get their foot in the door of a new career. I now provide training for companies on a consultant basis.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">I have learned a lot from people, books, magazines, conferences and online…and continue to learn more everyday. At least once a week, I get emails from people who are getting started in software development. Some people have questions while others just thank me for the articles that I publish. Beginning developers often ask something like, “What do you recommend I do so I can become a full time web developer?” More experienced developers often ask what I would recommend to help advance their careers or become an independent contractor.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">These answers are not easy…it depends on your experience, your available time, and most importantly, your drive. But I took the time to put together what I think is important. The first 5 are for those of you just getting started and the last 5 are for the life of your career.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Find Good Resources</strong> – Whether it’s a friend, colleague, website forum or some online community, try to find at least one good resource. When I graduated college, most of my skills were mainframe-based (Cobol, JCL, etc.). I immediately got a job with IBM but I really wanted to do web development. So I bought a few ASP and Visual Basic 6.0 books, read through them and did the examples. It all made sense, but I wanted to get some practical experience. I was consulting at Allstate Insurance at the time (mainframe area) and had a great deal of knowledge of their systems. Allstate had made the decision to get on the web at that time (May 2000) and I was able to get a position as a business knowledge expert. As the project progressed, I became friends with several of the developers and had great people to bounce questions off of. Over the next 6 months, I learned more than ever…they told me what to learn now, what book chapters to skip for now, what was important, what was not important. Everything became very clear, I developed a couple ecommerce sites (including Cigars Around the World’s first true database-driven, ecommerce site) and earned my MSCD in VB 6.0. This may be the most important recommendation for getting started…but be careful, there are a ton of hacks out there and you do not want their advice!<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.25in">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="2">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Learn the Basics</strong> – 75% of the code you write can be written in any language. Your most common tasks will include declaring variables, assigning values, performing calculations, looping through data, if…then…else, functions, etc. Every language supports these features and they must be mastered. Any “Introduction” book will cover these features in very good detail. If a book has at least a dozen or so reviews, see what the consensus says. Better yet, a good resource should be able to recommend a good starter book. I also highly recommend buying an introduction book for the language you plan on developing in. You might not know what that is, but you should have a good idea. You want to always be reading in the language you are learning…this may seem obvious, but I know people who want to learn C#, but are reading a C++ book because their brother had one laying around. If you want to learn C#, make the investment of buying a good C# book. And don’t worry too much about choosing a language to start with…as I said above, the basics translate to any language…it’s just syntax differences.<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="3">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Keep It Simple</strong> – I have a friend who says this all the time in meetings where we’re discussing how we want to solve a particular issue. That’s all he says…really. Most people kind of laugh at it. I used to, but then I thought about it a little and now I consciously practice it. If you put 1,000 developers in a room and gave them even a simple coding task, not one person would code it the same. The question is, would everyone be able to read your code…and if you looked at it a few months later, would you be able to quickly read and understand it? There are a million ways to solve any problem; the best approach is to keep it simple. It makes it much easier to maintain and also decreases the chance of someone else breaking it (including yourself!).<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="4">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Learn By Doing</strong> – <st1:city w:st="on"><st1:place w:st="on">Reading</st1:place></st1:city> and comprehending a subject isn’t that difficult….but can you really apply what you just learned? I have tried to get through books very fast and skip over some of the “Chapter Tasks” at the end. The next day, I couldn’t tell you much about what I had read. That’s why I make a point of immediately performing all of the exercises in a book. When I’m teaching a friend programming (as I am right now), we typically work side by side on separate computers. We both do everything I’m teaching and he’s learning. I could just sit there are type everything as he watches, but it has been my experience that it never works. The more time you spend in the software development environment (i.e. Visual Studio.NET, SQL Server Management Studio, etc.), the more comfortable you will get.<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="5">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Plan your Code, Code your Plan</strong> – One of the biggest mistake developers make is to start coding right away. Big mistake! I cannot express that enough! People get all excited about creating an interface, designing the logo, blah, blah, blah. Yeah, that’s fun, but it’s not the correct approach to take. There are entire courses on proper systems design and architecture (which are definitely worthwhile!), but the basic approach to a System Development Life Cycle (SDLC) is this.<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="5">
				<ol style="MARGIN-TOP: 0in" type="a">
						<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Project planning and feasibility study: Establish a high-level view of the project and determines its goals. <o:p></o:p></span>
						</li>
						<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Systems analysis and requirements definition: Refine goals into defined functions. Analyze end-user needs. <o:p></o:p></span>
						</li>
						<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Systems design: Describe desired features in detail, including screen layouts, business rules, process diagrams and other documentation. <o:p></o:p></span>
						</li>
						<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Implementation: Write the code. Personally, I design the database first, <o:p></o:p></span>
						</li>
						<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Testing: Check for errors, bugs and interoperability. <o:p></o:p></span>
						</li>
						<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Deployment: The final stage of the initial development where the software is put into production and runs the actual business. <o:p></o:p></span>
						</li>
						<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Maintenance: The rest of the software's life: changes, correction, additions, moves to a different platforms, etc. This, the least glamorous and perhaps most important step of all, goes on seemingly forever.<o:p></o:p></span>
						</li>
				</ol>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">It is so important that you follow these or some other SDLC approach. The amount of upfront planning and preparation will save you tons of time in the long run. <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="6">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Don’t be lazy!</strong> – Often, you might seem under a lot of pressure to get something done very quickly…it is very important to never compromise the quality of the software to get something done fast. Even worse than that are people who take the shortcut or “band-aid” code just to be done with it. These are the worst developers and are not respected. If you there is any chance a user might do something on your website, be sure to account for it…because they will do it! I can think of at least a half dozen cases where a fellow developer did not code for some scenario because “there’s no way anyone would ever do that”. And more times than not, some user somewhere did it…and I’ve seen entire websites crash because of it (and people do get fired). The developer always blames the user for being stupid and doing what should not have been done, when in fact the developer is the real idiot. Don’t be lazy…don’t be a hack…do it right.<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="7">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Put First Things First</strong> - One of the best books I have ever read (and read at least once every year) is Stephen Covey’s “7 Habit’s of Highly Effective People”. He says in Habit 3: Put First Things First, “The key is not to prioritize your schedule, but to schedule your priorities. Do the most important things first – because where you are headed is more important than how fast you are going”. He also says of all of the 7 habits, this is the hardest one to master. I completely agree…it is so easy to work on the fun tasks or prioritize what may seem urgent over working on the not-so-fun things than require time and serious thought. But what’s important should always take precedence over what’s considered urgent. Self discipline can be difficult and you have to realize these tasks you’re pushing aside for another time will never go away. You have to do them and you have to make them a priority. In Covey’s book, he also referenced a lifelong study on what the common trait among successful people is. The answer: successful people know to “Put First Things First”. This may be the most important recommendation you’re your continued career.<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="8">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Reuse, Reuse, Reuse</strong> – You should never need to rewrite the same logic of code ever. Does your application send emails out? If so, you better have one “SendEmail” method that everyone uses. Do you query the database for the current specials to be displayed on every page? You better have that method encapsulated in a database tier and every page better be getting the data through that method (Better yet, you better be caching that data to eliminate the extra database queries!). Whenever I start coding a new website (after the database has been designed), the first thing I do is add in my “Common” code. This common code takes care of all of the tasks common to every website, which includes validation, javascript and form helpers, constants, enumerations, exception handling, emailing, base classes, and much more. At least 10-15% of my code is now done and I know it works perfectly. The next thing I do is generate my data access tier. I always write my data access code the same from project to project: I create custom classes to represent data entities, I pass all data from tier to tier through these custom classes and I use the Microsoft Data Access Blocks to do the database access. It’s really time consuming to create the custom classes, CRUD methods and the stored procedures, so I create my own data tier generator. With the data tier generator, I click one button and everything is generated in a couple of seconds…hours and hours of work now done instantaneously and I know the code is perfect. Work smart, not hard.<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="9">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Certifications</strong> – Get certified or not? This has been a debate among fellow developers for a long time. My personal belief is to get certified, but it’s not priority #1. My reasons include:<o:p></o:p></span>
						<ol style="MARGIN-TOP: 0in" type="a">
								<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
										<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">I have interviewed for contracts where they only accepted resumes from people who were at least an MCSD (Microsoft Certified Solution Developer).<o:p></o:p></span>
								</li>
								<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
										<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">I have taken several tests and they are not easy…they do require a very good deal of knowledge and understanding in order to pass.<o:p></o:p></span>
								</li>
								<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
										<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Some companies give bonuses or raises for obtaining your certification<o:p></o:p></span>
								</li>
								<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in">
										<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Instant credibility – Only those who do not believe in the program will not care…the other 99% who know what the certification is or do not know what it is have an instant feeling that you know what you’re doing.<o:p></o:p></span>
								</li>
						</ol>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.75in">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.75in">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Most people I speak to agree getting certified is a good idea. Some are indifferent and a few completely disagree. The main disagreement is that anyone can get certified. They’re just tests and there are “brain dump” websites out there where people post questions and answers right after taking the tests. These are true statements, but almost every interview I have been on for a contract or short term assignment have looked very positive on my certification. I certainly believe getting certified has made my career as an independent contractor a lot easier…and it obviously cannot hurt it.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>
		<ol style="MARGIN-TOP: 0in" type="1" start="10">
				<li class="MsoNormal" style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
								<strong>Continued Education</strong> – This is what separates the real developers from the 9-5’ers. Most programmers get by with the basics. They know enough to get the job done, work their 8 hours every day and go home to do nothing. Those with drive and ambition to be great continue their education everyday…even at home. Whether it’s reading technical magazines, online articles, blogs, or picking up a good book, anything you do to stay on top of the latest technology will give you a huge advantage. Not only will you continue to work with the latest software, but you will also be much more sought after, have much better job security and be able to bill a much higher rate. I personally subscribe to 4 technical magazines and a few weekly newsletters. I also try to read one good book per month. By doing this, I am always reading about the newest software and have learned great approaches to difficult solutions (which saves me a ton of time and work). My favorite site is The Code Project. They send out a weekly newsletter that lists the recent articles by category. They enforce an excellent format that is easy to follow and provide an area for feedback. When searching for a way to do something specific, I often go here first and almost always find it. Whatever approach you take, make a conscious effort to keep learning. By being smarter and better than the rest, you have complete control of your career…which leads to more opportunities…which leads to a very enjoyable life.<o:p></o:p></span>
				</li>
		</ol>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
						<o:p> </o:p>
				</span>
		</p>]]></description> 
					<pubDate>Tue, 04 Jul 2006 18:26:41 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/7/4/tenrecommendations/</guid>
				</item>
			
				<item>
					<title>Google File System - How Google does it...</title> 
					<link>http://keylimetie.com/blog/2006/6/27/googlefilesystem/</link> 
					<description><![CDATA[<p>While many IT shops deal with the issues related to hundreds or thousands of users, Google regularly manages, administers and upgrades software and systems for millions of users. How do they do it? I found this article with an excellent overview of the Google file system and its unique capabilities.<br /><br /><a target="_blank" href="http://storagemojo.com/?page_id=152">http://storagemojo.com/?page_id=152</a><br /></p>]]></description> 
					<pubDate>Wed, 28 Jun 2006 05:04:39 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/6/27/googlefilesystem/</guid>
				</item>
			
				<item>
					<title>ASP.NET 2.0 environment setup</title> 
					<link>http://keylimetie.com/blog/2006/6/21/aspnet2environment/</link> 
					<description><![CDATA[I've seen a lot of people have problems getting their image, css and js paths setup correctly in ASP.NET 2.0. In 2.0, every site runs on its own port just off the localhost, but the "virtual directory" name is still in the path...so you can't force everything down to the root. If you do any type of URL Rewriting or use Master Pages in pages in different level subfolders, this is going to be an issue. Prefixing paths with '' works sometime, but not for all cases.<br /><br />In 1.1, I would often set the webinfo file contents to point to http://localhost. Why not do the same in 2.0? To do so, open your web project Property Pages, click into the 'Start Options' area, select 'Use custom server' and enter in 'http://localhost'. This will set your environment up as if it were running on your server as a website. Only pain is changing the IIS default directory when working on another site...but that only takes a couple of seconds.<br /><br /><img src="/Uploads/65/Screenshot.jpg" />]]></description> 
					<pubDate>Wed, 21 Jun 2006 11:14:44 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/6/21/aspnet2environment/</guid>
				</item>
			
				<item>
					<title>Get Current Page&amp;quot;s HTML (C#)</title> 
					<link>http://keylimetie.com/blog/2006/6/15/getcurrentpage/</link> 
					<description><![CDATA[I was working on a project where I needed to get the current page's HTML. I searched all over the Internet and could not find anything. Then I thought about the Page's built-in methods...<strong>Render</strong>! Here's how you get it:<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span>sw = <span style="COLOR: #0000ff">new</span> StringWriter();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>htmltw = <span style="COLOR: #0000ff">new</span> HtmlTextWriter(sw);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">base</span>.Render(htmltw);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>StringBuilder html = sw.GetStringBuilder();</pre>And be sure to drop this code in the "OnPreRenderComplete" method (you'll need to create an override in your code-behind).<br /><br />Well that was easy enough, huh?]]></description> 
					<pubDate>Fri, 16 Jun 2006 02:29:11 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/6/15/getcurrentpage/</guid>
				</item>
			
				<item>
					<title>Wow...now we know how to get our visitors motivated!</title> 
					<link>http://keylimetie.com/blog/2006/6/14/wow/</link> 
					<description><![CDATA[For the past 2 weeks, I have been giving out free licenses for the Google Sitemap Generator. Each day, I'd send out between 30 and 40 licenses. Yesterday, I released version 2.1 and stated "Last day to get a free license is 6/14/2006.". Well that have some effect.<br /><br /><strong>Today's stats:</strong><br />Unique visitors: 624 (normally 230-250)<br />Free licenses: 141 (normally 30-40).<br /><br />And I am still allowing up to 11:59 PM CST.<br /><br />I guess when you set a deadline for something free, people finally get off their butts and ask. And I'm sure solme of these people told their friends.<br /><br />As of tomorrrow, it'll cost $49.99. So for all of you who want to thank me for the great software and free license, tell you friends about it and tell them to buy a copy. Friendly message: I track all usage of the application, so don't try to give your friends your license or you'll lose it! <img src="/CuteEditor_Files/emwink.gif" align="absMiddle" border="0" />]]></description> 
					<pubDate>Thu, 15 Jun 2006 05:47:04 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/6/14/wow/</guid>
				</item>
			
				<item>
					<title>Windows Live Local Beta</title> 
					<link>http://keylimetie.com/blog/2006/6/1/windowslivelocalbeta/</link> 
					<description><![CDATA[Has anyone seen this yet? <a href="http://local.live.com/" target="_blank">http://local.live.com/</a><br /><br />Google Maps has some competiton.]]></description> 
					<pubDate>Fri, 02 Jun 2006 04:03:43 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/6/1/windowslivelocalbeta/</guid>
				</item>
			
				<item>
					<title>SQL Prompt - IntelliSense for SQL Server</title> 
					<link>http://keylimetie.com/blog/2006/6/1/sqlprompt/</link> 
					<description><![CDATA[
		<p>Last week, a friend told me about this new product available for free from <a href="http://www.red-gate.com/products/sql_prompt/index.htm" target="_blank">Red Gate Software, SQL Prompt</a>. Since then, I've seen several blogs talking about it.<br /><br /><strong>What is it?</strong><br />Basically, it's Intellisense for SQL Server. So when you start typing "SELECT * FROM", it automatically pops up a window with the available tables, fields, functions, etc. It also reacts just like Visual Studio (Ctrl-Space opens the window, Tab places the selected entry, etc.) and has a ton of options (just open the Options window from the System Tray).<br /><br />I thought it would only work in Query Analyzer, but nope, it works in Enterprise Manager, Management Studio, Visual Studio and even some 3rd party apps. I downloaded it myself and installed it. I've tested it with SQL Server 2000 and 2005 and it's great. Check it out and get it while it's free (until Sept 1st)!<br /><br />Website: <a href="http://www.red-gate.com/products/sql_prompt/index.htm" target="_blank">Red Gate Software, SQL Prompt</a></p>
]]></description> 
					<pubDate>Thu, 01 Jun 2006 12:27:38 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/6/1/sqlprompt/</guid>
				</item>
			
				<item>
					<title>XPath Expression Test Application (C#)</title> 
					<link>http://keylimetie.com/blog/2006/5/4/xpathexpressions/</link> 
					<description><![CDATA[Recently, I've been using XML a lot in my side projects. When binding XML to GridViews, Repeaters and DataLists, it's
very easy to set the element to display with an XPath command. For example, here's how to bind to DataList:
<pre style="color: #000000"><span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">1</span><asp:DataList ID=<span style="color: #848284">"dlBooks"</span> runat=<span style="color: #848284">"server"</span>>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">2</span>    <ItemTemplate>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">3</span>        <%# XPath(<span style="color: #848284">"Title"</span>) %><br />
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">4</span>        by <%# XPath(<span style="color: #848284">"Author"</span>) %><br />
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">5</span>        <br />
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">6</span>        <i><%# XPath(<span style="color: #848284">"BookText"</span>) %></i>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">7</span>    </ItemTemplate>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">8</span></asp:DataList>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">9</span>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">10</span>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">11</span><span style="color: #0000FF">protected</span> <span style="color: #0000FF">void</span> BindXML(<span style="color: #0000FF">string</span> strXML)
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">12</span>{
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">13</span>    eNomInterface objAPI = <span style="color: #0000FF">null</span>;
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">14</span>    XmlDataSource xds = <span style="color: #0000FF">null</span>;
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">15</span>    <span style="color: #0000FF">try</span>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">16</span>    {
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">17</span>        xds = <span style="color: #0000FF">new</span> XmlDataSource();
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">18</span>        xds.Data = objAPI.Results.InnerXml;
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">19</span>        xds.XPath = <span style="color: #848284">"*/Books"</span>;
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">20</span>        dlBooks.DataSource = xds;
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">21</span>        dlBooks.DataBind();
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">22</span>    }
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">23</span>    <span style="color: #0000FF">catch</span> (Exception ex)
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">24</span>    {
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">25</span>        <span style="color: #008200">//Log exception</span>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">26</span>    }
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">27</span>    <span style="color: #0000FF">finally</span>
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">28</span>    {
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">29</span>        <span style="color: #0000FF">if</span> (xds != <span style="color: #0000FF">null</span>)
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">30</span>        {
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">31</span>            xds.Dispose();
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">32</span>            xds = <span style="color: #0000FF">null</span>;
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">33</span>        }
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">34</span>    }
<span style="color: #008284; background-color: #e5e5e5; width: 40px; text-align: right; margin-right: 10px; border-right: 1px solid #999999">35</span>}</pre>
But as I mentioned in a recent blog, I haven't memorized all of the XPath expressions. I know there aren't a ton, but who
has the time. When I'm writing code, I often reference other code to find the expression I need (what a pain to search 
through code). Then when I test it out, I'm constantly reworking the expressions until I get what I want. 
So that's when I decided to write this little application.
<br />
<br />
This application basically allows you to select or paste in source XML. Then you can enter in an XPath expression and
select the command to execute. After doing so, the results (or error) will display. You can also take your results and
load them into the source XML textbox with a button click...this allows you to easily test XPath expresssions on
results from previous queries. This is much better than experimenting in your code!
<br />
<br />
The XPath expression examples all came from MSDN. The application has links to the website and I also supplied the
example XML and XPath expressions. Also, I pulled in all of the MSDN examples so you can easily find an example of the 
expression you're looking to execute.
<br />
<br />
Download <a href="/Uploads/53/XPathTester_Binaries.zip">Application</a>
<br />
Download <a href="/Uploads/53/XPathTester.zip">Source code</a>
<br />
<br />
<img src="/Uploads/53/Screenshot.jpg" />]]></description> 
					<pubDate>Fri, 05 May 2006 03:24:01 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/5/4/xpathexpressions/</guid>
				</item>
			
				<item>
					<title>30 Best Practices for Integrating Web Services</title> 
					<link>http://keylimetie.com/blog/2006/5/2/30bestpractices/</link> 
					<description><![CDATA[I was doing some research on Web Services and came across this webpage. It's Chapter 13 from Thomas Erl's book on Service-Oriented Architecture is about integrating web services.<br /><br />It's great for people who know little to nothing about Web Services and want to learn. And will teach even those of us who know a lot of Web Services already.<br /><br />Check it out: <a href="http://www.perfectxml.com/bestpractices.asp" target="_blank">PerfectXML website</a>.]]></description> 
					<pubDate>Wed, 03 May 2006 04:08:26 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/5/2/30bestpractices/</guid>
				</item>
			
				<item>
					<title>URL Rewriter for ASP.NET 2.0 (C#)</title> 
					<link>http://keylimetie.com/blog/2006/4/29/urlrewriter2/</link> 
					<description><![CDATA[
		<p>The Midwest Scuba Diving website I recently created in ASP.NET 2.0 needed the URL Rewriter logic implemented. So I took about 15 minutes and converted the ASP.NET 1.1 version to 2.0. This is the database-capable version.<br /><br />What's different? Mostly .NET differences (partial pages, web.config, etc.), but I also upgraded the Data Access logic to use the 2.0 version of the Microsoft Applicaton Blocks.<br /><br />And be sure to check out the scuba site:<br /><a href="http://www.midwestscubadiving.com/" target="_blank">http://www.midwestscubadiving.com</a><br /><br /><a href="/Uploads/51/URLRewriterDB2.zip">Download URL Rewriter for ASP.NET 2.0</a><br /><br />To learn more about the URL Rewriter or to get the Database for the application, check out the 1.1 version write up: <a href="/ShowItem48.aspx">http://www.brianpautsch.com/ShowItem48.aspx</a></p>
]]></description> 
					<pubDate>Sat, 29 Apr 2006 21:44:20 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/4/29/urlrewriter2/</guid>
				</item>
			
				<item>
					<title>XPath Examples compliments of MSDN</title> 
					<link>http://keylimetie.com/blog/2006/4/27/xpathexamples/</link> 
					<description><![CDATA[
		<p>I don't use XPath enough to memorize all of the possible syntax formats. If you do, get a life! Anyways...the other day I needed to find an example of a complex XPath expression and came across this page on MSDN. It lists the commonly used XPath expressions and is invaluable. Enjoy!<br /><br /><a target="_blank" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/1431789e-c545-4765-8c09-3057e07d3041.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/1431789e-c545-4765-8c09-3057e07d3041.asp</a></p>
]]></description> 
					<pubDate>Fri, 28 Apr 2006 03:51:29 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/4/27/xpathexamples/</guid>
				</item>
			
				<item>
					<title>Cannot convert type &amp;quot;ASP.login_aspx&amp;quot; to &amp;quot;System.Web.UI.WebControls. Login&amp;quot;</title> 
					<link>http://keylimetie.com/blog/2006/4/24/asplogin_aspx/</link> 
					<description><![CDATA[I've been working in ASP.NET 2.0 for a month or so now, but just pushed my first application to my production servers. Website: <a href="http://www.midwestscubadiving.com" target="_blank">http://www.midwestscubadiving.com</a><br /><br />The homepage loaded up just fine, but then I clicked on "Login" and got the following message: Cannot convert type 'ASP.login_aspx' to 'System.Web.UI.WebControls.Login'<br /><br />Looking at the message, I realized the word "Login" appears to be some type of reserved type. New in ASP.NET 2.0 are the built in "Login" controls. I'm guessing there must be some conflict. I didn't want to rename my page, so I searched around a little. Someone suggested unchecking "Allow this precompiled site to be updatable". I tried that and it worked...and I don't mind not allowing the site to be updatable. This will prevent me from making small tweaks on the Production server without making them locally!<br /><br />I came across the same issue with the "Profile.aspx" page. I decided to rename this page as the above resolution didn't work...and I'll probably end up renaming "Login.aspx".<br /><br />Has anyone else come across this and found a better resolution? ]]></description> 
					<pubDate>Mon, 24 Apr 2006 16:17:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/4/24/asplogin_aspx/</guid>
				</item>
			
				<item>
					<title>URL Rewriter - Database Driven (C#)</title> 
					<link>http://keylimetie.com/blog/2006/4/6/urlrewriter/</link> 
					<description><![CDATA[<b>What's URL Rewriting? <br /></b>About 2 years ago, a customer asked me about implementing URL Rewriting into their website. I had never heard of such a thing, so I told them I’d look into it. In case you’ve never heard of it, here’s the basic explanation:<br /><br />All webpages that display dynamic text usually have querystring values passed into them so they know what to display. The website you’re on now, brianpautsch.com is a good example of it.<br /><br />For example, <a target="_blank" href="/BlogEntries.aspx?Y=2006&M=03">http://www.brianpautsch.com/BlogEntries.aspx?Y=2006&M=03</a> would tell the webpage to display all items from March, 2006. Try it out.<br /><br />Now, go to <a href="/Blog/2006/3/" target="_blank">http://www.brianpautsch.com/Blog/2006/3/</a><a href="/ShowItems200603.aspx" target="_blank"></a> - Same results, huh?<br /><br />Here’s what happened. Behind the scenes, I added a rewriter rule to say: change all URLs that are “ShowItems” + 4 numbers + 2 numbers + “.aspx” to “ShowItems.aspx?Year=” + 4 numbers + “&M=” + 2 numbers.<br /><br />That’s it…sounds easy enough, right? Not really.<br /><br />Fortunately, I came across an article by Scott Mitchell on MSDN: <br /><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/urlrewriting.asp" target="_blank">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/urlrewriting.asp</a>.<br />So first off, understand that I did not write this code. I simply extended it to allow you to store your rules in the web.config or in a database. The web.config is a great location if the rules rarely change and only use regular expressions. In my case, I’ve had 6 or 7 customers who have new rules added every day. They basically create a rule for every article, blog entry, etc. they publish.<br /><br /><b>Why should I implement URL Rewriting?</b><p></p><ul type="disc"><li>Some public search engines and most site and intranet search engines will index URLs with dynamic URLS, but others will not. And because it's difficult to link to these pages, they will be penalized by engines which use link analysis to improve relevance ranking, such as Google's PageRank algorithm. In Summer 2003, Google had very few dynamic URL pages in the first 10 pages of results for test searches. 
</li><li>Search engine robot writers are concerned about their robot programs getting lost on web sites with infinite listings. Search engine developers call these "spider traps" or "black holes" -- sites where each page has links to many more programmatically-generated pages, without any useful content on them. The classic example is a calendar that keeps going forward through the 21st Century, although it has no events set after this year. This can cause the search engine to waste time and effort, or even crash your server. 
</li><li>Readable URLs are good for more than being found by local and webwide search engine robots. Humans feel more comfortable with consistent and intuitive paths, recognizing the date or product name in the URL. 
</li><li>By abstracting the public version of the URL, it will not be dependent on the backend software. If your site changes from Perl to Java or from CFM to .Net, the URLs will not change, so all links to your pages will remain live.</li></ul><p>Source: <a href="http://www.searchtools.com/robots/goodurls.html" target="_blank">http://www.searchtools.com/robots/goodurls.html</a><br /><br /><b>So how do I do it?<br /></b>I will not be going into the details behind the URL Rewriter as Scott Mitchell’s article on MSDN explains it in great detail. But I highly recommend you read the article…it’s very good. This article is for those of you who want to implement it in 10 minutes and be done…and then maybe learn about it later.<br /><br /><a href="/Uploads/48/URLRewriterDB.zip">Download Code</a><br /><a href="/Uploads/48/URLRewriterDB.zip_DLLs.zip">Download Binaries only</a><br /><br /><b>1. Update your web.config<br /></b>In order for the Rewriter code to execute, you must add an HTTP module entry into the web.config. You can also use an HTTP handler (see MSDN article for explanation).<br /><br /><img src="/Uploads/48/WebConfigHTTPModule.jpg" /><br /><br /><b>2. Setup your rules<br /></b>For URL Rewriting to work, you need a “LookFor” value (the URL being sent over in the browser) and a “SendTo” value (the URL to rewrite to). In the web.config, it’s very easy. First, add a reference to your rules configuration section:<br /><br /><img src="/Uploads/48/WebConfigConfig.jpg" /><br /><br />then add your rules:<br /><br /><img src="/Uploads/48/WebConfigRules.jpg" /><br /><br />In the database, it’s also very easy, but requires a little work. First, create a table:<br /><br /><img src="/Uploads/48/Database.jpg" /><br /><br />Then, write a stored procedure to retrieve all Rewriter Rules:<br /><br /><i>CREATE PROCEDURE dbo.spRewriterRule_GetAll<br /><br />AS<br /><br />SELECT * FROM RewriterRules<br /></i><br /><br />Be sure to update the "RewriterUseDB" setting in the web.config based on your decision to use the web.config or database.<br /><br /><img src="/Uploads/48/WebConfigSettings.jpg" /><br /><br />A few points about Rules:</p><ul type="disc"><li>The “~” is a built-in feature that means “go to the root level of the application”. 
</li><li>All entries must be XML compliant. So be sure to escape periods (.) and excode ampersands (&amp;). 
</li><li>Be sure to take the time to design your rules and folder hierarchy. On brianpautsch.com, I currently have the Rule “ShowItems(\d{4})/(\d{2})/(\d{2}).aspx “to go “ShowItems.aspx? Year=$1&amp;Month=$2&amp;Day=$3”. I think I’m going to change it to “LookFor” “(\d{4})/(\d{2})/(\d{2})/” so people can type in bp.com/2006/03/01/ to get the entries they’re looking for. Both LookFor’s are intuitive, but the latter is much better.</li></ul><p>Note: Rewriter rules that have folders in them must have the folder exist! And in that folder must be a default page with a simple “<%@ Page %>” tag.<br /><br /><b>2. Reference the RewriterDB and ActionlessForm DLLs<br /></b>I recommend you add the projects to your solution and then add references. Then when you run the code, you can step through the Rewriter code.<br /><br /><b>3. Create your webpages<br /></b>Based upon your rules, create the necessary webpages to support them. Be sure to add the ActionlessForm “form” tag at the top of each webpage:<br /><br /><img src="/Uploads/48/ActionlessForm.jpg" /><br /><br />And then add a few links to your webpage to test your rules out.<br /><br /><img src="/Uploads/48/Webpage.jpg" /><br /><br />This allows the page to post back to itself without revealing the true path.<br /><br /><b>A few words on URL Rewriting…<br /></b>I have implemented this into many websites and it works great. A couple websites have several thousand rewriter rules and there is no sign of performance loss.</p><ul type="disc"><li>When possible, use regular expressions over exact matches. 
</li><li>When using the database approach, be sure to associate each rewrite rule with the information it is rewriting. For example, if each blog entry has its own rewrite rule, you’ll need to add a column titled “RuleID” to the BlogEntries table. This is necessary so that you can JOIN on the RewriterRules table when displaying the blog entries and also easily find the rule when updating/deleting blog entries. 
</li><li>When using the database approach and your “LookFor” has subfolders, be sure you create these! In the code provided, I simply created a folder titled “defaultpage” and whenever I create a rule, I ensure the folder exists and the file exists. Here’s some code I have written for live applications:</li></ul><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #008200">//Ensure rewriter path exists</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>DateTime dteCreatedOn = objDataSvc.CreatedOn;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>Helpers.EnsureDefaultFileExists(Server.MapPath(<span style="COLOR: #848284">"\\"</span>), 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><span style="COLOR: #848284">"Blogs\\"</span> + String.Format(<span style="COLOR: #848284">"{0:yyyy}"</span>, dteCreatedOn) + <span style="COLOR: #848284">"\\"</span> + 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> String.Format(<span style="COLOR: #848284">"{0:MM}"</span>, dteCreatedOn) + <span style="COLOR: #848284">"\\"</span> + 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span> String.Format(<span style="COLOR: #848284">"{0:dd}"</span>, dteCreatedOn) + <span style="COLOR: #848284">"\\"</span> + 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> txtPageName.Text.Trim() + <span style="COLOR: #848284">"\\Default.aspx"</span>); 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #008200">//Clear cached values so they reload on next page click from anyone</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>HttpContext.Current.Cache.Remove(<span style="COLOR: #848284">"RewriterConfig"</span>);</pre><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #0000ff">void</span> EnsureDefaultFileExists(<span style="COLOR: #0000ff">string</span> strRoot, <br /><span style="COLOR: #0000ff">string</span> strFilePath)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #008200">//Directory missing</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><span style="COLOR: #0000ff">if</span> (!Directory.Exists(Path.GetDirectoryName(strRoot + strFilePath)))
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>  Directory.CreateDirectory(Path.GetDirectoryName(strRoot + strFilePath));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><span style="COLOR: #008200">//File missing</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #0000ff">if</span> (!File.Exists(strRoot + strFilePath))
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><span style="COLOR: #0000ff">string</span> strDefaultLoc = 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>   ConfigurationSettings.AppSettings[<span style="COLOR: #848284">"RewriterDefaultPage"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>  File.Copy(strRoot + strDefaultLoc, strRoot + strFilePath, <span style="COLOR: #0000ff">true</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>}</pre>]]></description> 
					<pubDate>Fri, 07 Apr 2006 04:01:51 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/4/6/urlrewriter/</guid>
				</item>
			
				<item>
					<title>Enumerate An Enumeration</title> 
					<link>http://keylimetie.com/blog/2006/4/6/enumerateanenumeration/</link> 
					<description><![CDATA[Enumerations can be a great way to store a number of named constants. Have you ever had the need to display all of the string values of an enumeration? This code snippet show you how to load a dropdownlist of car makes:<pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">void</span> LoadCarMakes()
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> <span style="COLOR: #0000ff">foreach</span> (CarMakes carmake <span style="COLOR: #0000ff">in</span> GetEnumValues(<span style="COLOR: #0000ff">typeof</span>(CarMakes)))
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>   ddlCarMakes.Items.Add(carmake);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>}
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">static</span> System.Enum[] GetEnumValues(Type enumType)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span> <span style="COLOR: #0000ff">if</span> (enumType.BaseType == <span style="COLOR: #0000ff">typeof</span>(System.Enum))
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>  System.Reflection.FieldInfo[] fi = enumType.GetFields(<br />            BindingFlags.Static | BindingFlags.Public);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>  System.Enum[] values = <span style="COLOR: #0000ff">new</span> System.Enum[fi.Length];
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>  <span style="COLOR: #0000ff">for</span> (<span style="COLOR: #0000ff">int</span> iEnum = 0; iEnum < fi.Length; iEnum++)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>   values[iEnum] = (System.Enum)fi[iEnum].GetValue(<span style="COLOR: #0000ff">null</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>  <span style="COLOR: #0000ff">return</span> values;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span> <span style="COLOR: #0000ff">else</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span>  <span style="COLOR: #0000ff">throw</span> <span style="COLOR: #0000ff">new</span> ArgumentException(<span style="COLOR: #848284">"enumType parameter is not a System.Enum"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span>}</pre>]]></description> 
					<pubDate>Fri, 07 Apr 2006 03:53:01 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/4/6/enumerateanenumeration/</guid>
				</item>
			
				<item>
					<title>Get Web Parts to work without SQL 2005 Express</title> 
					<link>http://keylimetie.com/blog/2006/4/6/webparts/</link> 
					<description><![CDATA[By default, Web Parts uses the SQL 2005 Express provider for data storage.<br />To use SQL Server 2000 or SQL Server 2005 (Non-Express), you need to do the following:<br /><br />1. Use the aspnet_regsql.exe tool located in<br />C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\ to prepare SQL Server.<br />Basically, it will add the 'aspnetdb' database to your SQL Instance.<br /><br /><img src="/Uploads/47/SQL2005.jpg" /> <br /><br />2. In your Web.config, add the following:<br /><pre><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">connectionStrings</span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff">  <</span><span style="COLOR: #800000">add</span><span style="COLOR: #ff0000"> name<span style="COLOR: #0000ff">="ConnectionString"</span> 
    connectionString<span style="COLOR: #0000ff">="Data Source=your_server_name;
    Initial Catalog=aspnetdb;Integrated Security=True"</span>
    providerName<span style="COLOR: #0000ff">="System.Data.SqlClient"</span> </span><span style="COLOR: #0000ff">/></span>
<span style="COLOR: #0000ff">  </</span><span style="COLOR: #800000">connectionStrings</span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">system.web</span><span style="COLOR: #0000ff">></span>
  .
  .
<span style="COLOR: #0000ff">  <</span><span style="COLOR: #800000">webParts</span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff">    <</span><span style="COLOR: #800000">personalization</span><span style="COLOR: #ff0000"> defaultProvider<span style="COLOR: #0000ff">="SqlPersonalizationProvider"</span></span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff">      <</span><span style="COLOR: #800000">providers</span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff">        <</span><span style="COLOR: #800000">add</span><span style="COLOR: #ff0000"> name<span style="COLOR: #0000ff">="SqlPersonalizationProvider"</span> 
          type<span style="COLOR: #0000ff">="System.Web.UI.WebControls.WebParts.SqlPersonalizationProvider"</span>
          connectionStringName<span style="COLOR: #0000ff">="ConnectionString"</span> applicationName<span style="COLOR: #0000ff">="/"</span> </span><span style="COLOR: #0000ff">/></span>
<span style="COLOR: #0000ff">      </</span><span style="COLOR: #800000">providers</span><span style="COLOR: #0000ff">></span> 
<span style="COLOR: #0000ff">      <</span><span style="COLOR: #800000">authorization</span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff">      <</span><span style="COLOR: #800000">deny</span><span style="COLOR: #ff0000"> users<span style="COLOR: #0000ff">="*"</span> verbs<span style="COLOR: #0000ff">="enterSharedScope"</span> </span><span style="COLOR: #0000ff">/></span>
<span style="COLOR: #0000ff">      <</span><span style="COLOR: #800000">allow</span><span style="COLOR: #ff0000"> users<span style="COLOR: #0000ff">="*"</span> verbs<span style="COLOR: #0000ff">="modifyState"</span> </span><span style="COLOR: #0000ff">/></span>
<span style="COLOR: #0000ff">      </</span><span style="COLOR: #800000">authorization</span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff">    </</span><span style="COLOR: #800000">personalization</span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff">  </</span><span style="COLOR: #800000">webParts</span><span style="COLOR: #0000ff">></span>
<span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">system.web</span><span style="COLOR: #0000ff">></span></pre>That's it...just create a new Web Application and start adding in Web Parts.]]></description> 
					<pubDate>Fri, 07 Apr 2006 01:50:50 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/4/6/webparts/</guid>
				</item>
			
				<item>
					<title>Randomize your data with ease - SQL Server</title> 
					<link>http://keylimetie.com/blog/2006/3/21/randomizeyourdata/</link> 
					<description><![CDATA[Often, I have the need to randomize what's presented to the user. For a test taking application I wrote, each student's test questions had to be randomized (helps prevent cheating). For a community website I built, the website's homepage sponsors had to be randomized each time the page was displayed. I've seen people try to solve this all kinds of ways, but there's one VERY simply way to do it...use SQL Server GUIDs.<br /><br />Let's say you have a table of Sponsors with a SponsorID (int, identity, primary key) and a SponsorImage (varchar(50)).<br /><br /><img src="/Uploads/45/TableSchema.jpg" border="0" /><br /><br /><br />And you have the following sponsor data:<br /><br /><img src="/Uploads/45/TableData.jpg" border="0" /><br /><br /><br />To get the data returned in a randomized order, run the following query:<br /><br />SELECT *, NEWID() AS RandomNum<br />FROM Sponsors<br />ORDER BY RandomNum<br /><br /><img src="/Uploads/45/Query.jpg" border="0" /><br /><br />As you can see, the GUID is auto-generated and when sorted upon gives a different sort order for the sponsors. Could it be any easier?]]></description> 
					<pubDate>Wed, 22 Mar 2006 02:31:56 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/3/21/randomizeyourdata/</guid>
				</item>
			
				<item>
					<title>Visual Studio 2005 C# Code Snippets - Free!</title> 
					<link>http://keylimetie.com/blog/2006/3/16/visualstudio2005codesnippets/</link> 
					<description><![CDATA[Lately, I've been spending a lot of time in Visual Studio 2005. A cool new feature is code snippets. They are reusable, task-oriented blocks of code available in the code editor. They are available to download online, you can search for new ones through Visual Studio 2005 or you can create your own. Just yesterday, I came across this link:<br /><br /><a href="http://msdn.microsoft.com/vstudio/downloads/codesnippets/default.aspx" target="_blank">http://msdn.microsoft.com/vstudio/downloads/codesnippets/default.aspx</a><br /><br />Microsoft published dozens of code snippets that install into VS 2005. Check them out.]]></description> 
					<pubDate>Fri, 17 Mar 2006 04:07:38 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/3/16/visualstudio2005codesnippets/</guid>
				</item>
			
				<item>
					<title>Hide your file downloads with binary streaming (C#)</title> 
					<link>http://keylimetie.com/blog/2006/3/9/hideyourfiledownloads/</link> 
					<description><![CDATA[Ever have the need to allow people to download files but don't want them to know the physical location? It's actually pretty easy...just put your files in a location not accessible to the web and stream them back to the user: <br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">void</span> SendFileToUser(<span style="COLOR: #0000ff">string</span> strFileFullPath)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> FileStream objFile = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> BinaryReader objBR = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> <span style="COLOR: #0000ff">try</span> 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span> { 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>  objFile = <span style="COLOR: #0000ff">new</span> FileStream(strFileFullPath, FileMode.Open); 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>  <span style="COLOR: #008200">//Clear and change the response headers</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>  Response.Clear();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>  Response.Charset = <span style="COLOR: #848284">""</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>  Response.AddHeader(<span style="COLOR: #848284">"Content-disposition"</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>   <span style="COLOR: #848284">"attachment; filename="</span> + 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>   Path.GetFileName(strFileFullPath));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>  <span style="COLOR: #008200">//Stream the file down</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>  objBR = <span style="COLOR: #0000ff">new</span> BinaryReader(objFile);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>  <span style="COLOR: #0000ff">for</span> (<span style="COLOR: #0000ff">long</span> l = 0; l < objFile.Length; l++)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>   Response.OutputStream.WriteByte(objBR.ReadByte());
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>  objBR.Close();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span> <span style="COLOR: #0000ff">catch</span> (Exception ex)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span>  <span style="COLOR: #0000ff">throw</span> <span style="COLOR: #0000ff">new</span> Exception(<span style="COLOR: #848284">"Exception: "</span> + ex.Message);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span> <span style="COLOR: #0000ff">finally</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span>  objBR = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span>  objFile = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span>}</pre>]]></description> 
					<pubDate>Fri, 10 Mar 2006 04:19:38 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/3/9/hideyourfiledownloads/</guid>
				</item>
			
				<item>
					<title>Website Testing - Automation, Autofill, etc. (C# WinForms)</title> 
					<link>http://keylimetie.com/blog/2006/3/9/websitetesting/</link> 
					<description><![CDATA[Looking to automate your web testing? Create your own Windows forms robot to test your website (and continue to test as you add more and more features!). Here's a basic example to get you started today:<br /><br /><a href="/Blog/2006/8/7/WebsiteTesting2/Default.aspx"><strong>BE SURE TO CHECK OUT PART 2 OF THIS ARTICLE WHERE FRAMES ARE INVOLVED</strong></a><br /><br /><a href="/Uploads/41/AutoFillForms.zip">Download code</a><br /><br /><b>1. Create a new Windows Forms application and add in the "Microsoft Internet Controls" COM Component (shdocvw.dll).</b><br /><br /><b>2. Add a "Search" textbox, a couple of radio buttons, a web browser and a "Go" button. On click of the "Go" button, add the following code:</b><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #0000ff">void</span> cmdGo_Click(<span style="COLOR: #0000ff">object</span> sender, System.EventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #008200">//Navigate to the page</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> Object objNull = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> WebBrowser.Navigate(<span style="COLOR: #848284">"http://www.google.com"</span>, <span style="COLOR: #0000ff">ref</span> objNull, <span style="COLOR: #0000ff">ref</span> objNull, <span style="COLOR: #0000ff">ref</span> objNull, <span style="COLOR: #0000ff">ref</span> objNull);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span> mbSearching = <span style="COLOR: #0000ff">true</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>}</pre><b>3. Handle the web browser's "DocumentComplete" event like s</b><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #0000ff">void</span> WebBrowser_DocumentComplete(<span style="COLOR: #0000ff">object</span> sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #008200">//If we're not searching, exit</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><span style="COLOR: #0000ff">if</span> (!mbSearching)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #0000ff">return</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> HTMLDocument myDoc = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #0000ff">try</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><span style="COLOR: #008200">//Get the web browser document</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>  myDoc = <span style="COLOR: #0000ff">new</span> HTMLDocumentClass();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>  myDoc = (HTMLDocument) WebBrowser.Document;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span><span style="COLOR: #008200">//Find the textbox</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>  HTMLInputElement objTextBox = (HTMLInputElement) myDoc.all.item(<span style="COLOR: #848284">"q"</span>, 0);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>  objTextBox.value = txtSearchFor.Text;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span><span style="COLOR: #008200">//Click the selected button</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span><span style="COLOR: #0000ff">string</span> strBtn = (rdoClickSearch.Checked ? <span style="COLOR: #848284">"btnG"</span> : <span style="COLOR: #848284">"btnI"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>  HTMLInputElement btnSearch = (HTMLInputElement) myDoc.all.item(strBtn, 0);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>  btnSearch.click();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span><span style="COLOR: #0000ff">catch</span> (Exception ex)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span>  MessageBox.Show(<span style="COLOR: #848284">"Error:"</span> + ex.Message);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span><span style="COLOR: #0000ff">finally</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span><span style="COLOR: #008200">//Release memory</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span>  myDoc = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span><span style="COLOR: #008200">//Clear <span style="COLOR: #848284">"searching"</span> flag</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span> mbSearching = <span style="COLOR: #0000ff">false</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span>}</pre><b>Some example screenshots</b><br /><br /><img src="/Uploads/41/Screenshot1.jpg" border="0" /><br /><br /><img src="/Uploads/41/Screenshot2.jpg" border="0" />]]></description> 
					<pubDate>Fri, 10 Mar 2006 04:16:44 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/3/9/websitetesting/</guid>
				</item>
			
				<item>
					<title>URL Rewriter - Database Driven (C#)</title> 
					<link>http://keylimetie.com/blog/2006/3/9/urlrewriter/</link> 
					<description><![CDATA[Yeah yeah yeah...I know...I need to get this done!<br /><br />I finally published this article...<br />see: <a href="/ShowItem48.aspx">http://www.brianpautsch.com/ShowItem48.aspx</a><br /><br />(I created a new entry so that RSS subscribers would see the new article.)]]></description> 
					<pubDate>Fri, 10 Mar 2006 04:15:11 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/3/9/urlrewriter/</guid>
				</item>
			
				<item>
					<title>Simple 3DES Encryption</title> 
					<link>http://keylimetie.com/blog/2006/3/7/simple3desencryption/</link> 
					<description><![CDATA[Looking for a simple class to encrypt/decrypt strings such as passwords? Use this one...it's about as easy as it gets. And be sure to add a plain text phrase in your web.config (key="EncryptionKey") or hard code it in the app to make it impossible to find.<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">using</span> System;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">using</span> System.Configuration;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">using</span> System.Security.Cryptography;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><span style="COLOR: #0000ff">using</span> System.Text;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span><span style="COLOR: #0000ff">namespace</span> com.BrianPautsch
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">class</span> Cryptology
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><span style="COLOR: #6699cc">  #region Encrypt</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>  <span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #0000ff">string</span> Encrypt(<span style="COLOR: #0000ff">string</span> strPlainText)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>   TripleDESCryptoServiceProvider objDES = <br />		<span style="COLOR: #0000ff">new</span> TripleDESCryptoServiceProvider();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>   MD5CryptoServiceProvider objMD5 = <br />		<span style="COLOR: #0000ff">new</span> MD5CryptoServiceProvider();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>   <span style="COLOR: #0000ff">string</span> strKey = <br />		ConfigurationSettings.AppSettings[<span style="COLOR: #848284">"EncryptionKey"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>   objDES.Key = objMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strKey));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>   objDES.Mode = CipherMode.ECB;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>   ICryptoTransform objDESEncrypt = objDES.CreateEncryptor();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>   <span style="COLOR: #0000ff">byte</span>[] arrBuffer = ASCIIEncoding.ASCII.GetBytes(strPlainText);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>   <span style="COLOR: #0000ff">return</span> Convert.ToBase64String(objDESEncrypt.TransformFinalBlock(<br />		arrBuffer, 0, arrBuffer.Length));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span><span style="COLOR: #6699cc">  #endregion</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span><span style="COLOR: #6699cc">  #region Decrypt</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span>  <span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #0000ff">string</span> Decrypt(<span style="COLOR: #0000ff">string</span> strBase64Text)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span>   TripleDESCryptoServiceProvider objDES = <br />		<span style="COLOR: #0000ff">new</span> TripleDESCryptoServiceProvider();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span>   MD5CryptoServiceProvider objMD5 = <br />		<span style="COLOR: #0000ff">new</span> MD5CryptoServiceProvider();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span>   <span style="COLOR: #0000ff">string</span> strKey = <br />		ConfigurationSettings.AppSettings[<span style="COLOR: #848284">"EncryptionKey"</span>].ToString();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span>   objDES.Key = objMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strKey));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span>   objDES.Mode = CipherMode.ECB;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span>   ICryptoTransform objDESEncrypt = objDES.CreateDecryptor();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span>   <span style="COLOR: #0000ff">byte</span>[] arrBuffer = Convert.FromBase64String(strBase64Text);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span>   <span style="COLOR: #0000ff">return</span> ASCIIEncoding.ASCII.GetString(objDESEncrypt.TransformFinalBlock(<br />		arrBuffer, 0, arrBuffer.Length));
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span><span style="COLOR: #6699cc">  #endregion</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">36</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">37</span>}</pre>]]></description> 
					<pubDate>Wed, 08 Mar 2006 02:40:43 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/3/7/simple3desencryption/</guid>
				</item>
			
				<item>
					<title>Hide DataGrid columns when they are dynamically generated</title> 
					<link>http://keylimetie.com/blog/2006/3/6/hidedatagridcolumns/</link> 
					<description><![CDATA[In a recent project I was working on, I needed to hide DataGrid columns in a table where the columns are dynamically generated. I thought I might be able to do it after binding to the DataGrid or during the DataBinding event, but no luck. It turns out you have to hide the cells in each row (including the header and footer) during the DataGrid's ItemDataBound event. By the way, in my example, I have an 'Edit' column in the first columns always...so remember that when you implement this solution.<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #008200">//Private constants/variables</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">const</span> <span style="COLOR: #0000ff">int</span> mintNumColsToShow = 4;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">int</span> mintColCt = 0;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #008200">//In some method...get data and bind to DataGrid</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>objDataSvc = <span style="COLOR: #0000ff">new</span> DataSvc();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>DataTable objDT = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>objDT = objDataSvc.GetData();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>mintColCt = objDT.Columns.Count;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>dgResults.DataSource = objDT;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>dgResults.DataBind();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span><span style="COLOR: #008200">//DataGrid's ItemDataBound event</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">void</span> dgResults_ItemDataBound(<span style="COLOR: #0000ff">object</span> sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span> <span style="COLOR: #008200">//Only show first n columns (including 'Edit')</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span> <span style="COLOR: #0000ff">if</span> (mintColCt > mintNumColsToShow)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>  <span style="COLOR: #0000ff">for</span> (<span style="COLOR: #0000ff">int</span> intCt = mintNumColsToShow + 1; intCt <= mintColCt; intCt++)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>   e.Item.Cells[intCt].Visible = <span style="COLOR: #0000ff">false</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span>}</pre>]]></description> 
					<pubDate>Tue, 07 Mar 2006 05:41:54 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/3/6/hidedatagridcolumns/</guid>
				</item>
			
				<item>
					<title>Zip Code Search Within A Radius (C#)</title> 
					<link>http://keylimetie.com/blog/2006/3/1/zipcodesearch/</link> 
					<description><![CDATA[There are a lot of industries that need to show their data results based on proximity to a specified zip code. Some include car dealers, real estate agencies, job listers, etc. A few of my customers have asked for this capability and instead of buying a boxed solution and subscribing to a zip code list, I decided to build it myself, maintain it myself and bill each customer for usage. Actually, it's not that difficult. Once you figure out some of the radius and distance calculations and where to get current zip code data from, it's as simple as creating a few SQL Server User Defined Functions and a service to periodcially update your database.<br /><br /><a href="/Uploads/37/ZipCodeDistance.zip" target="_blank">Download code</a><br /><br /><strong>Sample House Search Application</strong><br /><img src="/Uploads/37/Screenshot.jpg" border="0" /><br /><br /><b>Database</b><br />At a minimum, you'll need a database with zip codes and their latitude and longitude coordinates. My example includes a database with all of the zip codes for Illinois along with the City, State, Latitude and Longitude.<br /><br /><strong>Functions</strong><br /><a href="/Uploads/37/RadiusFunc.htm" target="_blank">RadiusFunc</a> : Accepts @ZipCode (zip code) and @Miles (distance from zip code in miles) and returns the Maximum Latitudes and Longitudes for the radius of the zip code.<br /><a href="/Uploads/37/DistanceFunc.htm" target="_blank">DistanceFunc</a> : Accepts Latitudes and Longitudes for two zip codes and returns their distance Miles.<br /><br /><strong>Stored Procedures</strong><br /><a href="/Uploads/37/spHouses_GetNearZipcode.htm" target="_blank">spHouses_GetNearZipcode</a>: Accepts @ZipCode (zip code) and @Miles (distance from zip code in miles) and returns the houses listed in the radius.<br /><br /><strong>Default.aspx</strong><br /><a href="/Uploads/37/Default.aspx.htm" target="_blank">Default.aspx</a>: Simple example where the user enters in a zip code, selects a distance from zip code radius and clicks enter to get results. Results are then bound to a repeater.<br /><br /><strong>Default.aspx.cs</strong><br /><a href="/Uploads/37/Default.aspx.cs.htm" target="_blank">Default.aspx.cs</a> : Nothing special about this code...the real logic for zip code searching is in the database!]]></description> 
					<pubDate>Thu, 02 Mar 2006 04:15:21 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/3/1/zipcodesearch/</guid>
				</item>
			
				<item>
					<title>Dynamic IP Address Emailer - No need to buy a Static IP Address! (VB.NET)</title> 
					<link>http://keylimetie.com/blog/2006/2/18/dynamicipaddressemailer/</link> 
					<description><![CDATA[A few months ago, a business partner and I sold our eBay drop-off store. We opened it in July of 2004 and it was the first eBay drop-off store in the Chicagoland area (maybe all of IL). It was working out OK, but we realized it would never be a huge money maker. The new owner just opened a new location in Manhattan...check it out: <a href="http://www.yourauctionpros.com" target="_blank">http://www.yourauctionpros.com</a> <br /><br />When we had the store, we had Yahoo DSL. I believe they wanted $40 or $50 for a static IP Address. It wasn't that important we have one, but we wanted one. I developed software for the store that managed the eBay auctions (it talked to eBay via APIs), automated the image resixing, created templates, talked with PayPal (also via APIs), managed out customers, balanced out acounting, etc. Well the software was an ever evolving product which required me to log into the system and migrate new versions. A dynamic IP Address would not do as migrations usually occured during non-business hours. <br /><br /><b>Solution:</b> IP Address Sender - A windows service that checks the IP Address in the router and emails it to desigated email addresses when it changes. <br /><br /><a href="/Uploads/35/IPAddressSearcher.zip" target="_blank">Download code - Windows version to test with</a> <br /><a href="/Uploads/35/IPAddressSender.zip" target="_blank">Download code - Windows Service</a> <br /><br /><b>Application configuration settings</b> <br /><a href="/Uploads/35/App.config.htm" target="_blank">App.config</a>: The app.config file contains all of the settings you need to make this work for a Linksys router. I have tested it with two models (WRT54G - Wireless-G Broadband Router and BEFCMU10 - Cable Modem with USB and Ethernet Connections). The key names are pretty self-explanatory, but here are a few of the important ones: <br />
<li>Interval - How often will the service check (in milliseconds) 
</li><li>EmailUserName and EmailPassword - For email authentication, if necessary 
</li><li>RouterPage - Page in router intranet site that has the IP Address listed 
</li><li>RouterUserName - Username for logging into router intranet site. Note: Linksys default is " ", not "" 
</li><li>RouterPassword - I believe the Linksys default is "admin" 
</li><li>RouterPatternStart - Regular expression pattern before the IP Address to match 
</li><li>RouterPatternEnd - Regular expression pattern after the IP Address to match <br />The Start/End Patterns matches are needed since the router page may list multiple IP Addresses. <br /><br /><b>Main class that does everything</b> <br /><a href="/Uploads/35/clsMain.vb.htm" target="_blank">clsMain.vb</a>: The code is well commented, but a few things are worth noting: <br />
</li><li>Line 115: WebRequest object is used to get the router's HTML 
</li><li>Line 117: Credentials are supplied since the router's intranet sites requires authentication 
</li><li>Line 124-128: A regular expression is used to find a match on the IP Address 
</li><li>Line 136: Saves the IP Address to a physical file at the install path 
</li><li>Line 142: If the IP Address has been updated, an email is sent 
</li><li>Line 166: The new IP Address is saved to the physical file <br /><br /><b>A word on Windows Services...</b> <br />Also included in the download zip file are two batch files which make installing and uninstalling the Windows Service a breeze. Be sure to update the paths first! Also, when Windows Services are installed and started, the ApplicationName.exe.config settings are loaded into memory. Any changes to this file will not take effect unless the service is uninstalled and reinstalled.</li>]]></description> 
					<pubDate>Sat, 18 Feb 2006 17:20:38 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/2/18/dynamicipaddressemailer/</guid>
				</item>
			
				<item>
					<title>Find Windows Fast! Replace ALT-TAB</title> 
					<link>http://keylimetie.com/blog/2006/2/6/findwindowsfastreplace/</link> 
					<description><![CDATA[Yesterday, a friend told me about TopDesk by Otaku Software. I downloaded the trial version, installed it and messed around with it a little. If you haven't seen this yet, it's pretty cool. What is it? According to their <a href="http://www.otakusoftware.com/topdesk/index.html">website</a>: "<i> Find windows, fast. TopDesk is a quick and easy way to switch between applications. With a single key press, you can instantly view thumbnails of all open windows, display thumbnails of windows belonging to the current application, or hide all windows to quickly access the desktop.</i>" Basically, it's a replacement for ALT-TAB in Windows.<br /><br />Immediately, I starting thinking of how to code something like this. At first thought, I believe I'd need:<br />1. An application running in the background t<br />    - Capture windows and cache them for quick display<br />    - Intercept the ALT-TAB keystroke combination<br />    - Display the open windows (tiled, cascaded, spatial)<br />    - Allow tabbing across windows or use of mouse<br />2. A SysTray icon to a setup window t<br />    - Makes changing options easy<br />    - Make enabling/disabling the application easy<br />3. A registry setting to load the application upon Windows start up.<br /><br />So today, I'm starting to work on recreating this in C#. Stay tuned for periodic updates and email me if you have any suggestions or questions.]]></description> 
					<pubDate>Tue, 07 Feb 2006 02:32:11 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/2/6/findwindowsfastreplace/</guid>
				</item>
			
				<item>
					<title>PayPal API and Checkout Integration</title> 
					<link>http://keylimetie.com/blog/2006/1/28/paypalapi/</link> 
					<description><![CDATA[While building websites over the past few years, many customers have asked for a seamless PayPal integration. Until a couple years ago, this wasn't very easy. Now that PayPal has their library of Web Controls and API interfaces, integrating an ecommerce website with PayPal is very easy. This example website shows you how to do it. <br /><br /><b>Getting started:</b><br />1. Download and read the <a href="/Uploads/33/PayPalIntegrationGuide.pdf" target="_blank">PayPal API Integration Guide</a><br />2. Create a PayPal Developer account at <a href="http://www.paypal.com/cgi-bin/webscr?cmd=p/pdn/intro-outside" target="_blank">http://www.paypal.com/cgi-bin/webscr?cmd=p/pdn/intro-outside</a><br />3. Create a PayPal account (if you don't have one already) and get your account Verified.<br />4. In your PayPal account, under 'Profile -> API Access', create an API certificate and convert it to a PDT key at <a href="http://www.paypaltech.com/" target="_blank">http://www.paypaltech.com</a><br /><br /><a href="/Uploads/33/PayPalTest.zip" target="_blank">Download code</a> <br /><br /><b>1. Webpage interface and code behind</b><br />I created a simple DataGrid that binds to a DataTable. To allow for RadioButtons in a datagrid, I chose to use the MetaBuilders custom RadioButton control. <br /><img src="/Uploads/33/Website.jpg" border="1" /><br /><br /><a href="/Uploads/33/Default.aspx.cs.htm" target="_blank">Lines 57-75</a>: On Page_Load, not IsPostBack, I create a DataTable of IPod products, bind them to the DataGrid and Save them to Session State. Also, we assign the PayPal email address to the checkout button on Page_Load. <br /><a href="/Uploads/33/Default.aspx.cs.htm" target="_blank">Lines 115-141</a>: This event fires by the PayPal UploadCompleteCartButton button. To pass shopping cart items to PayPal, create and populate a "CartItem" object for each product and add them to the UploadCompleteCartButton button. Then, populate the "CustomerInfo" object in the UploadCompleteCartButton. And finally, populate the "Custom" property with the order number key from your system and set the return URL to "PDTHandler.aspx". PDTHandler.aspx is a page we will create to read PayPal's response to our transaction. <br /><br /><b>Upon clicking the "PayPal Checkout" button...</b><br />The user is taken to PayPal.com where they can login, create an account or simply checkout (PayPal no longer requires an account to make a credit card purchase!). <br /><img src="/Uploads/33/PayPal1.jpg" border="1" /> <br /><br /><b>Upon logging in...</b><br />The user will see the product they selected and can checkout (Note: change code to send description only!). <br /><img src="/Uploads/33/PayPal2.jpg" border="1" /> <br /><br /><b>2. Upon Checkout...PDTHandler.aspx</b> <br />When the user completes the transaction (or cancels), PayPal will automatically reroute them to the "ReturnUrl" specified in the UploadCompleteCartButton's click event.<br /><a href="/Uploads/33/PDTHandler.aspx.cs.htm" target="_blank">Lines 37-53</a>: On Page_Load, we check to see if a transaction was returned (if not, the user canceled the PayPal transaction). If there is a transaction, we call "GetPDT" to get the transaction details.<br /><a href="/Uploads/33/PDTHandler.aspx.cs.htm" target="_blank">Lines 57-88</a>: GetPDT makes an HttpWebRequest out to PayPal and receives a stream of text back. This text string is delimited with a newline and carriage return. The first line returns "SUCCESS" or "FAIL" and the remaining lines are the details. Each detail line is a named value pair collection delimited with an equal sign. Details on the response can be found on page 101 of the <a href="/Uploads/33/PayPalIntegrationGuide.pdf" target="_blank">PayPal API Integration Guide</a>.<br /><a href="/Uploads/33/PDTHandler.aspx.cs.htm" target="_blank">Lines 92-13</a>: GetPDTValue is a method I included to help you find specific transaction return values. Just pass in the PDT return string and the key and the value will be returned.<br />]]></description> 
					<pubDate>Sat, 28 Jan 2006 18:08:12 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/1/28/paypalapi/</guid>
				</item>
			
				<item>
					<title>ASP.NET Custom Events - UserControls and Pages</title> 
					<link>http://keylimetie.com/blog/2006/1/14/aspnetcustomevents/</link> 
					<description><![CDATA[I have been working on a project that uses a lot of UserControls. Often, multiple UserControls are loaded onto the same Page. And in some cases, what is processed on the PostBack of one userControl has a direct effect on the data displayed on the base page or another UserControl. The problem is that the Page and UserControls have already loaded and run through their Page_Load events. How do you handle this? <br /><br /><b>Answer: Custom Events</b><br />Actually, it's very simple. This article explains the most common scenario. <br /><br /><b>Users tab:</b><br /><img src="/Uploads/32/UsersTab.jpg" border="0" /><br /><br /><b>Tasks tab:</b><br /><img src="/Uploads/32/TasksTab.jpg" border="0" /><br /><br />Problem: We have a base Page that holds two UserControls: Users and Tasks (see above). Our Users UserControl allows the users to be added/updated/deleted. The Tasks UserControl allows tasks to be created and assigned to users. When the Page loads for the first time, both UserControls are loaded for the first time and their dropdownlists are also loaded once (including the list of users on the Tasks UserControl). <br /><br />On subsequent posts, the Page.IsPostBack property is checked and the trips to the database are saved. When a user is added on the Users UserControl, the cmdSave (Save button) event triggered and the user is added to the database...but it isn't reflected in the Tasks UserControl. Here's what needs to be done: <br /><br /><b>1. Users UserControl code</b> - Declare a custom event (UCUpdated) and a generic method (RaiseUCUpdatedEvent) to call to fire the event. When appropriate, call RaiseUCUpdatedEvent. In the example below, a user is deleted so we must refresh the tasks' users dropdownlist otherwise we'll get referencial integrity errors when trying to assign a task to the deleted user. <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #008200">//Declare event</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #0000ff">event</span> CommandEventHandler UCUpdated;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><span style="COLOR: #008200">//Method to fire event</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #0000ff">void</span> RaiseUCUpdatedEvent(<span style="COLOR: #0000ff">string</span> strMessage)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> CommandEventArgs args = <span style="COLOR: #0000ff">new</span> CommandEventArgs(<span style="COLOR: #848284">"UCUpdated"</span>, strMessage);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span> UCUpdated(<span style="COLOR: #0000ff">this</span>, args);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>}
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span><span style="COLOR: #008200">//Sample code that triggers the event to fire</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>objDataSvc.DeleteProjectUsers(intProjectUserID);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span><span style="COLOR: #0000ff">if</span> (objDataSvc.ErrorCode == 0)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span> lblMessage.Text = <span style="COLOR: #848284">"Delete successful!"</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span> RefreshDataGrid();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span> RaiseUCUpdatedEvent();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>}
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span></pre><b>2. Page code</b> - In the Page_Load event, add an event handler for the Users UserControl UCUpdated event that references a private method. In the example below, we simply call the public method "Load ProjectUsers()" in the Tasks UserControl. This method clears the dropdownlist and loads the current project users (same method called in the Tasks UserControl's Page_Load when Page.IsPostBack is false. <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #008200">//Page_Load - add event handler</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #0000ff">void</span> Page_Load(<span style="COLOR: #0000ff">object</span> sender, System.EventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> ucProjectUsers.UCUpdated += <span style="COLOR: #0000ff">new</span> System.Web.UI.WebControls.CommandEventHandler(ucProjectUsers_UCUpdated);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>}
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><span style="COLOR: #008200">//Event handler</span><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #0000ff">void</span> ucProjectUsers_UCUpdated(<span style="COLOR: #0000ff">object</span> sender, System.Web.UI.WebControls.CommandEventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span> ucProjectTasks.LoadProjectUsers();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>}
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span></pre>]]></description> 
					<pubDate>Sat, 14 Jan 2006 20:57:27 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2006/1/14/aspnetcustomevents/</guid>
				</item>
			
				<item>
					<title>Windows 2003 Firewall - Allow FTP in Passive Mode</title> 
					<link>http://keylimetie.com/blog/2005/12/11/windows2003firewall/</link> 
					<description><![CDATA[Over the past few years, I have written many applications that are stand-alone executables (Win Forms) that manage all of the business' information locally and then sync up with a web server (real time or periodically). These applications (inventory, eBay-related, apartment finders, photography studios, etc.) will sync information through secure web services but often need to FTP files (PDFs, images, etc.). To do so, I have a C# FTP class I wrote awhile ago and have modified over the years.<br /><br />Recently, I changed hosting providers. I had a dedicated server with Verio (San Jose Data Center) for about 5 years and just moved over to Interland (Georgia Data Center) about 6 months ago. My old servers had Windows 2000 Server and I was running ISS Black Ice firewall. It worked great and I had planned to use it on my new servers...unfortunately, Black Ice doesn't support Windows 2003 Server (at least not officially). Well that's not something I can hope works.<br /><br />So what firewall do I go with? I spoke with some colleagues who run data centers and of course, they wanted me to go with a hardware solution (i.e. Cisco PIX). Interland wants $200 setup + $200 per month...a little pricey. As for software solutions, Microsoft's ISA (Internet Security and Accelerator) Server 2004 lead the reviews, but also costs $1,500. According to my colleagues, ISA should run on its own box...running with SQL Server, IIS 6.0, Email, etc. might be a bit too much for the servers. Another option is the firewall built into Windows Server 2003. It's a very basic firewall that either opens a port or does not open a port. In that sense, it's great if you have very basic rules...but it's meant for single servers only.<br /><br />Since this was my case, I decided to go with the Windows Server 2003 built-in firewall. Almost immediately, I found out my applications could not FTP images to the server...it could login, change directories and create directories, but could not "put" files on the server. So quickly I learned about Active vs Passive FTP.<br /><br />Basically, Active FTP connects to the FTP server's command port (21) and transfers data to the FTP server's data port (20). Well that's what I thought I was doing, but with both ports open it still didn't work. Then I reviewed my code and realized I was issuing the "PASV" command which puts the code into Passive mode. Passive FTP also connects to FTP server's command port (21), but transfers data to a randomly negotiated port (> 1024) on the FTP server. The problem here is that all of these ports are closed by the firewall so it can;t work.<br /><br />So how do I solve this problem? a) I could add code to use Active FTP, but I don't have the time...plus it appears to be very difficult as very few people have done it. b) Purchase a third-party component (Rebex seems to be best) for about $250...eh. c) Figure out a way to get the data through the firewall with the current software.<br /><br />Obviously, choice "c" is preferable, so I started to look around. After searching all over, I finally found a post where someone figured it out...here's what you do:<br /><br />
<p>1. Open the Control Panel and activate the Windows Firewall control.<br />2. Click on the Advanced tab, select the network interface that the FTP is bound to and make sure that this option is checked to enable the firewall for this interface. <br />3. Click on the "Settings..." button.<br />4. Click on the Services tab and CLEAR the check box for the "FTP Server" option. I know this makes no sense, but neither does the conflict between server and firewall!<br />5. Click on the "OK" button to close the Advanced Settings dialog.<br />6. Click on the Exceptions tab, then click on the "Add Program" button.<br />7. Browse to "C:\WINDOWS\SYSTEM32\INETSRV\inetinfo.exe" and double click on this file to select it.<br />8. You may want to use the "Change Scope..." button to narrow the range of IP addresses that can contact the FTP server.<br />9. Click on the "OK" button to close the Add a Program dialog.<br />10. Click on the "OK" button to close the Windows Firewall control.<br />11. You may need to reboot for the changes to take effect since "inetinfo.exe" runs as a service. I just restarted IIS.<br /><br /><br /><img src="/Uploads/30/firewall.jpg" border="0" /><br /><br /></p>]]></description> 
					<pubDate>Sun, 11 Dec 2005 17:30:49 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/12/11/windows2003firewall/</guid>
				</item>
			
				<item>
					<title>Captcha - Implement into an ASP.NET application</title> 
					<link>http://keylimetie.com/blog/2005/12/1/captcha/</link> 
					<description><![CDATA[Last night, I was over at my friend Jim's house working on some eBay and PayPal stuff. Jim was setting up a new eBay and PayPal account when he was presented with a Captcha image. He knew what he had to do, but asked me what it's purpose was. So it got me to thinking...what would it take to implement a Captcha image into an ASP.NET web application?<br /><br /><a href="/Uploads/28/Captcha.zip" target="_blank">Download code</a><a href="/Uploads/28/Default.aspx" target="_blank"><br /></a><br /><strong>Background</strong><br />Captcha - <a href="http://en.wikipedia.org/wiki/Captcha" target="_blank">Wikipedia's Definition</a>: (acronym for "<strong>c</strong>ompletely <strong>a</strong>utomated <strong>p</strong>ublic <strong>T</strong>uring test to tell <strong>c</strong>omputers and <strong>h</strong>umans <strong>a</strong>part") is a type of challenge-response test used in computing to determine whether or not the user is human. The term was coined in 2000 by Luis von Ahn, Manuel Blum, and Nicholas J. Hopper of Carnegie Mellon University, and John Langford of IBM. A common type of captcha requires that the user type the letters of a distorted and/or obscured sequence of letters or digits that appears on the screen. Because the test is administered by a computer, in contrast to the standard Turing test that is administered by a human, a captcha is sometimes described as a reverse Turing test.<br /><br /><img src="/Uploads/28/Screenshot.jpg" border="0" /><br /><br />Basically, it's a distorted image of a sequence of letters and/or numbers. In order to proceed on a website, it requires the user to enter the value in a text box. Because the text is warped and the image area is filled with sprinkled pixels and shapes, it makes it almost impossible for a computer to read.<br /><br /><strong>1. Create a class to generate the image</strong> - There are tons of examples online on how to create new bitmaps and add text and graphics. I used some of the experience I have with GDI and took some code from online examples. GDI isn't too difficult to code, but requires a good memory managment!<br /><br /><a href="/Uploads/28/CaptchaImage.cs.htm" target="_blank">View the class code</a><br /><br /><strong>2. Create an ASP.NET page to output the JPEG image</strong> - I searched all over for a way to load a binary output stream into the Image control, but no luck. It appears it is not possible without creating another page...so that's what I did. This page (CreateCaptcha.aspx) randomly creates a Captcha string, loads it into Session State (for verification later), instantiates the CaptchaImage class (which also creates the Captcha image), changes the Response ContentType to "image/jpeg" and writes the image to the Response output stream.<br /><br /><a href="/Uploads/28/CreateCaptcha.aspx.cs.htm" target="_blank">View the code behind</a><br /><br /><strong>3. Create the webpage to display the Captcha image</strong> - The validation of the Captcha text is trivial, but the thing to learn here is how to load the image. In the ASPX HTML, you need to define the image tag like s <em><img src="CreateCaptcha.aspx"></em> When this is executed on the server, CreateCaptcha.aspx is invoked and the response is loaded into the image source.<br /><br /><a href="/Uploads/28/Default.aspx.htm" target="_blank">View the ASPX code</a><br /><a href="/Uploads/28/Default.aspx.cs.htm" target="_blank">View the code behind</a>]]></description> 
					<pubDate>Fri, 02 Dec 2005 01:46:05 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/12/1/captcha/</guid>
				</item>
			
				<item>
					<title>PDFBox in .NET - Easily Convert PDFs to Text</title> 
					<link>http://keylimetie.com/blog/2005/11/23/pdfboxinnet/</link> 
					<description><![CDATA[I've been working with the Lucene.NET library for over a year now and am constantly finding new ways to integrate it into websites and applications. Several of my customers use a customized version of the <a href="/ShowItem10.aspx">Desktop Search application</a>. I have also integrated the <a href="/ShowItem19.aspx">Website Spider for Lucene</a> I created into many websites. For some time now, I've been looking for an open source approach to extracting the raw text from PDF files. I searched all over the place and have finally found it! <a href="http://www.pdfbox.org" target="_blank">PDFBox</a> is an open source Java PDF library. The .NET version is available at <a href="http://www.ikvm.net" target="_blank">IKVM.NET</a> .<br /><br /><a href="/Uploads/29/PDFBoxInDotNet.zip" target="_blank">Download code</a> (5.8 Mb, including all PDFBox DLLs) <br /><br />To convert a PDF to text, it's this simple: <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">using</span> org.pdfbox.pdmodel;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">using</span> org.pdfbox.util;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"></span>...
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">134</span> PDDocument objDocument = PDDocument.load(strFileName);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">136</span> PDFTextStripper objTextStripper = <span style="COLOR: #0000ff">new</span> PDFTextStripper();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">137</span> txtText.Text = objTextStripper.getText(objDocument);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right"></span>...</pre><p>It seems to run pretty fast, I extracted the text from a 2.3 Mb PDF in 5.2 sec.</p>]]></description> 
					<pubDate>Thu, 24 Nov 2005 02:57:45 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/11/23/pdfboxinnet/</guid>
				</item>
			
				<item>
					<title>.NET Zip Class (C#)</title> 
					<link>http://keylimetie.com/blog/2005/11/5/netzipclass/</link> 
					<description><![CDATA[A couple weeks ago, a colleague and I were in need of a class that could handle compressing and extracting files. It had to handle "zip" and "jar" files and needed to interface with a .NET application. There were several COM components available, but we wanted a managed code solution. We searched through the web and there were a few example of developers "trying" to get it to work, but each example had a problem or two. Then we came across an article in MSDN Magazine: <a href="http://msdn.microsoft.com/msdnmag/issues/03/06/ZipCompression/" target="_blank">Using the Zip Classes in the J# Class Libraries to Compress Files and Data with C#</a> . It was exactly what we were looking for and we implemented it very easily. So I decided to take an hour or so to create a simple application that uses the zip class.<br /><br /><a href="/Uploads/26/DotNetZipSoln.zip" target="_blank">Download application</a><br /><br /><strong>Zip Class - </strong><a href="/Uploads/26/DotNetZip.htm" target="_blank">View the class code</a><br /><strong><br />Zip Class Implementation - </strong><a href="/Uploads/26/frmMain.htm" target="_blank">View the form code-behind</a><br />]]></description> 
					<pubDate>Sat, 05 Nov 2005 16:08:52 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/11/5/netzipclass/</guid>
				</item>
			
				<item>
					<title>Google Search in IE Context Menu</title> 
					<link>http://keylimetie.com/blog/2005/10/22/googlesearchiniecontextmenu/</link> 
					<description><![CDATA[I spend a lot of time on Google and often jump to it from other sites to search for something I just read about. Wouldn't it be nice if I could just highlight text on a webpage, right-click and click "Search Google" from the context menu? Well now you can! About a year ago, I came across a Windows Tips and Tricks page and it explains a very easy way to do this.<br /><br /><a href="/Uploads/27/google.zip" target="_blank">Download code</a><br /><br />To add "Google Search" to your Internet Explorer context menu (like Firefox has), here's how.<br />According to Microsoft, this method of adding context items should work as early as IE4.<br />Download the above code instead of creating the files from scratch (much easier).<br /><br />Open notepad and paste the following code: <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span>Windows Registry Editor Version 5.00 <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Google As Is] <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>@=<span style="COLOR: #848284">"C:\\google_context_noquote.js"</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #848284">"Contexts"</span>=hex:10 <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Google w/Quotes] <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>@=<span style="COLOR: #848284">"C:\\google_context_quote.js"</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span><span style="COLOR: #848284">"Contexts"</span>=hex:10 
<p>You can change the paths to the js files if you want, just make sure you put the files where this says they are.<br />Save the file as google.reg, right-click it and select merge (or just double-click it).<br />Your registry was just updated to show two new entries in your IE context menu...now we need to create the js files.<br /><br />Open notepad, paste the following code and save it as "google_context_noquote.js":<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><script language=<span style="COLOR: #848284">"javascript"</span>> <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #008200">// Get the window object where the context menu was opened. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>var oWindow = window.external.menuArguments; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #008200">// Get the document object exposed through oWindow. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>var oDocument = oWindow.document; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #008200">// Get the selection from oDocument. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>var oSelect = oDocument.selection; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span><span style="COLOR: #008200">// Create a TextRange from oSelect. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>var oSelectRange = oSelect.createRange(); <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span><span style="COLOR: #008200">// Get the text of the selection. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>var sNewText = oSelectRange.text; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span><span style="COLOR: #008200">// Build Google QueryString </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>var googleQ = <span style="COLOR: #848284">"http://www.google.com/search?&q="</span> + sNewText; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span><span style="COLOR: #008200">// Ask Google </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>oWindow.open(googleQ); <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span></script> </p><p>Open notepad, paste the following code and save it as "google_context_quote.js":<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><script language=<span style="COLOR: #848284">"javascript"</span>> <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #008200">// Get the window object where the context menu was opened. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>var oWindow = window.external.menuArguments; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #008200">// Get the document object exposed through oWindow. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>var oDocument = oWindow.document; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span><span style="COLOR: #008200">// Get the selection from oDocument. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>var oSelect = oDocument.selection; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span><span style="COLOR: #008200">// Create a TextRange from oSelect. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>var oSelectRange = oSelect.createRange(); <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span><span style="COLOR: #008200">// Get the text of the selection. </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>var sNewText = oSelectRange.text; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span><span style="COLOR: #008200">// Build Google QueryString </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>var googleQ = <span style="COLOR: #848284">"http://www.google.com/search?&q=%22"</span> + sNewText + <span style="COLOR: #848284">"%22"</span>; <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span><span style="COLOR: #008200">// Ask Google </span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>oWindow.open(googleQ); <br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span></script></p><p>This will cause two new options to show up in the same menu that pops up when you have selected some text.<br />"Google As Is" sends a query to google with the selected text just as it is, no quotes.<br />"Google w/Quotes" does the same as above except it places quotes aroung the selected text.<br />You only need to restart your browser to get this to start working.</p>]]></description> 
					<pubDate>Sat, 22 Oct 2005 20:38:56 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/10/22/googlesearchiniecontextmenu/</guid>
				</item>
			
				<item>
					<title>File Migrator Version 2.0</title> 
					<link>http://keylimetie.com/blog/2005/10/1/filemigrator2/</link> 
					<description><![CDATA[I finally took this time to add more features to this application...and I think I'm done.<br />New features added:<br /> - Changed filtering to directional arrows (<, >, =)<br /> - Date span filtering<br /> - Datagrid color coding<br />    - White: not checked to migrate<br />    - Blue: checked to migrate<br />    - Green: current selected row<br />    - Red: files that might not want to be migrated (i.e. web.config)<br /> - Files that might not want to be migrated (i.e. web.config) are not checked to migrate by default<br /><br /><a href="/Uploads/24/FileMigrator.zip" target="_blank">Download application</a><br /><br />Below is a partial screenshot of the application (click image for large view).<br /><br /><a href="/Uploads/24/screenshot-large.jpg" target="_blank"><img src="/Uploads/24/screenshot-small.jpg" border="0" /></a>  <br /><br /><strong>Features coming soon:</strong><br />Impersonation - Maybe one day...if I find time...<br /><br />Please download and try the application out.]]></description> 
					<pubDate>Sat, 01 Oct 2005 18:19:19 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/10/1/filemigrator2/</guid>
				</item>
			
				<item>
					<title>File Migrator (Physical Files Diff Tool)</title> 
					<link>http://keylimetie.com/blog/2005/9/21/filemigrator/</link> 
					<description><![CDATA[Everyday, I'm working on anywhere from 1 to 5 personal or customer websites. When it's time to migrate changes made that day or over a period of time, it's very important to migrate everything that has changed. In the past, I simply compared the modified dates and migrated anything newer to the detination server. But that's not foolproof. What if the servers are on a different time zone. What if someone accidentally changes the date or time on your computer. To prevent these migration problems, I created an application that compares source and destination folders and determines what needs to be migrated in what direction.<br /><br /><a href="/Uploads/23/FileMigrator.zip" target="_blank">Download application</a><br /><br />Below is a partial screenshot of the application (click image for large view). It allows you to save profiles (different source/destination combinations for development, staging and production environments, for example). It also allows you to display only production files (.htm, .aspx, etc., NOT: .cs, .ascx, etc.) and which direction files need to be migrated. It also warns you when the web.config needs to be migrated (so you migrate it manually).<br /><br /><a href="/Uploads/23/screenshot-large.jpg" target="_blank"><img src="/Uploads/23/screenshot-small.jpg" border="0" /></a>  <br /><br /><strong>Features coming soon:</strong><br />Impersonation - Migrating files over a secure network doesn't work without the right credentials.<br />Date filtering - Ability to filter display by date range.<br /><br />Please download and try the application out. It's a work in progess, so please let me know what you think.]]></description> 
					<pubDate>Thu, 22 Sep 2005 04:54:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/9/21/filemigrator/</guid>
				</item>
			
				<item>
					<title>Item 34: Create Large-Grain Web APIs</title> 
					<link>http://keylimetie.com/blog/2005/8/8/item34/</link> 
					<description><![CDATA[When communicating over the web (web services or .NET Remoting), you must remember that the most expensive part of the operation comes when you transfer objects between distant machines. The more granular the API is, the higher percentage of time your application spends waiting for data to return from the server. Therefore, be sure to create web-based interfaces based on serializing documents or sets of objects between client and server. This way, the server receives all of the information it needs to complete the requested task.<br /><br />Here's an example of how <strong>NOT</strong> to code a web-based interface: <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #008200">//Create CartItem object on the server</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>CartItem objCart = <span style="COLOR: #0000ff">new</span> Server.CartItem();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #008200">//Round trip to set the ProductID</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>objCart.ProductID = 135;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #008200">//Round trip to set the Quantity</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>objCart.Quantity = 1;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><span style="COLOR: #008200">//Round trip to add the item</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>objCart.AddItem();</pre>Here's an example of a well designed web-based interface: <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #008200">//Create CartItem object on the client</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>CartItem objCart = <span style="COLOR: #0000ff">new</span> CartItem();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #008200">//Set local copy</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>objCart.ProductID = 135;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span><span style="COLOR: #008200">//Set local copy</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>objCart.Quantity = 1;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span><span style="COLOR: #008200">//One round trip to add the item</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>Server.AddItem(objCart);</pre>The above example is a simple example. To really make this more efficient, you need to apply this to real world scenarios and further examine what's being transmitted back and forth. For example, let's pretend you're writing a software system for an order intake company who has a few millions customers who each place 15-20 orders per year. You staff consist of 20 order operators plus a dozen or so people running reports or simply querying the database.<br /><br />When a customer calls, you might want to retrieve their orders so you create the following method:<br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> OrderData FindOrders(<span style="COLOR: #0000ff">string</span> strCustomerName)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> <span style="COLOR: #008200">//Return all orders for a customer searched by name</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>}</pre>That's OK, but why return all orders...how about just open orders. So we change it t<br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> OrderData FindOpenOrders(<span style="COLOR: #0000ff">string</span> strCustomerName)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> <span style="COLOR: #008200">//Return all open orders for a customer searched by name</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>}</pre>Better, but we're still requiring 2 data transmissions per phone call (one get, one save). Let's assume we could partition the call center into regions/states. At the beginning of the operator's shift he/she could retrieve all customers (with open orders) and open orders for the given region. As calls come in, the operator would never need to retrieve any information from the server. Once the call is completed, the operator could push the updates to the server and at the same time, retrieve any updates made since the last update (only 2-way transmission).<br /><br />But it can get even better! What if you only retrieved customers who have made purchases in the past 6 months. Anyone else probably won't be coming back and if so, we could always make a quick trip to get their data (well worth the saving on the initial data retrieval!). <br /><br />These are just a few reasons why...to read more, pick up "Effective C#: 50 Specific Ways to Improve Your C#" by Bill Wagner.<br /><br />You can buy it at the Addison-Wesley website: <a href="http://www.aw-bc.com/catalog/academic/product/0,1144,0321245660,00.html" target="_blank">http://www.aw-bc.com/</a>]]></description> 
					<pubDate>Mon, 08 Aug 2005 19:47:01 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/8/8/item34/</guid>
				</item>
			
				<item>
					<title>Lucene.NET - Index and Search Any Website</title> 
					<link>http://keylimetie.com/blog/2005/8/4/lucenenet/</link> 
					<description><![CDATA[One of my customers wanted to make their site searchable. They have a lot of content in different places (physical files, other websites, database, etc.). Trying to search all of these places real time would be a nightmare...and incredibly slow! So instead, I decided to build a web spider that caches the website content to a local drive on the web server and indexes the content into a Lucene index. The searches are now incredibly fast (under 1/2 sec), have relevancy scores and are merged. Some of the code was example code found at DotLucene (<a href="http://www.dotlucene.net/download/" target="_blank">http://www.dotlucene.net/download/</a>)...most of it is original. 
<p>This application shows you how to use Lucene to create a custom advanced search engine. There is way too much code to go over every part so I'm only discussing the important parts.<br /><br /><a href="/Uploads/19/LuceneWeb.zip" target="_blank">Download code</a>  <br /><br /><b>Admin page</b> - Allows user to index/re-index websites, delete indexed websites and index physical hard drive folders.<br /><br />"http://www.brianpautsch.com" is indexed in less than 5 seconds.<br /><img src="/Uploads/19/admin.jpg" border="0" /><br /><br />"C:\_Websites\" is indexed in less than 5 seconds.<br /><img src="/Uploads/19/admin2.jpg" border="0" /><br /><br /><a href="/Uploads/19/Admin.htm" target="_blank">Lines 138-153</a>: AddWebPage method: The spider calls this method for each link found. This method strips off any bookmarks, verifies the file extension is in our list of valid extensions and ensures the site is within our base URL. If all of these tests pass, an instance of WebPageState is created (URL loaded in constructor), a unique ID is assigned and the page is put in the queue of pages that need to be visited and indexed/cached.<br /><a href="/Uploads/19/Admin.htm" target="_blank">Lines 171-214</a> : Process method: This method makes a WebRequest to the URL, checks the status code, stores the HTML and sets the process success flags.<br /><a href="/Uploads/19/Admin.htm" target="_blank">Lines 261-269</a> : HandleLinks method: This method uses a regular expression to find all URL links on the page.<br /><a href="/Uploads/19/Admin.htm" target="_blank">Lines 272-285</a>: AddWebPageToIndex method: Once all of the information for the page is gathered this method is called to add the information to the index. Note that some fields are added as "UnIndexed", "Text", etc. Here's a little explanation on each:<br /><strong><em><strong><em>    </em></strong>Field.Keyword</em></strong> - The data is stored and indexed but not tokenized - (Last modified date, filename)<br /><strong><em><strong><em>    </em></strong>Field.Text</em></strong> - The data is stored, indexed, and tokenized - Searchable small text (Title)<br /><strong><em><strong><em>    </em></strong>Field.UnStored</em></strong> - The data is not stored but it is indexed and tokenized. (File content)<br /><strong><em>    Field.UnIndexed</em></strong> - The data is stored but not indexed or tokenized. (URL)<br /><br /><strong>Index/Cache Storage</strong><br />As new websites are indexed, they are stored in separate folders under the "...\LuceneWeb\WebUI\cache\" and "...\LuceneWeb\WebUI\index\" folders. The current version only allows for one index of the hard drive and it's stored in the "...\LuceneWeb\WebUI\index\folders\" folder. This logic could be easily changed to have multiple indices of the hard drive.<br /><img src="/Uploads/19/files.jpg" border="1" />  <br /><br /><b>Search page</b> - Allows user to select an index and search it.<br /><br />"http://www.gotdotnet.com" is searched for "microsoft" - 158 results found in .26 seconds.<br /><img src="/Uploads/19/search.jpg" border="0" /><br /><br />"C:\_Websites\" is searched for "search" - 10 results found in .63 seconds.<br /><img src="/Uploads/19/search2.jpg" border="0" /> <br /><br /><a href="/Uploads/19/Search.htm" target="_blank">Lines 145-217</a> : PerformSearch method - This is the main method for this class (code-behind). It starts off by determining the index location and creating an empty datatable of results. A basic query is performed (no special filtering, i.e. datetime, buckets) and returns a "Hits" object. A QueryHighlighter object is created and as each result is extracted the contents are highlighted. Finally, the datarow is saved to the datatable and later bound to the repeater.</p>]]></description> 
					<pubDate>Fri, 05 Aug 2005 02:59:29 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/8/4/lucenenet/</guid>
				</item>
			
				<item>
					<title>Item 21: Express Callbacks with Delegates</title> 
					<link>http://keylimetie.com/blog/2005/8/1/item21/</link> 
					<description><![CDATA[Callbacks are used to provide feedback from a server to a client asynchronously. They might involve multithreading, or they might simply provide an entry point for synchronous updates. Callbacks are expressed using delegates in the C# language.<br />Delegates provide type-safe callback definitions. Although the most common use of delegates is events, that should not be the only time you use this language feature. Delegates let you configure the target at runtime and notify multiple clients. A delegate is an object that contains a reference to a method. When performing multicast delegation, be sure to invoke each delegate target yourself. Each delegate you create should contain a list of delegates. To examine the chain yourself and call each one, iterate the invocation list yourself like s <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">delegate</span> <span style="COLOR: #0000ff">bool</span> ContinueProcessing();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> LengthyOperation(ContinueProcessing pred)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> <span style="COLOR: #0000ff">bool</span> bContinue = <span style="COLOR: #0000ff">true</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> <span style="COLOR: #0000ff">foreach</span> (ComplicatedClass cl <span style="COLOR: #0000ff">in</span> mobjContainer)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>  cl.DoLenghtyOperation();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>  <span style="COLOR: #0000ff">foreach</span> (ContinueProcessing pr <span style="COLOR: #0000ff">in</span> pred.GetInvocationList())
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>   bContinue &= pr();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>   <span style="COLOR: #0000ff">if</span> (!bContinue)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>    <span style="COLOR: #0000ff">return</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>}</pre>In the above example, I've defined the semantics so that each delegate must be true for the iteration to continue.<br /><br />These are just a few reasons why...to read more, pick up "Effective C#: 50 Specific Ways to Improve Your C#" by Bill Wagner<br /><br />You can buy it at the Addison-Wesley website: <a href="http://www.aw-bc.com/catalog/academic/product/0,1144,0321245660,00.html" target="_blank">http://www.aw-bc.com/</a>]]></description> 
					<pubDate>Tue, 02 Aug 2005 00:26:20 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/8/1/item21/</guid>
				</item>
			
				<item>
					<title>Item 14: Utilize Constructor Chaining</title> 
					<link>http://keylimetie.com/blog/2005/7/25/item14/</link> 
					<description><![CDATA[Writing constructors is often a repetitive task. Many developers write the first constructor and then copy and paste the code into another constrcutor to satisfy the multiple overrides defined in the class interface. Here's an example: <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">class</span> Menu
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> <span style="COLOR: #008200">//private variables</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">string</span> mstrName;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">string</span>[] marrItems;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> <span style="COLOR: #0000ff">public</span> Menu() : <span style="COLOR: #0000ff">this</span>(<span style="COLOR: #848284">""</span>, 0)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span> <span style="COLOR: #0000ff">public</span> Menu(<span style="COLOR: #0000ff">int</span> intNumItems) : <span style="COLOR: #0000ff">this</span>(<span style="COLOR: #848284">""</span>, intNumItems)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span> <span style="COLOR: #0000ff">public</span> Menu(<span style="COLOR: #0000ff">string</span> strName, <span style="COLOR: #0000ff">int</span> intNumItems)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>  marrItems = (intNumItems > 0) ? <span style="COLOR: #0000ff">new</span> <span style="COLOR: #0000ff">string</span>[intNumItems] : <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>        mstrName = strName;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>}</pre> This is not a good idea. A better approach is constrcutor chaining where you create a common method to do the initializing. Here's a better approach:<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">class</span> Menu
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> <span style="COLOR: #008200">//private variables</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">string</span> mstrName;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">string</span>[] marrItems;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> <span style="COLOR: #0000ff">public</span> Menu()
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>  MenuConstructor(<span style="COLOR: #848284">""</span>, 0);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span> <span style="COLOR: #0000ff">public</span> Menu(<span style="COLOR: #0000ff">int</span> intNumItems)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>  MenuConstructor(<span style="COLOR: #848284">""</span>, intNumItems);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span> <span style="COLOR: #0000ff">public</span> Menu(<span style="COLOR: #0000ff">string</span> strName, <span style="COLOR: #0000ff">int</span> intNumItems)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>  MenuConstructor(strName, intNumItems);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">void</span> MenuConstructor(<span style="COLOR: #0000ff">string</span> strName, <span style="COLOR: #0000ff">int</span> intNumItems)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span>  marrItems = (intNumItems > 0) ? <span style="COLOR: #0000ff">new</span> <span style="COLOR: #0000ff">string</span>[intNumItems] : <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span>  mstrName = strName;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span>}</pre>The second approach generates far more efficient code. In the first example, the compiler adds code to perform several functions on your behalf in constructors. It adds statements for all variable initializers and calls the base class constructor...this is a very big difference! Also consider readonly constants. By nature, they can only be set in the constructor. By centralizing this action, we avoid more redundancy.<br /><br />These are just a few reasons why...to read more, pick up "Effective C#: 50 Specific Ways to Improve Your C#" by Bill Wagner.<br /><br />You can buy it at the Addison-Wesley website: <a href="http://www.aw-bc.com/catalog/academic/product/0,1144,0321245660,00.html" target="_blank">http://www.aw-bc.com/</a>]]></description> 
					<pubDate>Tue, 26 Jul 2005 04:11:46 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/7/25/item14/</guid>
				</item>
			
				<item>
					<title>How to assign a default button to any control (C#)</title> 
					<link>http://keylimetie.com/blog/2005/7/23/defaultbutton/</link> 
					<description><![CDATA[When a web page has multiple buttons, you might want to change the default button in different cases. For example, imagine a web page that has a search area with datagrid results. The search area allows you to filter your search. When a result is selected to be edited, the fields that can be edited and a 'Save' button are displayed. If the 'Search' button is the default button, think about what happens when someone edits an item and hits 'Enter' while in an edit control field...'Search' is submitted, not 'Save'. Now you have to redo your changes and click 'Save'. <br /><br />A lot of people post the following solution:<br /><br /><b>Page.RegisterHiddenField("__EVENTTARGET", "cmdSave")</b> <br /><br />For some reason, this doesn't always work. Even when 'cmdSave' is set a the '__EVENTTARGET', the page is submitted but the button's event isn't fired. <br /><br />To resolve this, we need to submit the form ourselves. The following snippet of code shows how to assign submit buttons to controls (TextBoxes, DropDownLists, etc.). Once you implement the main method into your page's base class, it's only one line of code per control to set the default button. <br /><br /><b>1. Enum of Control Types</b> - This enumeration lists the control types you can set a default button for. Add more as needed. <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">enum</span> ControlTypes
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> None = 0,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> TextBox = 1,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> DropDownList = 2,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span> CheckBox = 3,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> ListBox = 4
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>}</pre><b>2. Method in Base Class to associate control to button</b> <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> SetDefaultButtonForControl(System.Web.UI.Page objPage,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span> Enums.ControlTypes intControlType, <span style="COLOR: #0000ff">object</span> objControl,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> System.Web.UI.WebControls.Button objButton)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> <span style="COLOR: #0000ff">string</span> strScript = @<span style="COLOR: #848284">"<SCRIPT language="</span><span style="COLOR: #848284">"javascript"</span><span style="COLOR: #848284">">
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>  <!--
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>  function catchKeyDown(btn, event)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>   if (document.all)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>   {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>    if (event.keyCode == 13)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>     event.returnValue=false;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>     event.cancel = true;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>     btn.click();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>   }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>   else if (document.getElementById)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>   {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>    if (event.which == 13)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span>     event.returnValue=false;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span>     event.cancel = true;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span>     btn.click();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span>   }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span>   else if(document.layers)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span>   {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span>    if(event.which == 13)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span>    {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span>     event.returnValue=false;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span>     event.cancel = true;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span>     btn.click();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span>    }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span>   }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">36</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">37</span>  // -->
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">38</span>  </SCRIPT>"</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">39</span> objPage.RegisterStartupScript(<span style="COLOR: #848284">"DefaultButtonForControl"</span>, strScript);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">40</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">41</span> <span style="COLOR: #008200">//Register with the control</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">42</span> <span style="COLOR: #0000ff">switch</span> (intControlType)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">43</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">44</span>  <span style="COLOR: #0000ff">case</span> Enums.ControlTypes.TextBox:
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">45</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">46</span>   TextBox objTextBox = objControl <span style="COLOR: #0000ff">as</span> TextBox;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">47</span>   objTextBox.Attributes.Add(<span style="COLOR: #848284">"onkeydown"</span>, <br /><span style="COLOR: #848284"><font color="#000000">             </font>"catchKeyDown("</span> + objButton.ClientID + <span style="COLOR: #848284">",event)"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">48</span>   <span style="COLOR: #0000ff">break</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">49</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">50</span>  <span style="COLOR: #0000ff">case</span> Enums.ControlTypes.DropDownList:
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">51</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">52</span>   DropDownList objDropDownList = objControl <span style="COLOR: #0000ff">as</span> DropDownList;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">53</span>   objDropDownList.Attributes.Add(<span style="COLOR: #848284">"onkeydown"</span>, <br /><span style="COLOR: #848284"><font color="#000000">             </font>"catchKeyDown("</span> + objButton.ClientID + <span style="COLOR: #848284">",event)"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">54</span>   <span style="COLOR: #0000ff">break</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">55</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">56</span>  <span style="COLOR: #0000ff">case</span> Enums.ControlTypes.ListBox:
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">57</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">58</span>   ListBox objListBox = objControl <span style="COLOR: #0000ff">as</span> ListBox;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">59</span>   objListBox.Attributes.Add(<span style="COLOR: #848284">"onkeydown"</span>, <br /><span style="COLOR: #848284"><font color="#000000">             </font>"catchKeyDown("</span> + objButton.ClientID + <span style="COLOR: #848284">",event)"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">60</span>   <span style="COLOR: #0000ff">break</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">61</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">62</span>  <span style="COLOR: #0000ff">case</span> Enums.ControlTypes.CheckBox:
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">63</span>  {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">64</span>   CheckBox objCheckBox = objControl <span style="COLOR: #0000ff">as</span> CheckBox;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">65</span>   objCheckBox.Attributes.Add(<span style="COLOR: #848284">"onkeydown"</span>, <br /><span style="COLOR: #848284"><font color="#000000">             </font>"catchKeyDown("</span> + objButton.ClientID + <span style="COLOR: #848284">",event)"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">66</span>   <span style="COLOR: #0000ff">break</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">67</span>  }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">68</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">69</span>}</pre><b>3. Implementation in webpage</b> - This example sets the 'cmdSearch' button as the default button for the txtSearchLastName, cboSearchDistrict and cboSearchRole search controls. It also sets the 'cmdSave' button as the default button for the 'txtNewQ1', 'txtNewQ2', 'txtNewQ3', 'txtNewQ4' and 'txtComments' edit controls. <pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">void</span> Page_Load(<span style="COLOR: #0000ff">object</span> sender, System.EventArgs e)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> <span style="COLOR: #0000ff">if</span> (!Page.IsPostBack)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>   SetDefaultButtonForControl(<span style="COLOR: #0000ff">this</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>       Enums.ControlTypes.TextBox, txtSearchLastName, cmdSearch);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span>   SetDefaultButtonForControl(<span style="COLOR: #0000ff">this</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>       Enums.ControlTypes.DropDownList, cboSearchDistrict, cmdSearch);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span>   SetDefaultButtonForControl(<span style="COLOR: #0000ff">this</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span>       Enums.ControlTypes.DropDownList, cboSearchRole, cmdSearch);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>   SetDefaultButtonForControl(<span style="COLOR: #0000ff">this</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span>       Enums.ControlTypes.TextBox, txtNewQ1, cmdSave);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span>   SetDefaultButtonForControl(<span style="COLOR: #0000ff">this</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>       Enums.ControlTypes.TextBox, txtNewQ2, cmdSave);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span>   SetDefaultButtonForControl(<span style="COLOR: #0000ff">this</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span>       Enums.ControlTypes.TextBox, txtNewQ3, cmdSave);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>   SetDefaultButtonForControl(<span style="COLOR: #0000ff">this</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span>       Enums.ControlTypes.TextBox, txtNewQ4, cmdSave);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span>   SetDefaultButtonForControl(<span style="COLOR: #0000ff">this</span>, 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span>       Enums.ControlTypes.TextBox, txtComments, cmdSave);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span>}</pre>]]></description> 
					<pubDate>Sat, 23 Jul 2005 21:17:25 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/7/23/defaultbutton/</guid>
				</item>
			
				<item>
					<title>Item 11: Prefer foreach Loops</title> 
					<link>http://keylimetie.com/blog/2005/7/18/item11/</link> 
					<description><![CDATA[The C# foreach statement generates the best iteration code for any collection you have. Examine these three loops:<br /><br />int[] foo = new int[100]<br /><br />//Loop 1<br />foreach (int i in foo)<br />    Console.Write(i.ToString());<br /><br />//Loop 2<br />for (int i = 0; i < foo.Length; i++)<br />    Console.Write(i.ToString());<br /><br />//Loop 3<br />int i = foo.Length;<br />for (int j = 0; j < i; j++)<br />    Console.Write(foo[j].ToString());<br /><br />For the current and future C# compilers (version 1.1 and up), loop 1 is the best. It's even less typing so productivity is also better. Note: The C# 1.0 compiler produced much slower code for loop 1, so loop 2 is the best in that version. By moving the "Length" variable out of the loop, you make a change that hinders the JIT compler's chance to remove range checking inside the loop.<br /><br />Loop 3 is the worst...the CLR guarantees that you cannot write code that overruns the memory your variables own. The runtime generates a test of the actual array bounds (not the "i" variable) before accessing each particular array element. You are now forcing the runtime to check the array index on every loop!<br /><br />Loop 1 is better than Loop 2 because you allow the compiler to check the upper and lower bounds. Some people still believe index variables start at 1, not 0. Loop 2 forces you to know the lower bound, whereas Loop 1 does the work for you.<br /><br />Custom objects/types: foreach allows you and your users to iterate across members if you support the .NET environment's rules for a collection.<br /><br />These are just a few reasons why...to read more, pick up "Effective C#: 50 Specific Ways to Improve Your C#" by Bill Wagner.<br /><br />You can buy it at the Addison-Wesley website: <a href="http://www.aw-bc.com/catalog/academic/product/0,1144,0321245660,00.html" target="_blank">http://www.aw-bc.com/</a>]]></description> 
					<pubDate>Tue, 19 Jul 2005 03:12:06 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/7/18/item11/</guid>
				</item>
			
				<item>
					<title>Item 1: Always Use Properties Instead of Accessible Data Members</title> 
					<link>http://keylimetie.com/blog/2005/7/11/item1/</link> 
					<description><![CDATA[If you're still creating public variables in your types, stop now. You should be using properties as they enable you to create an interface that acts like data access, but still has all of the benefits of a method. They also provide encapsulation, something you want as an object-oriented developer.<br /><br />The .NET Framework assumes you'll use properties for your public data members. The data binding code classes support properties but do not support public data members. For example:<br /><br />txtLastName.DataBindings.Add("Text", Employee, "LastName");<br /><br />This example bind the Text property of "txtLastName" TextBox control to the "LastName" property of the "Employee" object.<br /><br />As you already know, properties allow you to apply rules as to what data can be applied to your private variables. Properties allow you to apply those rules in one location...much easier to update in the future.<br /><br />These are just a few reasons why...to read more, pick up "Effective C#: 50 Specific Ways to Improve Your C#" by Bill Wagner.<br /><br />You can buy it at the Addison-Wesley website: <a href="http://www.aw-bc.com/catalog/academic/product/0,1144,0321245660,00.html" target="_blank">http://www.aw-bc.com/</a>]]></description> 
					<pubDate>Tue, 12 Jul 2005 01:23:21 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/7/11/item1/</guid>
				</item>
			
				<item>
					<title>C# Data Tier Generator + Stored Procedures</title> 
					<link>http://keylimetie.com/blog/2005/6/26/datatiergenerator/</link> 
					<description><![CDATA[After writing dozens of data tiers for many websites and applications, I felt it was time to write a data tier generator for myself. About 5 years ago, I created a data tier generator for VB6, but never really found time to create one for C#...until now. This generator has already saved me countless hours from writing classes (properties and methods) and stored procedures. Not only are they done for me now, but they're 100% accurate! 
<p><a href="/Uploads/12/DataTierGenerator.zip" target="_blank">Download application</a> <br /><br /><b>1. Run data tier generator</b><br />The application asks for three things:<br />Connection String: database you wish to generate the data tier for.<br />Output Path: location to generate the code to.<br />Project Name: name of the project. Application will create folder, if not found.<br /><br /><img src="/Uploads/12/app.jpg" border="0" /><br /><br /><b>2. Add MDAB to project</b><br />Once the application completes, the output path will have a folder for the project you just created. Open the project and simply add in the Microsoft Data Access Blocks. The project will compile and is ready to be accessed from a UI or Business layer.<br /><br /><img src="/Uploads/12/proj.jpg" border="0" /><br /><br /><b>3. Create the Stored Procedures</b><br />Finally, execute the SQL scripts in the "Data" folder to create the stored procedures.<br /><br /><img src="/Uploads/12/sps.jpg" border="0" /><br /><br /><strong>What is generated?<br /></strong>The data tier should encapsulate all database information and expose all data through objects (classes) or properties. This is exactly what my data tier generator does. All database fields become public properties and all data is received/returned in objects. Extended the classes is very easy once the initial generation is complete...and if you decide to change a table drastically, simply rerun the generator.</p>]]></description> 
					<pubDate>Sun, 26 Jun 2005 20:07:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/6/26/datatiergenerator/</guid>
				</item>
			
				<item>
					<title>Lucene.NET - Advanced Search Engine example</title> 
					<link>http://keylimetie.com/blog/2005/6/12/lucenenet/</link> 
					<description><![CDATA[A recent project at my current contract required us to research and obtain a 3rd party advanced search engine to fulfill some of the project requirements. I was not involved in the research, but the company decided to go with Verity. It turned out the <a href="http://www.verity.com/products/k2_enterprise/index.html" target="_blank">Verity K2 Enterprise</a> software had everything we needed to get the project developed and deployed fast. Working with the Verity software was very interesting and I decided to see what else was out there (open source only). Almost immediately, I came across the <a href="http://lucene.apache.org/java/docs/" target="_blank">Apache Lucene</a> project. "Apache Lucene is a high-performance, full-featured text search engine library written entirely in Java. It is a technology suitable for nearly any application that requires full-text search, especially cross-platform.". Getting the Java examples to work was very easy and so I started to look for more online...that's when I came across the .NET version at <a href="http://searchblackbox.com/lucene/index.html?ldn1" target="_blank">SearchBlackBox.com</a>. "SearchBlackBox Lucene Edition is a 100% C# based native .NET assembly that is fully optimized for the .NET Framework.". The website doesn't offer a lot of example, but it's easy to get it working. Also, the software product <a href="http://www.lookoutsoft.com/Lookout/lookoutinfo.html" target="_blank">Lookout</a> (aquired by Microsoft in June 2004) runs on the Lucene.NET code. 
<p>This application walks you through a simple implementation of the Lucene .NET DLL. We're bascially going to build out own Desktop Search Engine.<br /><br /><a href="/Uploads/10/Lucene.NET.zip" target="_blank">Download code</a><br /><br /><b>1. LuceneEngine.IndexFiles.cs</b><br /><a href="/Uploads/10/IndexFiles.cs.htm" target="_blank">Lines 12-59</a>: Input public properties (FilesLocation, IndexLocation, StopProcessing) and output public properties (Error, NumDocsIndexed, NumDocsSkipped, NumDocsErrored, TotalTime).<br /><a href="/Uploads/10/IndexFiles.cs.htm" target="_blank">Lines 63-68</a>: Custom events that are fired when the percentage of files completed changes and when errors occur.<br /><a href="/Uploads/10/IndexFiles.cs.htm" target="_blank">Lines 69-135</a>: StartIndexing is the entry method to get the indexing process going. After validating the input properties, I iterate through the directory chosen to index and all of its subdirectories. After I have all of the directories stored in mstrSubDirectories, I iterate through each one and call IndexDocs.<br /><a href="/Uploads/10/IndexFiles.cs.htm" target="_blank">Lines 136-182</a>: IndexDocs is the real worker in this application. This method loops through each file and, if the extension is supported, adds the document to the index.<br /><br /></p><b>2. LuceneEngine.MakeFileDoc.cs</b><br /><a href="/Uploads/10/MakeFileDoc.cs.htm" target="_blank">Lines 12-46</a>: The only method here is Document(), which returns a Lucene.Net.Documents.Document object. A Lucene Document contains multiple properties and the code populates some of them: filename, path, name, length, contents, creation_time, last_write_time and last_access_time.<br /><br /><b>3. LuceneEngine.SearchFiles.cs</b><br /><a href="/Uploads/10/SearchFiles.cs.htm" target="_blank">Lines 16-72</a>: Input public properties (IndexLocation, SearchFor, LastWriteFrom, LastWriteTo, NumHitsRequested) and output public properties (NumHitsFound, ResultsXML, ResultsDataView, TotalTime, Error).<br /><a href="/Uploads/10/SearchFiles.cs.htm" target="_blank">Lines 73-158</a>: The only method here is StartSearch(). This method creates an instance of the IndexSearcher and StandardAnalyzer (other Analyzers are available, but the StandardAnalyzer is basic enough for this project). It then creates a Lucene.Net.Search.Query object and selects the "contents" to be searched. Then the filtering criteria is loaded into a Lucene.Net.Search.DateFilter object. Finally, we call the IndexSearcher's Search method and return a Lucene.Net.Search.Hits object. From that, I get the number of hits and can iterate through the results collection. In this example, I create an XML resultset and a DataView (gives more flexibility to the consumer, i.e. WinForms App, Website or Web Service). The success result (true/false) is returned.<br /><br /><b>4. LuceneUI.frmMain</b><br />The top section consists of the indexing criteria. The "Files Location" is the root folder for the files you want to index. The "Index Location" is the location where the index should be stored.<br /><br /><img src="/Uploads/10/Index.jpg" border="0" />  <br /><br />The middle section consists of the search criteria and results. Simply enter in the search phrase and date range and the results will return immediately. To launch any item, double-click the row.<br /><br /><img src="/Uploads/10/Search.jpg" border="0" />  <br /><br /><b>5. LuceneUI.frmMain.cs</b><br /><a href="/Uploads/10/frmMain.cs.htm" target="_blank">Lines 383-478</a>: The cmdStart_Click event handles all of the processing to index the files. After validating the input data, it creates an instance of LuceneEngine.Index.IndexFiles, sets up the events, loads the properties and calls the StartIndexing method. Upon return, it displays the results. While indexing was occurring, events were being fired constantly and the IndexFiles_OnPercentCompleteChangedHandler (Lines 486-497) method was processing them.<br /><a href="/Uploads/10/frmMain.cs.htm" target="_blank">Lines 506-618</a>: The cmdSearch_Click event handles all processing to search  the index. After validating the input data, it creates an instance of LuceneEngine.Search.SearchFiles, load sthe properties and calls the StartSearch method. Upon return, it displays the statistical results in a label, binds the results DataView to the DataGrid and automatically resizes the columns so they can be viewed (SizeColumnsToContent).]]></description> 
					<pubDate>Mon, 13 Jun 2005 03:19:50 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/6/12/lucenenet/</guid>
				</item>
			
				<item>
					<title>How to load an Excel spreadsheet into an ADO.NET DataSet</title> 
					<link>http://keylimetie.com/blog/2005/6/7/loadexcelintodataset/</link> 
					<description><![CDATA[Have you ever wondered how to load a Microsoft Excel spreadsheet into an ADO.NET DataSet? Actually, it's pretty easy...only six lines of code! Now you can let people import data into your website in batches. Here's how:<br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span>DataSet objDS = <span style="COLOR: #0000ff">new</span> DataSet();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">string</span> strConn = <span style="COLOR: #848284">"Provider=Microsoft.Jet.OLEDB.4.0;"</span> + 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> <span style="COLOR: #848284">"Data Source="</span> + strFileName.Replace(<span style="COLOR: #848284">"\\"</span>, <span style="COLOR: #848284">"\\\\"</span>) + <span style="COLOR: #848284">";"</span> +
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> <span style="COLOR: #848284">"Extended Properties=\"Excel 8.0;\""</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>objOLE = <span style="COLOR: #0000ff">new</span> OleDbDataAdapter(<span style="COLOR: #848284">"SELECT * FROM [Sheet1$]"</span>, strConn);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span>objOLE.Fill(objDS);</pre>The above code snippet works great, but you must know the name of the worksheet (Sheet1 is the default for Excel). But what if you don't know the Worksheet name? What if you just want the first sheet? Then, you must use the Excel objects to get it:<br /><br /><pre style="COLOR: #000000"><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #6699cc">#region AnalyzeSpreadsheet</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> AnalyzeSpreadsheet(<span style="COLOR: #0000ff">string</span> strFileName)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> <span style="COLOR: #008200">//Excel variables</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span> <span style="COLOR: #0000ff">object</span> con_true = <span style="COLOR: #0000ff">true</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span> Excel.ApplicationClass objExcel = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> Excel.Workbook objBook = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span> Excel.Worksheet objSheet = <span style="COLOR: #0000ff">null</span>; 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span> <span style="COLOR: #0000ff">try</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span> <span style="COLOR: #008200">//Create new instance of Excel Application</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span> objExcel = <span style="COLOR: #0000ff">new</span> Excel.ApplicationClass();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span> <span style="COLOR: #008200">//Set some options</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span> objExcel.DisplayAlerts = <span style="COLOR: #0000ff">false</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span> objExcel.ScreenUpdating = <span style="COLOR: #0000ff">false</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span> objExcel.Visible = <span style="COLOR: #0000ff">false</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span> objExcel.UserControl = <span style="COLOR: #0000ff">false</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span> <span style="COLOR: #008200">//Open spreadsheet</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span> objBook = objExcel.Workbooks.Open(strFileName, Type.Missing,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span> Type.Missing, Type.Missing, Type.Missing, Type.Missing,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span> Type.Missing, Type.Missing, Type.Missing, Type.Missing,
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span> Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span> <span style="COLOR: #008200">//Find the 1st worksheet</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span> objSheet = (Excel.Worksheet)objBook.Worksheets.get_Item(1); 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span> <span style="COLOR: #0000ff">if</span> (objSheet == <span style="COLOR: #0000ff">null</span>)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span> <span style="COLOR: #0000ff">throw</span> <span style="COLOR: #0000ff">new</span> Exception(<span style="COLOR: #848284">"Worksheet #1 not found!"</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span> <span style="COLOR: #0000ff">else</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span> <span style="COLOR: #008200">//Do something...</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span> <span style="COLOR: #0000ff">catch</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span> <span style="COLOR: #008200">//Handle exception</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">36</span> <span style="COLOR: #0000ff">finally</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">37</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">38</span> ReleaseComObject(objSheet);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">39</span> objSheet = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">40</span> objBook.Close(con_true, strFileName, <span style="COLOR: #0000ff">null</span>);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">41</span> ReleaseComObject(objBook);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">42</span> objBook = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">43</span> objExcel.Workbooks.Close();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">44</span> objExcel.Application.Quit();
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">45</span> ReleaseComObject(objExcel);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">46</span> objExcel = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">47</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">48</span>}
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">49</span><span style="COLOR: #6699cc">#endregion</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">50</span><span style="COLOR: #6699cc">#region ReleaseComObject</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">51</span><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">void</span> ReleaseComObject(<span style="COLOR: #0000ff">object</span> o)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">52</span>{
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">53</span> Int32 i = 0;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">54</span> Int32 j = 0;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">55</span> <span style="COLOR: #0000ff">try</span> 
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">56</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">57</span> <span style="COLOR: #0000ff">for</span> (i = 1; i <= <br />System.Runtime.InteropServices.Marshal.ReleaseComObject(o); i++)
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">58</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">59</span> j = <br />System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">60</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">61</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">62</span> <span style="COLOR: #0000ff">catch</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">63</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">64</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">65</span> <span style="COLOR: #0000ff">finally</span>
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">66</span> {
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">67</span> o = <span style="COLOR: #0000ff">null</span>;
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">68</span> }
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">69</span>}
<span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">70</span><span style="COLOR: #6699cc">#endregion</span></pre>]]></description> 
					<pubDate>Wed, 08 Jun 2005 02:40:52 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/6/7/loadexcelintodataset/</guid>
				</item>
			
				<item>
					<title>Databind to Custom Objects (C#)</title> 
					<link>http://keylimetie.com/blog/2005/6/2/databindtocustomobjects/</link> 
					<description><![CDATA[Using custom objects is always a great practice, especially in n-tiered development where abstraction across the layers is crucial. All too often I see people (including myself) use custom objects to handle most of the logic, but then databind repeaters, datagrids, etc. with datasets, datatables and data readers. By doing so, the database and user interface are now tightly coupled and maintenance can become a headache later on.<br /><br /><a href="/Uploads/9/DataBindToCustomObject.zip" target="_blank'">Download code</a><br /><br />What's the solution? Bind your UI controls with your custom objects. Here's how:<br /><br /><b>1. UserColl.cs - Create a class that defines your custom object (UserDetails)</b><br /><a href="/Uploads/9/UserColl.cs.htm" target="_blank'">Lines 6-34</a>: A simple class with three members (Email Address, First name and Last Name)<br /><br /><b>2. UserColl.cs - Create a custom collection class that implements the IEnumerable interface (Users)</b><br /><a href="/Uploads/9/UserColl.cs.htm" target="_blank'">Line 37</a>: Inherit System.Collections.IEnumerable interface<br /><a href="/Uploads/9/UserColl.cs.htm" target="_blank'">Line 40</a>: Declare private ArrayList to store data<br /><a href="/Uploads/9/UserColl.cs.htm" target="_blank'">Lines 43-46</a>: Return the enumerator from my ArrayList<br /><a href="/Uploads/9/UserColl.cs.htm" target="_blank'">Lines 49-109</a>: Methods to add/update/retrieve objects from the collection<br /><br /><b>3. WebForm1.aspx - Implement into a WebForm</b><br /><br /><img src="/Uploads/9/WebForm1.jpg" border="1" /><br /><a href="/Uploads/9/WebForm1.aspx.htm" target="_blank'">Lines 8-11</a>: I added JavaScript that confirms the delete.<br /><a href="/Uploads/9/WebForm1.aspx.htm" target="_blank'">Lines 23-43</a>: DataGrid TemplateColumn's - Notice that each item is pulled from the Container and is referenced by the member name.<br /><a href="/Uploads/9/WebForm1.aspx.htm" target="_blank'">Line 47</a>: TemplateColumn for the Delete LinkButton - Coded this way so was can find it during the ItemBound event and add the JavaScript confirm function.<br /><b><br />4. WebForm1.aspx.cs - Implement into the CodeBehind</b><br /><a href="/Uploads/9/WebForm1.aspx.cs.htm" target="_blank'">Lines 47-52</a>: On first load, call LoadNewUsers to, you guessed it, load new users into the object. In a real life scenario, this would be pulled from a database.<br /><a href="/Uploads/9/WebForm1.aspx.cs.htm" target="_blank'">Line 55</a>: For this example, I simply put the session's data into a Session object.<br /><a href="/Uploads/9/WebForm1.aspx.cs.htm" target="_blank'">Lines 58-86</a>: LoadNewUsers - Create 3 objects and load them with details...each being added to our collection class. At the end, store this in Session State (for this example).<br /><a href="/Uploads/9/WebForm1.aspx.cs.htm" target="_blank'">Lines 94-99</a>: Look familiar? Usually, you bind with a dataset, datatable, etc...this time you're binding with a custom object!<br /><a href="/Uploads/9/WebForm1.aspx.cs.htm" target="_blank'">Lines 101-114</a>: dgUsers_ItemCreated - just a little something extra. When DataBind is called, the ItemCreated event is caught here. For each item, I find the Delete LinkButton and and the JavaScript function as an "onclick" attribute.<br /><a href="/Uploads/9/WebForm1.aspx.cs.htm" target="_blank'">Line 116-167</a>: dgUsers_ItemCommand - Some examples on how to access the collection. When "View" is clicked, I retrieve the object from the collection by "index" (Line 124). When "Delete" is clicked, I retrieve the object from the collection by "Email Address". To do this, I first need to find the LinkButton (Line 140). Then I can retrieve the object (Line 144). Once I have the object, I can delete it (Line 146). Finally, I rebind the custom object to the DataGrid to reflect the changes (Line 163) and refresh the Session variable (Line 166). For this example, the rebind and session variable refresh should just be in the "Delete" if structure, but I had originally planned to have an "Edit" link.]]></description> 
					<pubDate>Fri, 03 Jun 2005 02:54:00 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/6/2/databindtocustomobjects/</guid>
				</item>
			
				<item>
					<title>Email Address Validator (C#)</title> 
					<link>http://keylimetie.com/blog/2005/5/30/emailaddressvalidator/</link> 
					<description><![CDATA[If you're building any kind of website that allows users to register, you're going to need an email validator. Some people recommend using a regular expression validator and that works well for most situations, but isn't foolproof. Below is a code snippet of a method that takes in an email address and returns a boolean value. 
<p><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">1</span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">bool</span> IsValidEmail(<span style="COLOR: #0000ff">string</span> strEmail)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">2</span>{<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">3</span> <span style="COLOR: #008200">//Ensure some data is sent in</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">4</span> <span style="COLOR: #0000ff">if</span> (strEmail == <span style="COLOR: #0000ff">null</span> || strEmail.Length == 0)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">5</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">6</span> <span style="COLOR: #008200">//Ensure no spaces exist in the email address</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">7</span> <span style="COLOR: #0000ff">if</span> (strEmail.IndexOf(<span style="COLOR: #848284">" "</span>) > -1)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">8</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">9</span> <span style="COLOR: #008200">//Ensure <span style="COLOR: #848284">".@"</span> isn't in the email address</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">10</span> <span style="COLOR: #0000ff">if</span> (strEmail.IndexOf(<span style="COLOR: #848284">".@"</span>) > -1)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">11</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">12</span> <span style="COLOR: #008200">//Ensure last character is not a period</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">13</span> <span style="COLOR: #0000ff">if</span> (strEmail.Substring(strEmail.Length - 1, 1) == <span style="COLOR: #848284">"."</span>)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">14</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">15</span> <span style="COLOR: #008200">//Search for invalid chars</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">16</span> <span style="COLOR: #0000ff">if</span> (!System.Text.RegularExpressions.Regex.IsMatch(strEmail, <span style="COLOR: #848284">"^[-A-Za-z0-9_@.']+$"</span>))<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">17</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">18</span> <span style="COLOR: #008200">//Search the @ char</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">19</span> Int32 i = strEmail.IndexOf(<span style="COLOR: #848284">"@"</span>);<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">20</span> <span style="COLOR: #008200">//There must be at least three chars after the @</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">21</span> <span style="COLOR: #0000ff">if</span> (i <= 0 || i >= strEmail.Length - 3)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">22</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">23</span> <span style="COLOR: #008200">//Ensure there is only one @ char</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">24</span> <span style="COLOR: #0000ff">if</span> (strEmail.IndexOf(<span style="COLOR: #848284">"@"</span>, i + 1) >= 0)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">25</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">26</span> <span style="COLOR: #008200">//Ensure dot isn't next to @</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">27</span> <span style="COLOR: #0000ff">if</span> (strEmail.IndexOf(<span style="COLOR: #848284">".@"</span>) >= 0 || strEmail.IndexOf(<span style="COLOR: #848284">"@."</span>) >= 0)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">28</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">29</span> <span style="COLOR: #008200">//Ensure that the domain portion contains at least one dot</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">30</span> Int32 j = strEmail.LastIndexOf(<span style="COLOR: #848284">"."</span>);<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">31</span> <span style="COLOR: #008200">//It can't be before or immediately after the @ char</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">32</span> <span style="COLOR: #0000ff">if</span> (j < 0 || j <= i + 1)<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">33</span>  <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">false</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">34</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">35</span> <span style="COLOR: #008200">//If we get here the, email address if good</span><br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">36</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #0000ff">true</span>;<br /><span style="BORDER-RIGHT: #999999 1px solid; WIDTH: 40px; COLOR: #008284; MARGIN-RIGHT: 10px; BACKGROUND-COLOR: #e5e5e5; TEXT-ALIGN: right">37</span>}</p>]]></description> 
					<pubDate>Mon, 30 May 2005 19:20:12 GMT</pubDate>
					<guid isPermaLink="false">http://keylimetie.com/blog/2005/5/30/emailaddressvalidator/</guid>
				</item>
			
	</channel>
</rss>