<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" gd:etag="W/&quot;DkMEQng4eCp7ImA9WxBbE0o.&quot;"><id>tag:blogger.com,1999:blog-7656888</id><updated>2010-03-11T23:13:23.630-07:00</updated><title>Aggregated Intelligence</title><subtitle type="html">AI - Aggregation of ideas</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>1210</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/aggregatedIntelligence" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="aggregatedintelligence" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>39.731286</geo:lat><geo:long>-104.98306</geo:long><entry gd:etag="W/&quot;DkMEQng_fyp7ImA9WxBbE0o.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-9170286724248238496</id><published>2010-03-11T23:08:00.001-07:00</published><updated>2010-03-11T23:13:23.647-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-11T23:13:23.647-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><title>Comcast releases data usage meters for high speed customers</title><content type="html">&lt;p&gt;Comcast has implemented a 250gb per month limit on the amount one can transfer over their high speed connection.&lt;/p&gt;  &lt;p&gt;Go to &lt;a title="https://customer.comcast.com" href="https://customer.comcast.com/Secure/UsageMeterDetail.aspx"&gt;https://customer.comcast.com/Secure/UsageMeterDetail.aspx&lt;/a&gt;, login and you will see your usage history. &lt;/p&gt;  &lt;p&gt;Comcast has had a usage limit since about October 2008, but without a usage meter, I always felt like the Comcast usage police might come knocking at my door. Having a usage meter is a step in the right direction. I wish they would add some kind of alert system, that I could use to signal to me when usage goes over by a certain amount (that way I can keep track of my data usage and if any pirate is trying to steal my bandwidth).&lt;/p&gt;  &lt;p&gt;Here is what data usage meter looks like.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_dIvFa14S0yc/S5naacBxIfI/AAAAAAAAJK4/C7RPT0taIQ8/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_dIvFa14S0yc/S5nabX9r-9I/AAAAAAAAJK8/PMQiRBXOTVU/image_thumb%5B1%5D.png?imgmax=800" width="577" height="717" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-9170286724248238496?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/9170286724248238496/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=9170286724248238496&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/9170286724248238496?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/9170286724248238496?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/comcast-releases-data-usage-meters-for.html" title="Comcast releases data usage meters for high speed customers" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DE8FRH88eSp7ImA9WxBbE0s.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-7839144847236253372</id><published>2010-03-11T21:06:00.001-07:00</published><updated>2010-03-11T21:06:55.171-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-11T21:06:55.171-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Entrepreneur" /><category scheme="http://www.blogger.com/atom/ns#" term="start up" /><category scheme="http://www.blogger.com/atom/ns#" term="Note To Self" /><category scheme="http://www.blogger.com/atom/ns#" term="improvement" /><category scheme="http://www.blogger.com/atom/ns#" term="Personal Development" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>What’s A Startup? First Principles.</title><content type="html">&lt;h4&gt;&lt;a href="http://steveblank.com/2010/01/25/whats-a-startup-first-principles/"&gt;What’s A Startup? First Principles.&lt;/a&gt;&amp;#160;&lt;/h4&gt;  &lt;p&gt;&lt;em&gt;a startup is an organization formed to search for a repeatable and scalable business model&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;A good post by Steve Blank on what a Business Model is and other good stuff that any business person should be cognizant of.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How Does Customer Development, Agile Development and Lean Startups Fit?     &lt;br /&gt;&lt;/strong&gt;The &lt;a href="http://www.amazon.com/Four-Steps-Epiphany-Steven-Blank/product-reviews/0976470705/ref=cm_cr_pr_helpful?ie=UTF8&amp;amp;showViewpoints=0"&gt;Customer Development process&lt;/a&gt; is the way startups quickly iterate and test each element of their business model. Agile Development is the way startups quickly iterate their product as they learn. A &lt;a href="http://www.startuplessonslearned.com/2008/09/lean-startup.html"&gt;Lean Startup&lt;/a&gt; is &lt;a href="http://www.startuplessonslearned.com/2008/10/about-author.html"&gt;Eric Ries’s&lt;/a&gt; description of the intersection of &lt;a href="http://steveblank.com/category/customer-development-manifesto/"&gt;Customer Development&lt;/a&gt;, &lt;a href="http://www.startuplessonslearned.com/2008/09/customer-development-engineering.html"&gt;Agile Development&lt;/a&gt; and if available, open platforms and open source. (This methodology does for startups what the &lt;a href="http://www2.toyota.co.jp/en/vision/production_system/index.html"&gt;Toyota Lean Production System&lt;/a&gt; did for cars.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://steveblank.com/2010/01/25/whats-a-startup-first-principles/"&gt;http://steveblank.com/2010/01/25/whats-a-startup-first-principles/&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-7839144847236253372?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/7839144847236253372/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=7839144847236253372&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/7839144847236253372?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/7839144847236253372?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/whats-startup-first-principles.html" title="What’s A Startup? First Principles." /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;Dk4BQH44fSp7ImA9WxBbE0g.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-2151045651076076864</id><published>2010-03-11T17:49:00.001-07:00</published><updated>2010-03-11T17:49:11.035-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-11T17:49:11.035-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Code Sample" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net" /><title>Mapping Business Entities to Data Transfer Objects</title><content type="html">&lt;p&gt;DTOs???? Why???&lt;/p&gt; &lt;p&gt;Here is an example: You wish to open up some processing to external callers via a web-service. Should your business entities also become your data-contracts?&lt;/p&gt; &lt;p&gt;Well, in my opinion (and from what I am seeing on the Internet), the answer is no. The answer is two-fold: separation of concerns and stability of your webservice. Enter data-transfer-objects (DTOs).&lt;/p&gt; &lt;p&gt;Typically you create your DTO in your service interface layer (they layer where you write your web-service). Your business entities are hydrated from your repository by your resource access layer. The business logic layer processes requests, gets the business entities from the resource access layer and provides it to the service interface layer.&lt;/p&gt; &lt;p&gt;The service interface layer then converts the business entity object to the DTO and then passes it back over the wire to the client calling the webservice.&lt;/p&gt; &lt;p&gt;Why is this good? For one – if your business entity changes, your web-service does not have to change (a good thing, especially if your webservice is publically accessible) and if your business entity had extra methods, fields, etc, they dont get pushed down the wire as your DTO is typically a very simple and clean object.&lt;/p&gt; &lt;p&gt;Why this post?&lt;/p&gt; &lt;p&gt;Well it turns out that the mapping between business entity objects and DTOs can be very boring, time consuming, pain to maintain, etc….&lt;/p&gt; &lt;p&gt;Enter Automapper. Automapper is an open source CodePlex project that performs mapping between objects using conventions. So as long as your DTO objects and BE objects share the same property and field names, the transfer of data will be nice and simple.&lt;/p&gt; &lt;p&gt;The code couldnt be simpler:&lt;/p&gt; &lt;div class="csharpcode-wrapper"&gt;&lt;pre class="csharpcode"&gt;Mapper.CreateMap&amp;lt;SourceClass, DestinationClass&amp;gt;();
DestinationClass destinationObject = Mapper.Map&amp;lt;SourceClass, DestinationClass&amp;gt;(sourceObject);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;Automapper also supports &lt;a href="http://automapper.codeplex.com/wikipage?title=Flattening&amp;amp;referringTitle=Getting%20Started"&gt;flattening&lt;/a&gt; (taking a complex object and converting it to a simpler object).  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-2151045651076076864?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/2151045651076076864/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=2151045651076076864&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2151045651076076864?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2151045651076076864?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/mapping-business-entities-to-data.html" title="Mapping Business Entities to Data Transfer Objects" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0AMRX04cSp7ImA9WxBbEE8.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-5338917659055547375</id><published>2010-03-07T23:29:00.001-07:00</published><updated>2010-03-07T23:29:44.339-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T23:29:44.339-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>Hacme and WebGoat</title><content type="html">&lt;p&gt;Hacme and Webgoat are 2 reference implementation applications that have been deliberately made insecure so as to teach developers how to create secure applications.&lt;/p&gt;  &lt;p&gt;WebGoat (&lt;a href="http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project"&gt;OWASP project&lt;/a&gt;): &lt;a href="http://code.google.com/p/webgoat/"&gt;http://code.google.com/p/webgoat/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hacme: (McAfee): &lt;a href="http://www.foundstone.com/us/resources/proddesc/hacmetravel.htm"&gt;http://www.foundstone.com/us/resources/proddesc/hacmetravel.htm&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-5338917659055547375?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/5338917659055547375/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=5338917659055547375&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/5338917659055547375?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/5338917659055547375?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/hacme-and-webgoat.html" title="Hacme and WebGoat" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0EERnc5eyp7ImA9WxBbEE0.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-6642277781270828812</id><published>2010-03-07T16:46:00.001-07:00</published><updated>2010-03-07T16:46:47.923-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T16:46:47.923-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Complex Numbers</title><content type="html">&lt;p&gt;I had forgotten all my complex number theory and this post by Steven Strogatz refreshed all that: &lt;a href="http://opinionator.blogs.nytimes.com/2010/03/07/finding-your-roots/"&gt;Finding your Roots&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Incidentally – complex numbers have become a first class citizen of the .Net 4.0 framework with the introduction of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.numerics.complex(VS.100).aspx"&gt;Complex&lt;/a&gt; type (found in System.Numerics namespace).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-6642277781270828812?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/6642277781270828812/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=6642277781270828812&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/6642277781270828812?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/6642277781270828812?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/complex-numbers.html" title="Complex Numbers" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkIDQH8-fCp7ImA9WxBUGUQ.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-7437011131244389758</id><published>2010-03-07T14:49:00.001-07:00</published><updated>2010-03-07T14:49:31.154-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T14:49:31.154-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Code Sample" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>Microsoft U-Prove SDK</title><content type="html">&lt;p&gt;Microsoft released a preview of the U-Prove cryptographic technology at this year’s RSA Conference. As part of the preview, Microsoft has released a C# reference implementation to allow testing/learning about this new technology.&lt;/p&gt;  &lt;p&gt;The C# SDK can be found at : &lt;a href="http://code.msdn.microsoft.com/uprovesdkcsharp"&gt;http://code.msdn.microsoft.com/uprovesdkcsharp&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The CTP information can be found at: &lt;a href="https://connect.microsoft.com/content/content.aspx?contentid=12505&amp;amp;siteid=642"&gt;https://connect.microsoft.com/content/content.aspx?contentid=12505&amp;amp;siteid=642&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The spec details can be found at: &lt;a href="https://connect.microsoft.com/site642/Downloads/DownloadDetails.aspx?DownloadID=26953"&gt;https://connect.microsoft.com/site642/Downloads/DownloadDetails.aspx?DownloadID=26953&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This looks like an early CTP release that Microsoft is using to discover what the security community as a whole thinks about U-Prove and I am sure the SDK and the specs will change quite a bit. I am not sure what the road map for U-Prove and hence dont know what the time line looks towards a full-fledged release of the technology.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-7437011131244389758?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/7437011131244389758/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=7437011131244389758&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/7437011131244389758?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/7437011131244389758?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/microsoft-u-prove-sdk.html" title="Microsoft U-Prove SDK" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0MAR3g9cCp7ImA9WxBUGUU.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-7893000061173085794</id><published>2010-03-07T11:10:00.001-07:00</published><updated>2010-03-07T11:10:46.668-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T11:10:46.668-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><title>Market penetration of .Net</title><content type="html">&lt;p&gt;From: “&lt;a href="http://www.microsoft.com/net/CaseStudies/MissionCriticalApps/Default.aspx"&gt;.Net in Mission Critical Applications&lt;/a&gt;”&lt;/p&gt;  &lt;li&gt;Windows Server has &lt;b&gt;#1 server OS share&lt;/b&gt; (52.7%) for deployed mission-critical applications &lt;/li&gt;  &lt;li&gt;Windows Server and .NET are the &lt;b&gt;#1 (54.1%) deployed application server&lt;/b&gt;&lt;/li&gt;  &lt;li&gt;.NET &lt;b&gt;usage exceeds Java&lt;/b&gt; across all sizes of enterprises &lt;/li&gt;  &lt;li&gt;Windows Server is the #1 OS used (46%) by deployed mission critical Java applications &lt;/li&gt;  &lt;li&gt;SharePoint leads (over IBM WebSphere) as the &lt;b&gt;#1 portal&lt;/b&gt; used by enterprises’ primary mission-critical application &lt;/li&gt;  &lt;li&gt;SQL Server leads (over Oracle) as the&lt;b&gt; #1 database&lt;/b&gt; used by enterprises’ primary mission-critical application &lt;/li&gt;  &lt;li&gt;BizTalk Server leads (over Oracle) as the &lt;b&gt;#1 process integration technology&lt;/b&gt; used by enterprises’ primary mission-critical application &lt;/li&gt;  &lt;li&gt;Microsoft leads as the &lt;b&gt;#1 (58.6%) vendor for service oriented architectures&lt;/b&gt;&lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-7893000061173085794?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/7893000061173085794/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=7893000061173085794&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/7893000061173085794?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/7893000061173085794?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/market-penetration-of-net.html" title="Market penetration of .Net" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A04BRXkycCp7ImA9WxBUF0Q.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-5585592127907084862</id><published>2010-03-05T07:39:00.001-07:00</published><updated>2010-03-05T07:39:14.798-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-05T07:39:14.798-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JQuery" /><title>JQuery Tutorials:</title><content type="html">&lt;p&gt;Very nice JQuery tutorials: &lt;a href="http://vandelaydesign.com/blog/web-development/jquery-one-page-portfolios/"&gt;http://vandelaydesign.com/blog/web-development/jquery-one-page-portfolios/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Some of the cool ones linked from the page are:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Slideout menu&lt;/strong&gt;: &lt;a href="http://tympanus.net/codrops/2009/11/30/beautiful-slide-out-navigation-a-css-and-jquery-tutorial/"&gt;http://tympanus.net/codrops/2009/11/30/beautiful-slide-out-navigation-a-css-and-jquery-tutorial/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Using Form labels as text field values&lt;/strong&gt;: &lt;a href="http://cssglobe.com/post/2494/using-form-labels-as-text-field-values"&gt;http://cssglobe.com/post/2494/using-form-labels-as-text-field-values&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JQuery lightbox&lt;/strong&gt;: &lt;a href="http://leandrovieira.com/projects/jquery/lightbox/"&gt;http://leandrovieira.com/projects/jquery/lightbox/&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-5585592127907084862?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/5585592127907084862/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=5585592127907084862&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/5585592127907084862?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/5585592127907084862?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/jquery-tutorials.html" title="JQuery Tutorials:" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkcGQHg7fCp7ImA9WxBUFks.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-3713469487019160561</id><published>2010-03-03T12:17:00.001-07:00</published><updated>2010-03-03T17:53:41.604-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T17:53:41.604-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Code Sample" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net" /><title>Microsoft’s Anti-XSS Library</title><content type="html">&lt;p&gt;I first came across the Anti-XSS library while reading the following post: &lt;a href="http://itcountry.blogspot.com/2010/03/cross-site-scripting-and-ways-to-code.html"&gt;Cross site scripting and ways to code against it&lt;/a&gt; on the IT_Country blog.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;So what is it?&lt;/strong&gt;&lt;br&gt;According to Microsoft:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;AntiXSS 3.1 helps you to protect your current applications from cross-site scripting attacks, at the same time helping you to protect your legacy application with its Security Runtime Engine&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Doesnt “System.Web.HttpUtility.HtmlEncode” do that already?&lt;br&gt;&lt;/strong&gt;Yes, but there is a difference. The biggest is that HttpUtility.HtmlEncode uses a blacklist, whereas AntiXss.HtmlEncode uses a whitelist. (A whitelist is basically a list of allowed attendees at a party and a blacklist is a list of unallowed people to a party). Obviously a white list is more restrictive and hence more safe. According to &lt;a href="http://blogs.msdn.com/securitytools/archive/2009/07/09/differences-between-antixss-htmlencode-and-httputility-htmlencode-methods.aspx"&gt;Syed Aslam Basha&lt;/a&gt;, (Tester on Microsoft’s Information Security Tools Team), these are the differences:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Anti-XSS uses the white-listing technique&lt;/strong&gt;, sometimes referred to as the principle of inclusions, to provide protection against Cross-Site Scripting (XSS) attacks. This approach works by first defining a valid or allowable set of characters, and encodes anything outside this set (invalid characters or potential attacks). System.Web.HttpUtility.HtmlEncode and other encoding methods in that namespace use principle of exclusions and encode only certain characters designated as potentially dangerous such as &amp;lt;, &amp;gt;, &amp;amp; and ' characters.  &lt;li&gt;The &lt;strong&gt;Anti-XSS Library's list of white (or safe) characters support more than a dozen languages&lt;/strong&gt; (Greek and Coptic,Cyrillic,Cyrillic Supplement, Armenian, Hebrew, Arabic, Syriac, Arabic Supplement, Thaana, NKo and more)  &lt;li&gt;&lt;strong&gt;Anti-XSS library has been designed specially to mitigate XSS attacks whereas HttpUtility encoding methods are created to ensure that ASP.NET output does not break HTML&lt;/strong&gt;.  &lt;li&gt;Performance - the average &lt;strong&gt;delta between AntiXss.HtmlEncode() and HttpUtility.HtmlEncode() is +0.1 milliseconds&lt;/strong&gt; per transaction. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;from: &lt;a href="http://blogs.msdn.com/securitytools/archive/2009/07/09/differences-between-antixss-htmlencode-and-httputility-htmlencode-methods.aspx"&gt;Differences Between AntiXss.HtmlEncode and HttpUtility.HtmlEncode Methods&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;How do you use it?&lt;br&gt;&lt;/strong&gt;Its simple really:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;AntiXss.GetSafeHtml&lt;/strong&gt;: Returns well formed HTML that is XHTML compliant. (if &amp;lt;html&amp;gt; or &amp;lt;body&amp;gt; tags are missing they are added back in).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;AntiXss.GetSafeHtmlFragment&lt;/strong&gt;: Returns well formed HTML fragments (does not try and add &amp;lt;html&amp;gt; or &amp;lt;body&amp;gt; tags).&lt;/p&gt; &lt;p&gt;The AntiXSS library also provides other methods that can be used depending on where you are going to be using the user input data. For example:&lt;br&gt;&lt;strong&gt;AntiXss.HtmlAttributeEncode&lt;/strong&gt; – used when user input is being used as an attribute inside a HTML tag. &lt;br&gt;&lt;strong&gt;AntiXss.JavaScriptEncode &lt;/strong&gt;– used when user input data is being used inside &amp;lt;script&amp;gt; tags.&lt;br&gt;&lt;strong&gt;AntiXss.UrlEncode – &lt;/strong&gt;used when user input is being used in a url.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Correct Sequence of Usage:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;According to the documentation, the correct sequence is not to perform the encoding as soon as you start working with the user provided data, but just before presenting the user provided data back to user.&lt;/p&gt; &lt;p&gt;Here is an example from the documentation:&lt;br&gt;&lt;/p&gt; &lt;div class="csharpcode-wrapper"&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// Correct Sequence **** &lt;/span&gt;
&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button1_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e) 
{ 
    &lt;span class="rem"&gt;// Read input String Input = TextBox1.Text; &lt;/span&gt;
    &lt;span class="rem"&gt;// Process input ... &lt;/span&gt;
    &lt;span class="rem"&gt;// Encode untrusted input and write output &lt;/span&gt;
    Response.Write(”The input you gave was” + Microsoft.Security.Application.AntiXss.HtmlEncode(Input)); 
}

&lt;span class="rem"&gt;// Incorrect sequence!!!&lt;/span&gt;
&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button1_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
{
    &lt;span class="rem"&gt;// Read input&lt;/span&gt;
    String Input = TextBox1.Text;
    &lt;span class="rem"&gt;// Encode untrusted input&lt;/span&gt;
    Input = Microsoft.Security.Application.AntiXss.HtmlEncode(Input);
    &lt;span class="rem"&gt;// Process input&lt;/span&gt;
    ...
    &lt;span class="rem"&gt;// Write Output&lt;/span&gt;
    Response.Write(”The input you gave was” + Input );
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;AntiXSS Members:&lt;br&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font color="darkgray"&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th class="nameColumn"&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Name&lt;/font&gt;&lt;/p&gt;&lt;/th&gt;
&lt;th class="descriptionColumn"&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Description&lt;/font&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;GetSafeHtml&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Returns a safe version of HTML page by either sanitizing or removing all malicious scripts.&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;GetSafeHtmlFragment&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Returns a safe version of HTML fragment by either sanitizing or removing all malicious scripts.&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;HtmlAttributeEncode&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Encodes input strings for use in HTML attributes. &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr data="public;static;declared;notNetfw;"&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;HtmlEncode&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Encodes a input string before safely sending it to a browser client.&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr data="public;static;declared;notNetfw;"&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;JavaScriptEncode&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Encodes input strings for use in JavaScript.&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr data="public;static;declared;notNetfw;"&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;UrlEncode&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Encodes input strings for use in universal resource locators (URLs).&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr data="public;static;declared;notNetfw;"&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;VisualBasicScriptEncode&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Encodes input strings for use in Visual Basic Script. &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr data="public;static;declared;notNetfw;"&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;XmlAttributeEncode&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Encodes input strings for use in XML attributes. &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr data="public;static;declared;notNetfw;"&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;XmlEncode&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;font color="#000000"&gt;Encodes input strings for use in XML. &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;More Info:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CodePlex: &lt;a title="AntiXSS" href="http://antixss.codeplex.com/"&gt;AntiXSS&lt;/a&gt;&amp;nbsp;&lt;br&gt;CodePlex Discussion: &lt;a href="http://antixss.codeplex.com/Thread/List.aspx"&gt;http://antixss.codeplex.com/Thread/List.aspx&lt;/a&gt;.&lt;br&gt;AntiXSS 3.2 download: &lt;a title="http://www.microsoft.com/downloads/details.aspx?familyid=051EE83C-5CCF-48ED-8463-02F56A6BFC09&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?familyid=051EE83C-5CCF-48ED-8463-02F56A6BFC09&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=051EE83C-5CCF-48ED-8463-02F56A6BFC09&amp;amp;displaylang=en&lt;/a&gt;&lt;br&gt;Security Tools Team Blog: &lt;a title="http://blogs.msdn.com/securitytools/archive/tags/Anti-XSS/default.aspx" href="http://blogs.msdn.com/securitytools/archive/tags/Anti-XSS/default.aspx"&gt;http://blogs.msdn.com/securitytools/archive/tags/Anti-XSS/default.aspx&lt;/a&gt;&lt;br&gt;OWASP XSS Prevention Cheat Sheet: &lt;a title="OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet" href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet"&gt;OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-3713469487019160561?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/3713469487019160561/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=3713469487019160561&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/3713469487019160561?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/3713469487019160561?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/03/microsofts-anti-xss-library.html" title="Microsoft’s Anti-XSS Library" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;DEcDSHY5eip7ImA9WxBUE0s.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-5349006084407875534</id><published>2010-02-28T00:24:00.001-07:00</published><updated>2010-02-28T07:07:59.822-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-28T07:07:59.822-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Use the 404 page to find missing children</title><content type="html">&lt;p&gt;&lt;a href="http://www.hanselman.com/blog/PutMissingKidsOnYour404PageEntirelyClientSideSolutionWithYQLJQueryAndMSAjax.aspx"&gt;Scott Hanselman blogged&lt;/a&gt; about an excellent idea that he had seen where a PHP developer had created a 404 page that displayed a list of missing children. &lt;/p&gt;  &lt;p&gt;In my opinion this is a great idea – as people always end up seeing a 404 page and by displaying a list of missing kids – who knows, we might just be able to find a missing kid. Scott created a &lt;a href="http://www.hanselman.com/blog/PutMissingKidsOnYour404PageEntirelyClientSideSolutionWithYQLJQueryAndMSAjax.aspx"&gt;404 page&lt;/a&gt; using only Javascript (the original used server side PHP). Scott’s implementation uses the &lt;a href="http://www.asp.net/ajaxlibrary/DataView%20Control%20and%20Ajax%20Templates.ashx"&gt;ASP.Net AJAX Library&lt;/a&gt; and specifically uses the DataView control.&lt;/p&gt;  &lt;p&gt;I wanted to make a few modifications to Scott’s implementation of the 404 page:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Make the page so that it is a lot more easier for someone to download the code and reuse it. &lt;/li&gt;    &lt;li&gt;Use only JQuery &lt;/li&gt;    &lt;li&gt;Geolocate the user using their IP address. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The reason I wanted to use only JQuery was that I didnt think it was necessary to download an extra javascript library just to display the data, when JQuery could do it all. (In addition, I used direct references to jQuery – instead of the $, as it makes it easier to include on a DotNetNuke site).&lt;/p&gt;  &lt;p&gt;The biggest improvement in my opinion is the use of the client’s IP address to geo-locate them. By geo-locating the end user, I can customize the list of children to the state from where the user is. This in my opinion increases the probability of finding missing children as the list is smaller and more relevant to the user.&lt;/p&gt;  &lt;p&gt;For geo-locating the user, I use two techniques. Because JQuery is loaded using Google’s content delivery network I can use Google’s API to try and determine the location of the user. If this fails (and it does many times), I use &lt;a href="http://ipinfodb.com/"&gt;IPInfoDB&lt;/a&gt;’s webservice to try and geo-locate the user.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_dIvFa14S0yc/S4ocw_p6yYI/AAAAAAAAJI0/38PIxbuRUjc/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_dIvFa14S0yc/S4ocyLwudVI/AAAAAAAAJI4/NBs0meqbJtI/image_thumb%5B1%5D.png?imgmax=800" width="644" height="416" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here is where you can take a look at my implementation of the 404 page with geolocation capabilities: &lt;a href="http://www.aggregatedintelligence.com/404.html"&gt;http://www.aggregatedintelligence.com/404.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;As I use the Google API, you will need to generate a Google API key to use the code on a webserver (if you are testing – you dont need to do anything). To get the key go to : &lt;a href="http://code.google.com/apis/ajaxsearch/signup.html"&gt;http://code.google.com/apis/ajaxsearch/signup.html&lt;/a&gt;. Once you generate the key, plug it into the file at line: 33 (or search for “YourGoogleApiKeyHere” to find the location).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Download the 404 page from: &lt;/strong&gt;&lt;a href="https://docs.google.com/leaf?id=0BzvtUeIvT94wOTZkM2IwN2ItZWVkOS00NWM2LTkzZWUtNGMxN2I0YjI3NDdj&amp;amp;hl=en"&gt;Google Docs FileShare&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-5349006084407875534?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/5349006084407875534/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=5349006084407875534&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/5349006084407875534?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/5349006084407875534?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/use-404-page-to-find-missing-children.html" title="Use the 404 page to find missing children" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;DUcNSHs8fip7ImA9WxBUEk8.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-2990130910344138657</id><published>2010-02-26T16:31:00.001-07:00</published><updated>2010-02-26T16:31:39.576-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-26T16:31:39.576-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Code Sample" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Encrypting/Decrypting using DigitalCertificates using C#</title><content type="html">&lt;p&gt;Here is some quick code I wrote up that allows you to perform Asymmetric encryption using the RSA algorithm. The keys used are from a digital certificate stored in the local user’s cert store (the code to create a certificate for testing is also included in the sample.&lt;/p&gt; &lt;div class="csharpcode-wrapper"&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Cryptography;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Cryptography.X509Certificates;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; X509Certificate2_Encryption_Example
{
    &lt;span class="kwrd"&gt;class&lt;/span&gt; X509Certificate2_Cryptographer
    {
        &lt;span class="rem"&gt;//creating the certificate&lt;/span&gt;
        &lt;span class="rem"&gt;//makecert -r -pe -n "CN=WWW.AGGREGATEDINTELLIGENCE.COM" -b 01/01/2005 -e 01/01/2020 -sky exchange -ss my&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main()
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                X509Certificate2 x509_2 = LoadCertificate(StoreLocation.CurrentUser, &lt;span class="str"&gt;"CN=WWW.AGGREGATEDINTELLIGENCE.COM"&lt;/span&gt;);
                &lt;span class="rem"&gt;//DisplayX509CertificateInfo(x509_2);&lt;/span&gt;
                
                &lt;span class="kwrd"&gt;string&lt;/span&gt; plaintext = &lt;span class="str"&gt;"HelloWorld"&lt;/span&gt;;
                Console.WriteLine(&lt;span class="str"&gt;"Plain text: "&lt;/span&gt; + plaintext + Environment.NewLine);
                
                &lt;span class="kwrd"&gt;string&lt;/span&gt; encryptedstring = Encrypt(x509_2, plaintext);
                Console.WriteLine(&lt;span class="str"&gt;"Encrypted text: "&lt;/span&gt; + Environment.NewLine + encryptedstring + Environment.NewLine);
                
                &lt;span class="kwrd"&gt;string&lt;/span&gt; decryptedstring = Decrypt(x509_2, encryptedstring);
                Console.WriteLine(&lt;span class="str"&gt;"decrypted text: "&lt;/span&gt; + decryptedstring + Environment.NewLine);                
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)
            {
                Console.WriteLine(&lt;span class="str"&gt;"Error: {0}"&lt;/span&gt;, e.Message);
            }
            Console.ReadLine();
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; X509Certificate2 LoadCertificate(StoreLocation storeLocation, &lt;span class="kwrd"&gt;string&lt;/span&gt; certificateName )
        {
            X509Store store = &lt;span class="kwrd"&gt;new&lt;/span&gt; X509Store(storeLocation);
            store.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection certCollection = store.Certificates;
            X509Certificate2 x509 = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (X509Certificate2 c &lt;span class="kwrd"&gt;in&lt;/span&gt; certCollection)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (c.Subject == certificateName)
                {
                    x509 = c;
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                }
            }
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (x509 == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                Console.WriteLine(&lt;span class="str"&gt;"A x509 certificate for "&lt;/span&gt; + certificateName + &lt;span class="str"&gt;" was not found"&lt;/span&gt;);
            store.Close();
            &lt;span class="kwrd"&gt;return&lt;/span&gt; x509;
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DisplayX509CertificateInfo(X509Certificate2 x509)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (x509 == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;"A x509 certificate must be provided"&lt;/span&gt;);
                
            Console.WriteLine(&lt;span class="str"&gt;"{0}Subject: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.Subject);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Issuer: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.Issuer);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Version: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.Version);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Valid Date: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.NotBefore);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Expiry Date: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.NotAfter);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Thumbprint: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.Thumbprint);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Serial Number: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.SerialNumber);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Friendly Name: {1}{0}"&lt;/span&gt;,Environment.NewLine,x509.PublicKey.Oid.FriendlyName);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Public Key Format: {1}{0}"&lt;/span&gt;,Environment.NewLine,x509.PublicKey.EncodedKeyValue.Format(&lt;span class="kwrd"&gt;true&lt;/span&gt;));
            Console.WriteLine(&lt;span class="str"&gt;"{0}Raw Data Length: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.RawData.Length);
            Console.WriteLine(&lt;span class="str"&gt;"{0}Certificate to string: {1}{0}"&lt;/span&gt;, Environment.NewLine,x509.ToString(&lt;span class="kwrd"&gt;true&lt;/span&gt;));

            Console.WriteLine(&lt;span class="str"&gt;"{0}Certificate to XML String: {1}{0}"&lt;/span&gt;,Environment.NewLine,x509.PublicKey.Key.ToXmlString(&lt;span class="kwrd"&gt;false&lt;/span&gt;));
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Encrypt(X509Certificate2 x509, &lt;span class="kwrd"&gt;string&lt;/span&gt; stringToEncrypt)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (x509 == &lt;span class="kwrd"&gt;null&lt;/span&gt; || &lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(stringToEncrypt))
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;"A x509 certificate and string for encryption must be provided"&lt;/span&gt;);
                
            RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)x509.PublicKey.Key;
            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] bytestoEncrypt = ASCIIEncoding.ASCII.GetBytes(stringToEncrypt);
            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] encryptedBytes = rsa.Encrypt(bytestoEncrypt, &lt;span class="kwrd"&gt;false&lt;/span&gt;);
            &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ToBase64String(encryptedBytes);
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Decrypt(X509Certificate2 x509, &lt;span class="kwrd"&gt;string&lt;/span&gt; stringTodecrypt)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (x509 == &lt;span class="kwrd"&gt;null&lt;/span&gt; || &lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(stringTodecrypt))
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;"A x509 certificate and string for decryption must be provided"&lt;/span&gt;);
                
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!x509.HasPrivateKey)
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;"x509 certicate does not contain a private key for decryption"&lt;/span&gt;);
                
            RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)x509.PrivateKey;
            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] bytestodecrypt = Convert.FromBase64String(stringTodecrypt);
            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] plainbytes = rsa.Decrypt(bytestodecrypt, &lt;span class="kwrd"&gt;false&lt;/span&gt;);
            System.Text.ASCIIEncoding enc = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Text.ASCIIEncoding();
            &lt;span class="kwrd"&gt;return&lt;/span&gt; enc.GetString(plainbytes);
        }
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;RSACryptoServiceProvider: &lt;a title="http://msdn.microsoft.com/en-us/library/bfsktky3(VS.80).aspx" href="http://msdn.microsoft.com/en-us/library/bfsktky3(VS.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/bfsktky3(VS.80).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MakeCert: &lt;a title="http://msdn.microsoft.com/en-us/library/bfsktky3(VS.80).aspx" href="http://msdn.microsoft.com/en-us/library/bfsktky3(VS.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/bfsktky3(VS.80).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;X509Certificate2 Class: &lt;a title="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-2990130910344138657?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/2990130910344138657/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=2990130910344138657&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2990130910344138657?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2990130910344138657?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/encryptingdecrypting-using.html" title="Encrypting/Decrypting using DigitalCertificates using C#" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;CkINSHo9cCp7ImA9WxBUFEs.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-5992060827875777223</id><published>2010-02-26T15:32:00.001-07:00</published><updated>2010-03-01T09:23:19.468-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-01T09:23:19.468-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Code Sample" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Example of Rijndael based encryption/decryption in C#</title><content type="html">&lt;p&gt;from: &lt;a title="http://www.obviex.com/samples/Code.aspx?Source=EncryptionCS&amp;amp;Title=Symmetric%20Key%20Encryption&amp;amp;Lang=C%23" href="http://www.obviex.com/samples/Code.aspx?Source=EncryptionCS&amp;amp;Title=Symmetric%20Key%20Encryption&amp;amp;Lang=C%23"&gt;http://www.obviex.com/samples/Code.aspx?Source=EncryptionCS&amp;amp;Title=Symmetric%20Key%20Encryption&amp;amp;Lang=C%23&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Uses plain text for its initialization vector and password. Which means that you can store those values in your web.config (which you would obviously have to encrypt – see &lt;a href="http://blog.aggregatedintelligence.com/2009/02/aspnet-exportable-encryption-of.html"&gt;exportable encryptio&lt;/a&gt;)&lt;/p&gt; &lt;div class="csharpcode-wrapper"&gt;&lt;pre style="width: 97.5%; height: 327px" class="csharpcode"&gt;&lt;span class="rem"&gt;///////////////////////////////////////////////////////////////////////////////&lt;/span&gt;
&lt;span class="rem"&gt;// SAMPLE: Symmetric key encryption and decryption using Rijndael algorithm.&lt;/span&gt;
&lt;span class="rem"&gt;// &lt;/span&gt;
&lt;span class="rem"&gt;// To run this sample, create a new Visual C# project using the Console&lt;/span&gt;
&lt;span class="rem"&gt;// Application template and replace the contents of the Class1.cs file with&lt;/span&gt;
&lt;span class="rem"&gt;// the code below.&lt;/span&gt;
&lt;span class="rem"&gt;//&lt;/span&gt;
&lt;span class="rem"&gt;// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, &lt;/span&gt;
&lt;span class="rem"&gt;// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED &lt;/span&gt;
&lt;span class="rem"&gt;// WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.&lt;/span&gt;
&lt;span class="rem"&gt;// &lt;/span&gt;
&lt;span class="rem"&gt;// Copyright (C) 2002 Obviex(TM). All rights reserved.&lt;/span&gt;
&lt;span class="rem"&gt;// &lt;/span&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Cryptography;

&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// This class uses a symmetric key algorithm (Rijndael/AES) to encrypt and &lt;/span&gt;
&lt;span class="rem"&gt;/// decrypt data. As long as encryption and decryption routines use the same&lt;/span&gt;
&lt;span class="rem"&gt;/// parameters to generate the keys, the keys are guaranteed to be the same.&lt;/span&gt;
&lt;span class="rem"&gt;/// The class uses static functions with duplicate code to make it easier to&lt;/span&gt;
&lt;span class="rem"&gt;/// demonstrate encryption and decryption logic. In a real-life application, &lt;/span&gt;
&lt;span class="rem"&gt;/// this may not be the most efficient way of handling encryption, so - as&lt;/span&gt;
&lt;span class="rem"&gt;/// soon as you feel comfortable with it - you may want to redesign this class.&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RijndaelSimple
{
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Encrypts specified plaintext using Rijndael symmetric key algorithm&lt;/span&gt;
    &lt;span class="rem"&gt;/// and returns a base64-encoded result.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="plainText"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Plaintext value to be encrypted.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="passPhrase"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Passphrase from which a pseudo-random password will be derived. The&lt;/span&gt;
    &lt;span class="rem"&gt;/// derived password will be used to generate the encryption key.&lt;/span&gt;
    &lt;span class="rem"&gt;/// Passphrase can be any string. In this example we assume that this&lt;/span&gt;
    &lt;span class="rem"&gt;/// passphrase is an ASCII string.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="saltValue"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Salt value used along with passphrase to generate password. Salt can&lt;/span&gt;
    &lt;span class="rem"&gt;/// be any string. In this example we assume that salt is an ASCII string.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="hashAlgorithm"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Hash algorithm used to generate password. Allowed values are: "MD5" and&lt;/span&gt;
    &lt;span class="rem"&gt;/// "SHA1". SHA1 hashes are a bit slower, but more secure than MD5 hashes.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="passwordIterations"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Number of iterations used to generate password. One or two iterations&lt;/span&gt;
    &lt;span class="rem"&gt;/// should be enough.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="initVector"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Initialization vector (or IV). This value is required to encrypt the&lt;/span&gt;
    &lt;span class="rem"&gt;/// first block of plaintext data. For RijndaelManaged class IV must be &lt;/span&gt;
    &lt;span class="rem"&gt;/// exactly 16 ASCII characters long.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="keySize"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Size of encryption key in bits. Allowed values are: 128, 192, and 256. &lt;/span&gt;
    &lt;span class="rem"&gt;/// Longer keys are more secure than shorter keys.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Encrypted value formatted as a base64-encoded string.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Encrypt(&lt;span class="kwrd"&gt;string&lt;/span&gt;   plainText,
                                 &lt;span class="kwrd"&gt;string&lt;/span&gt;   passPhrase,
                                 &lt;span class="kwrd"&gt;string&lt;/span&gt;   saltValue,
                                 &lt;span class="kwrd"&gt;string&lt;/span&gt;   hashAlgorithm,
                                 &lt;span class="kwrd"&gt;int&lt;/span&gt;      passwordIterations,
                                 &lt;span class="kwrd"&gt;string&lt;/span&gt;   initVector,
                                 &lt;span class="kwrd"&gt;int&lt;/span&gt;      keySize)
    {
        &lt;span class="rem"&gt;// Convert strings into byte arrays.&lt;/span&gt;
        &lt;span class="rem"&gt;// Let us assume that strings only contain ASCII codes.&lt;/span&gt;
        &lt;span class="rem"&gt;// If strings include Unicode characters, use Unicode, UTF7, or UTF8 &lt;/span&gt;
        &lt;span class="rem"&gt;// encoding.&lt;/span&gt;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] saltValueBytes  = Encoding.ASCII.GetBytes(saltValue);
        
        &lt;span class="rem"&gt;// Convert our plaintext into a byte array.&lt;/span&gt;
        &lt;span class="rem"&gt;// Let us assume that plaintext contains UTF8-encoded characters.&lt;/span&gt;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] plainTextBytes  = Encoding.UTF8.GetBytes(plainText);
        
        &lt;span class="rem"&gt;// First, we must create a password, from which the key will be derived.&lt;/span&gt;
        &lt;span class="rem"&gt;// This password will be generated from the specified passphrase and &lt;/span&gt;
        &lt;span class="rem"&gt;// salt value. The password will be created using the specified hash &lt;/span&gt;
        &lt;span class="rem"&gt;// algorithm. Password creation can be done in several iterations.&lt;/span&gt;
        PasswordDeriveBytes password = &lt;span class="kwrd"&gt;new&lt;/span&gt; PasswordDeriveBytes(
                                                        passPhrase, 
                                                        saltValueBytes, 
                                                        hashAlgorithm, 
                                                        passwordIterations);
        
        &lt;span class="rem"&gt;// Use the password to generate pseudo-random bytes for the encryption&lt;/span&gt;
        &lt;span class="rem"&gt;// key. Specify the size of the key in bytes (instead of bits).&lt;/span&gt;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] keyBytes = password.GetBytes(keySize / 8);
        
        &lt;span class="rem"&gt;// Create uninitialized Rijndael encryption object.&lt;/span&gt;
        RijndaelManaged symmetricKey = &lt;span class="kwrd"&gt;new&lt;/span&gt; RijndaelManaged();
        
        &lt;span class="rem"&gt;// It is reasonable to set encryption mode to Cipher Block Chaining&lt;/span&gt;
        &lt;span class="rem"&gt;// (CBC). Use default options for other symmetric key parameters.&lt;/span&gt;
        symmetricKey.Mode = CipherMode.CBC;        
        
        &lt;span class="rem"&gt;// Generate encryptor from the existing key bytes and initialization &lt;/span&gt;
        &lt;span class="rem"&gt;// vector. Key size will be defined based on the number of the key &lt;/span&gt;
        &lt;span class="rem"&gt;// bytes.&lt;/span&gt;
        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
                                                         keyBytes, 
                                                         initVectorBytes);
        
        &lt;span class="rem"&gt;// Define memory stream which will be used to hold encrypted data.&lt;/span&gt;
        MemoryStream memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();        
                
        &lt;span class="rem"&gt;// Define cryptographic stream (always use Write mode for encryption).&lt;/span&gt;
        CryptoStream cryptoStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; CryptoStream(memoryStream, 
                                                     encryptor,
                                                     CryptoStreamMode.Write);
        &lt;span class="rem"&gt;// Start encrypting.&lt;/span&gt;
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                
        &lt;span class="rem"&gt;// Finish encrypting.&lt;/span&gt;
        cryptoStream.FlushFinalBlock();

        &lt;span class="rem"&gt;// Convert our encrypted data from a memory stream into a byte array.&lt;/span&gt;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] cipherTextBytes = memoryStream.ToArray();
                
        &lt;span class="rem"&gt;// Close both streams.&lt;/span&gt;
        memoryStream.Close();
        cryptoStream.Close();
        
        &lt;span class="rem"&gt;// Convert encrypted data into a base64-encoded string.&lt;/span&gt;
        &lt;span class="kwrd"&gt;string&lt;/span&gt; cipherText = Convert.ToBase64String(cipherTextBytes);
        
        &lt;span class="rem"&gt;// Return encrypted string.&lt;/span&gt;
        &lt;span class="kwrd"&gt;return&lt;/span&gt; cipherText;
    }
    
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Decrypts specified ciphertext using Rijndael symmetric key algorithm.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="cipherText"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Base64-formatted ciphertext value.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="passPhrase"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Passphrase from which a pseudo-random password will be derived. The&lt;/span&gt;
    &lt;span class="rem"&gt;/// derived password will be used to generate the encryption key.&lt;/span&gt;
    &lt;span class="rem"&gt;/// Passphrase can be any string. In this example we assume that this&lt;/span&gt;
    &lt;span class="rem"&gt;/// passphrase is an ASCII string.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="saltValue"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Salt value used along with passphrase to generate password. Salt can&lt;/span&gt;
    &lt;span class="rem"&gt;/// be any string. In this example we assume that salt is an ASCII string.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="hashAlgorithm"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Hash algorithm used to generate password. Allowed values are: "MD5" and&lt;/span&gt;
    &lt;span class="rem"&gt;/// "SHA1". SHA1 hashes are a bit slower, but more secure than MD5 hashes.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="passwordIterations"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Number of iterations used to generate password. One or two iterations&lt;/span&gt;
    &lt;span class="rem"&gt;/// should be enough.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="initVector"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Initialization vector (or IV). This value is required to encrypt the&lt;/span&gt;
    &lt;span class="rem"&gt;/// first block of plaintext data. For RijndaelManaged class IV must be&lt;/span&gt;
    &lt;span class="rem"&gt;/// exactly 16 ASCII characters long.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name="keySize"&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Size of encryption key in bits. Allowed values are: 128, 192, and 256.&lt;/span&gt;
    &lt;span class="rem"&gt;/// Longer keys are more secure than shorter keys.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Decrypted string value.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Most of the logic in this function is similar to the Encrypt&lt;/span&gt;
    &lt;span class="rem"&gt;/// logic. In order for decryption to work, all parameters of this function&lt;/span&gt;
    &lt;span class="rem"&gt;/// - except cipherText value - must match the corresponding parameters of&lt;/span&gt;
    &lt;span class="rem"&gt;/// the Encrypt function which was called to generate the&lt;/span&gt;
    &lt;span class="rem"&gt;/// ciphertext.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Decrypt(&lt;span class="kwrd"&gt;string&lt;/span&gt;   cipherText,
                                 &lt;span class="kwrd"&gt;string&lt;/span&gt;   passPhrase,
                                 &lt;span class="kwrd"&gt;string&lt;/span&gt;   saltValue,
                                 &lt;span class="kwrd"&gt;string&lt;/span&gt;   hashAlgorithm,
                                 &lt;span class="kwrd"&gt;int&lt;/span&gt;      passwordIterations,
                                 &lt;span class="kwrd"&gt;string&lt;/span&gt;   initVector,
                                 &lt;span class="kwrd"&gt;int&lt;/span&gt;      keySize)
    {
        &lt;span class="rem"&gt;// Convert strings defining encryption key characteristics into byte&lt;/span&gt;
        &lt;span class="rem"&gt;// arrays. Let us assume that strings only contain ASCII codes.&lt;/span&gt;
        &lt;span class="rem"&gt;// If strings include Unicode characters, use Unicode, UTF7, or UTF8&lt;/span&gt;
        &lt;span class="rem"&gt;// encoding.&lt;/span&gt;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] saltValueBytes  = Encoding.ASCII.GetBytes(saltValue);
        
        &lt;span class="rem"&gt;// Convert our ciphertext into a byte array.&lt;/span&gt;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] cipherTextBytes = Convert.FromBase64String(cipherText);
        
        &lt;span class="rem"&gt;// First, we must create a password, from which the key will be &lt;/span&gt;
        &lt;span class="rem"&gt;// derived. This password will be generated from the specified &lt;/span&gt;
        &lt;span class="rem"&gt;// passphrase and salt value. The password will be created using&lt;/span&gt;
        &lt;span class="rem"&gt;// the specified hash algorithm. Password creation can be done in&lt;/span&gt;
        &lt;span class="rem"&gt;// several iterations.&lt;/span&gt;
        PasswordDeriveBytes password = &lt;span class="kwrd"&gt;new&lt;/span&gt; PasswordDeriveBytes(
                                                        passPhrase, 
                                                        saltValueBytes, 
                                                        hashAlgorithm, 
                                                        passwordIterations);
        
        &lt;span class="rem"&gt;// Use the password to generate pseudo-random bytes for the encryption&lt;/span&gt;
        &lt;span class="rem"&gt;// key. Specify the size of the key in bytes (instead of bits).&lt;/span&gt;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] keyBytes = password.GetBytes(keySize / 8);
        
        &lt;span class="rem"&gt;// Create uninitialized Rijndael encryption object.&lt;/span&gt;
        RijndaelManaged    symmetricKey = &lt;span class="kwrd"&gt;new&lt;/span&gt; RijndaelManaged();
        
        &lt;span class="rem"&gt;// It is reasonable to set encryption mode to Cipher Block Chaining&lt;/span&gt;
        &lt;span class="rem"&gt;// (CBC). Use default options for other symmetric key parameters.&lt;/span&gt;
        symmetricKey.Mode = CipherMode.CBC;
        
        &lt;span class="rem"&gt;// Generate decryptor from the existing key bytes and initialization &lt;/span&gt;
        &lt;span class="rem"&gt;// vector. Key size will be defined based on the number of the key &lt;/span&gt;
        &lt;span class="rem"&gt;// bytes.&lt;/span&gt;
        ICryptoTransform decryptor = symmetricKey.CreateDecryptor(
                                                         keyBytes, 
                                                         initVectorBytes);
        
        &lt;span class="rem"&gt;// Define memory stream which will be used to hold encrypted data.&lt;/span&gt;
        MemoryStream  memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(cipherTextBytes);
                
        &lt;span class="rem"&gt;// Define cryptographic stream (always use Read mode for encryption).&lt;/span&gt;
        CryptoStream  cryptoStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; CryptoStream(memoryStream, 
                                                      decryptor,
                                                      CryptoStreamMode.Read);

        &lt;span class="rem"&gt;// Since at this point we don't know what the size of decrypted data&lt;/span&gt;
        &lt;span class="rem"&gt;// will be, allocate the buffer long enough to hold ciphertext;&lt;/span&gt;
        &lt;span class="rem"&gt;// plaintext is never longer than ciphertext.&lt;/span&gt;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] plainTextBytes = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[cipherTextBytes.Length];
        
        &lt;span class="rem"&gt;// Start decrypting.&lt;/span&gt;
        &lt;span class="kwrd"&gt;int&lt;/span&gt; decryptedByteCount = cryptoStream.Read(plainTextBytes, 
                                                   0, 
                                                   plainTextBytes.Length);
                
        &lt;span class="rem"&gt;// Close both streams.&lt;/span&gt;
        memoryStream.Close();
        cryptoStream.Close();
        
        &lt;span class="rem"&gt;// Convert decrypted data into a string. &lt;/span&gt;
        &lt;span class="rem"&gt;// Let us assume that the original plaintext string was UTF8-encoded.&lt;/span&gt;
        &lt;span class="kwrd"&gt;string&lt;/span&gt; plainText = Encoding.UTF8.GetString(plainTextBytes, 
                                                   0, 
                                                   decryptedByteCount);
        
        &lt;span class="rem"&gt;// Return decrypted string.   &lt;/span&gt;
        &lt;span class="kwrd"&gt;return&lt;/span&gt; plainText;
    }
}

&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Illustrates the use of RijndaelSimple class to encrypt and decrypt data.&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RijndaelSimpleTest
{
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// The main entry point for the application.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    [STAThread]
    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
    {
        &lt;span class="kwrd"&gt;string&lt;/span&gt;   plainText          = &lt;span class="str"&gt;"Hello, World!"&lt;/span&gt;;    &lt;span class="rem"&gt;// original plaintext&lt;/span&gt;
        
        &lt;span class="kwrd"&gt;string&lt;/span&gt;   passPhrase         = &lt;span class="str"&gt;"Pas5pr@se"&lt;/span&gt;;        &lt;span class="rem"&gt;// can be any string&lt;/span&gt;
        &lt;span class="kwrd"&gt;string&lt;/span&gt;   saltValue          = &lt;span class="str"&gt;"s@1tValue"&lt;/span&gt;;        &lt;span class="rem"&gt;// can be any string&lt;/span&gt;
        &lt;span class="kwrd"&gt;string&lt;/span&gt;   hashAlgorithm      = &lt;span class="str"&gt;"SHA1"&lt;/span&gt;;             &lt;span class="rem"&gt;// can be "MD5"&lt;/span&gt;
        &lt;span class="kwrd"&gt;int&lt;/span&gt;      passwordIterations = 2;                  &lt;span class="rem"&gt;// can be any number&lt;/span&gt;
        &lt;span class="kwrd"&gt;string&lt;/span&gt;   initVector         = &lt;span class="str"&gt;"@1B2c3D4e5F6g7H8"&lt;/span&gt;; &lt;span class="rem"&gt;// must be 16 bytes&lt;/span&gt;
        &lt;span class="kwrd"&gt;int&lt;/span&gt;      keySize            = 256;                &lt;span class="rem"&gt;// can be 192 or 128&lt;/span&gt;
        
        Console.WriteLine(String.Format(&lt;span class="str"&gt;"Plaintext : {0}"&lt;/span&gt;, plainText));

        &lt;span class="kwrd"&gt;string&lt;/span&gt;  cipherText = RijndaelSimple.Encrypt(plainText,
                                                    passPhrase,
                                                    saltValue,
                                                    hashAlgorithm,
                                                    passwordIterations,
                                                    initVector,
                                                    keySize);

        Console.WriteLine(String.Format(&lt;span class="str"&gt;"Encrypted : {0}"&lt;/span&gt;, cipherText));
        
        plainText          = RijndaelSimple.Decrypt(cipherText,
                                                    passPhrase,
                                                    saltValue,
                                                    hashAlgorithm,
                                                    passwordIterations,
                                                    initVector,
                                                    keySize);

        Console.WriteLine(String.Format(&lt;span class="str"&gt;"Decrypted : {0}"&lt;/span&gt;, plainText));
    }
}
&lt;span class="rem"&gt;//&lt;/span&gt;
&lt;span class="rem"&gt;// END OF FILE&lt;/span&gt;
&lt;span class="rem"&gt;///////////////////////////////////////////////////////////////////////////////&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-5992060827875777223?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/5992060827875777223/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=5992060827875777223&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/5992060827875777223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/5992060827875777223?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/example-of-rihndael-based.html" title="Example of Rijndael based encryption/decryption in C#" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;DkYDQXs6eSp7ImA9WxBUEEg.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-6516924394447365548</id><published>2010-02-24T16:29:00.001-07:00</published><updated>2010-02-24T16:29:30.511-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-24T16:29:30.511-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips N Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools and Utilities" /><title>Google Tasks - Bookmarklet</title><content type="html">&lt;p&gt;Here is a bookmarklet that opens Google Tasks in its own little window:&lt;/p&gt; &lt;p&gt;&lt;a href="http://mail.google.com/tasks/ig','','resizable=1,toolbar=0,location=0,status=0,menubar=0,scrollbars=1,width=400,height=600');newwindow.focus();"&gt;javascript:newwindow=window.open('http://mail.google.com/tasks/ig','','resizable=1,toolbar=0,location=0,status=0,menubar=0,scrollbars=1,width=400,height=600');newwindow.focus();&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Just create a bookmark, open its properties and paste the above code into the address field. Move the bookmark to your toolbar for easy access.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-6516924394447365548?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/6516924394447365548/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=6516924394447365548&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/6516924394447365548?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/6516924394447365548?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/google-tasks-bookmarklet.html" title="Google Tasks - Bookmarklet" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkMHR346fCp7ImA9WxBUEE8.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-1156195148527305054</id><published>2010-02-23T22:54:00.000-07:00</published><updated>2010-02-24T08:13:56.014-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-24T08:13:56.014-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="DotNetNuke" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net" /><category scheme="http://www.blogger.com/atom/ns#" term="Developer" /><title>DotNetNuke Zero Day Vulnerability (semi-colon bug)</title><content type="html">&lt;p&gt;There is a major security loop hole in DotNetNuke versions 4.9.2 and below where DNN will allow an unauthorized user to upload &lt;strong&gt;almost any &lt;/strong&gt;file onto the server. This loop hole combined with the IIS 5/6 zero day multiple extension exploit can allow a hacker complete access to your website.So if you are a DNN version that is &lt;strong&gt;not 4.9.4 and up &lt;/strong&gt;– read on as this is huge hole in your website.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The DNN Issue:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;If you browse to the following sub-folder on your DNN site “&lt;strong&gt;&lt;u&gt;Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx&lt;/u&gt;&lt;/strong&gt;”, you will see a page that looks like this:&lt;br&gt;&amp;nbsp;&lt;a href="http://lh4.ggpht.com/_dIvFa14S0yc/S4RrC2BgckI/AAAAAAAAJIU/_XWJIHt9oTs/s1600-h/image%5B30%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_dIvFa14S0yc/S4RrDarmmnI/AAAAAAAAJIY/EEVKeaQ_RQY/image_thumb%5B18%5D.png?imgmax=800" width="342" height="226"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The above page on its own is not too bad. But if you now paste the following javascript code into the address bar and hit enter: “&lt;strong&gt;javascript:__doPostBack('ctlURL$cmdUpload','')&lt;/strong&gt;” you will see the following browse dialog which will allow you to upload almost any file onto the website (restricted to the list of files allowed by FCKEditor – typically images, documents, etc).&lt;br&gt;&lt;a href="http://lh3.ggpht.com/_dIvFa14S0yc/S4RrDz0zGbI/AAAAAAAAJIc/GaxH0G6zxX8/s1600-h/image%5B29%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_dIvFa14S0yc/S4RrEKfag4I/AAAAAAAAJIg/nOuxNB5MoHk/image_thumb%5B17%5D.png?imgmax=800" width="382" height="247"&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;The above hack will typically lead to hackers dropping small txt files that have some kind of a notice saying that your website has been hacked!&lt;br&gt;&lt;a href="http://lh3.ggpht.com/_dIvFa14S0yc/S4RrEuJkTiI/AAAAAAAAJIk/h3b3xNZW-tE/s1600-h/image%5B28%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_dIvFa14S0yc/S4RrFHZDwMI/AAAAAAAAJIo/Ks1VVE_MDIg/image_thumb%5B16%5D.png?imgmax=800" width="403" height="50"&gt;&lt;/a&gt; &lt;br&gt;It is hard to do anything substantial with this hack alone.&lt;/p&gt; &lt;p&gt;But wait there is more…..&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The IIS Issue:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;On December 25th of 2009, an “Ethical” hacker found a vulnerability in IIS 5 and IIS 6 called the “semi-colon” bug or the “multiple extensions IIS/ASP bug”. &lt;a href="http://soroush.secproject.com/downloadable/iis-semicolon-report.pdf"&gt;Read More&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The semi-colon bug allows any file that has .asp in the file name to execute as an ASP file. This bug occurs in all versions of IIS 6 and prior. This means that a file named “innocusFile.asp;.jpg” will be executed like an ASP file.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The big scary picture:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The 2 bugs on their own were bad, but it still would be hard for anything bad to happen. But together – they open up a can of worms that is going to make everyone in your organization pulling every fire alarm in the building. Here is the big picture:&lt;/p&gt; &lt;p&gt;1. Hacker fabricates an ASP file that uses COM objects such as the FileSystemObject to get complete access to your computer.&lt;br&gt;2. Hacker names the asp file as “myHack.asp;.jpg”.&lt;br&gt;3. Hacker navigates to the “&lt;strong&gt;&lt;u&gt;Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx&lt;/u&gt;&lt;/strong&gt;” file in his browser and uses the DNN loop hole to upload his myHack.asp;.jpg file. DNN complies because it thinks it is a simple jpg file. This is because DNN looks only at the last extension it finds in a file name.&lt;br&gt;4. The file uploads to the DNN website to the folder (WITHHELD – to protect unprotected DNN sites).&lt;br&gt;5. The hacker browses to the file that he uploaded. The file is delivered to the ASP processing engine by IIS and a page that opens up the entire computer to the hacker is displayed. This is because IIS has been coded such that it recognizes a file type based on its extension even if the extension is not the last part of the file name!!&lt;br&gt;6. The hacker uses his ASP page to get full control of your website (and I mean full control – all disk drives, connection strings, databases, registy, etc.). Nothing is safe after this.&lt;br&gt;Here is a sample ASP file called the “Smart Shell”, that basically shows the capabilities that an hacker can get over your website: (This kind of an ASP file is also called the 3fexe ASP hack).&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_dIvFa14S0yc/S4RrFUHwHKI/AAAAAAAAJIs/wOJnhJg0nU8/s1600-h/image%5B31%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_dIvFa14S0yc/S4RrGF9KUoI/AAAAAAAAJIw/HpTQhLZmOcc/image_thumb%5B19%5D.png?imgmax=800" width="741" height="808"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;How to mitigate:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Because there is no known fix, there are only ways to mitigate this attack (and hence it is a zero-day hack).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1. Rename the fcklinkgallery.aspx file&lt;br&gt;&lt;/strong&gt;As fcklinkgallery.aspx is the entry point for this hack attack, the first thing to do is to rename this file. I suggest using a random file name – like a guid. After you rename the file, you will need to update the “LinksGalleryPath” setting in your config file. This will be found in the &amp;lt;dotnetnuke&amp;gt;&amp;lt;htmlEditor&amp;gt;&amp;lt;providers&amp;gt;&amp;lt;add name="FckHtmlEditorProvider"&amp;gt; section. Just look for “LinksGalleryPath” and update the value to the newly named file name.&lt;br&gt;If the hacker cannot browse to the fcklinkgallery.aspx file, he will not be able to upload a ASP file onto your DNN site.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2. Remove Execute permission on the Portals folder of your DNN site.&lt;br&gt;&lt;/strong&gt;The sub-folder “Portals” in your DNN site typically does not need to be able to run ASP files or any other files. So remove “Execute” permissions on that folder.&lt;br&gt;Open up IIS.&lt;br&gt;Expand the website node for your DNN site.&lt;br&gt;Select the Portals node in the explorer view on the left.&lt;br&gt;Right click on the Portals node and open the Properties dialog.&lt;br&gt;Chose the Directory Node.&lt;br&gt;Set Execute Permissions to “None”.&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;3. Remove access to FileSystemObject.&lt;br&gt;&lt;/strong&gt;This falls into the excessively precautious as it is not really required for you to do. An important note: Do not do this if you know that you have some ASP apps on your site and if those ASP apps use FileSystemObject – you might end up hosing those apps.&lt;br&gt;There are 2 ways to do this: Remove access to this COM object from the security principal used to run your IIS website (typically ASPNET) or to completely unregister the dll.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;1. Registry access:&lt;br&gt;Open registry editor.&lt;br&gt;Browse to “HKEY_CLASSES_ROOT\Scripting.FileSystemObject”, right click and under permissions deny access to the ASPNET user.&lt;/p&gt; &lt;p&gt;2. Completely disable FileSystemObject&lt;br&gt;Run regsvr32 scrrun.dll .u in the C:\windows\System32 folder.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Remember – step 3 is really not required to be done.&lt;/strong&gt;&lt;/p&gt; &lt;h4&gt;&lt;u&gt;The only Fix:&lt;/u&gt;&lt;br&gt;&lt;/h4&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;The only “&lt;strong&gt;true&lt;/strong&gt;” fix is to upgrade to IIS 7 or higher and a DNN version of 4.9.4 or higher.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Notes:&lt;br&gt;&lt;/strong&gt;&lt;strong&gt;Securing IIS 6.0:&lt;br&gt;&lt;/strong&gt;&lt;a title="http://technet.microsoft.com/en-us/library/cc875829.aspx" href="http://technet.microsoft.com/en-us/library/cc875829.aspx"&gt;http://technet.microsoft.com/en-us/library/cc875829.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;One way hacking (which is what the above type of hack is known as):&lt;br&gt;&lt;/strong&gt;&lt;a title="http://www.net-square.com/papers/one_way/one_way.html" href="http://www.net-square.com/papers/one_way/one_way.html"&gt;http://www.net-square.com/papers/one_way/one_way.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Restricting information available to anonymous users:&lt;/strong&gt;&lt;br&gt;&lt;a href="http://support.microsoft.com/kb/143474"&gt;http://support.microsoft.com/kb/143474&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;DNN LinkGallery Remote File Upload without Extension:&lt;br&gt;&lt;/strong&gt;&lt;a title="http://securityreason.com/exploitalert/6234" href="http://securityreason.com/exploitalert/6234"&gt;http://securityreason.com/exploitalert/6234&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;DNN Failure to revalidate file and folder permissions correctly for uploads:&lt;br&gt;&lt;/strong&gt;&lt;a title="http://www.dotnetnuke.com/News/SecurityPolicy/SecurityBulletinno17/tabid/1162/Default.aspx" href="http://www.dotnetnuke.com/News/SecurityPolicy/SecurityBulletinno17/tabid/1162/Default.aspx"&gt;http://www.dotnetnuke.com/News/SecurityPolicy/SecurityBulletinno17/tabid/1162/Default.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;IIS Security Vulnerability and DNN&lt;br&gt;&lt;/strong&gt;&lt;a title="http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/108/postid/347394/scope/posts/Default.aspx" href="http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/108/postid/347394/scope/posts/Default.aspx"&gt;http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/108/postid/347394/scope/posts/Default.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-1156195148527305054?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/1156195148527305054/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=1156195148527305054&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/1156195148527305054?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/1156195148527305054?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/dotnetnuke-version-zero-day.html" title="DotNetNuke Zero Day Vulnerability (semi-colon bug)" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CEcCQ3c7eSp7ImA9WxBVGUo.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-884138928420905993</id><published>2010-02-23T17:41:00.001-07:00</published><updated>2010-02-23T17:41:02.901-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T17:41:02.901-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>SQL Server and External Connector Licenses</title><content type="html">&lt;p&gt;If you have a web-application that uses a SQL Server database then you might have to buy an external connector license (this I did not know before today – luckily we have a licensing guy in our org.)&lt;/p&gt; &lt;p&gt;From &lt;a href="http://www.microsoft.com/licensing/about-licensing/client-access-license.aspx"&gt;http://www.microsoft.com/licensing/about-licensing/client-access-license.aspx&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;External Connector Licensing:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;An external user is a person who is not an employee or similar personnel of the company or its affiliates, and is not someone to whom you provide hosted services. An EC license assigned to a server permits access by any number of external users, as long as that access is for the benefit of the licensee and not the external user.&lt;/p&gt; &lt;p&gt;Anyways, the only time you wont need an external connector license for your SQL Server database is when your installation is licensed by the processor.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Per Processor Licensing&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Under the Per Processor model, you acquire a Processor License for each processor in the server on which the software is running.&lt;strong&gt;&lt;em&gt; A Processor License includes access for an unlimited number of users to connect from either inside the local area network (LAN) or wide area network (WAN), or outside the firewall (via the Internet). You do not need to purchase additional server licenses, CALs, or Internet Connector Licenses.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-884138928420905993?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/884138928420905993/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=884138928420905993&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/884138928420905993?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/884138928420905993?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/sql-server-and-external-connector.html" title="SQL Server and External Connector Licenses" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEcFR3s4eyp7ImA9WxBVGEs.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-4280966299923610010</id><published>2010-02-22T12:13:00.001-07:00</published><updated>2010-02-22T12:13:36.533-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-22T12:13:36.533-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Code Sample" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net" /><title>Response.Redirect cannot be called in a Page callback</title><content type="html">&lt;p&gt;If you are getting the “Response.Redirect cannot be called in a Page callback” then you are most probably using AJAX and you are using a Response.Redirect (or Server.Transfer) in an event that was fired from within an AJAX panel. &lt;/p&gt; &lt;p&gt;The reason this does not work is that there is only a partial post-back that occurs with controls that are within an AJAX panel and you cannot perform a Redirect from within a partial post-back.&lt;/p&gt; &lt;p&gt;Fixes:&lt;/p&gt; &lt;p&gt;1. Dont do a redirect in an event that is fired due to a partial post-back!&lt;/p&gt; &lt;p&gt;2. In the event, instead of doing a redirect, register a javascript method that will perform the redirect from the client’s browser. eg:&lt;/p&gt; &lt;div class="csharpcode-wrapper"&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; script = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"document.location.href = '{0}');"&lt;/span&gt;, &lt;span class="str"&gt;"&lt;strong&gt;pageToRedirectTo&lt;/strong&gt;.aspx"&lt;/span&gt;);
ScriptManager.RegisterClientScriptBlock(Page, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Page), &lt;span class="str"&gt;"redirect"&lt;/span&gt;, script, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-4280966299923610010?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/4280966299923610010/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=4280966299923610010&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/4280966299923610010?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/4280966299923610010?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/responseredirect-cannot-be-called-in.html" title="Response.Redirect cannot be called in a Page callback" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUYDQHY7eCp7ImA9WxBVFko.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-6720340197660660120</id><published>2010-02-20T06:39:00.001-07:00</published><updated>2010-02-20T06:39:31.800-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-20T06:39:31.800-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tips N Tricks" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools and Utilities" /><title>MousePath – create your own art</title><content type="html">&lt;p&gt;Came across this very cool app that tracks your mouse and draws out lines on a large canvas. The app is called MousePath and was created by &lt;a href="http://www.anatolyzenkov.com/"&gt;Anatoliy Zenkov&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;MousePath is a Java app and can be downloaded for the PC (&lt;a href="http://dl.dropbox.com/u/684632/mousepath.exe.zip"&gt;dl.dropbox.com/u/684632/mousepath.exe.zip&lt;/a&gt;) and Mac(&lt;a href="http://dl.dropbox.com/u/684632/mousepath.jar"&gt;dl.dropbox.com/u/684632/mousepath.jar&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;You run the app and leave it in its maximized state and then go about doing your daily work. And when you are happy with the art created just hit the S button and it will create a file in the same folder where the app is running.&lt;/p&gt;  &lt;p&gt;Here is my mousepath art created after 30 minutes:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_dIvFa14S0yc/S3_mD1Z4gKI/AAAAAAAAJBE/Obf1DT2UCTo/s1600-h/mousePath%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="mousePath" border="0" alt="mousePath" src="http://lh5.ggpht.com/_dIvFa14S0yc/S3_mEmZzoKI/AAAAAAAAJBI/AnXd8Ca_ddg/mousePath_thumb%5B1%5D.jpg?imgmax=800" width="644" height="392" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-6720340197660660120?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/6720340197660660120/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=6720340197660660120&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/6720340197660660120?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/6720340197660660120?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/mousepath-create-your-own-art.html" title="MousePath – create your own art" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkINQ346eyp7ImA9WxBVFk4.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-6436929380511127988</id><published>2010-02-19T19:56:00.001-07:00</published><updated>2010-02-19T19:56:32.013-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-19T19:56:32.013-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="Developer" /><title>BBC Redesign</title><content type="html">&lt;p&gt;Here is a post on how the BBC is redesigning their new website. I found it an interesting study in design and how through their project was (setting guidelines on underlying grids, color palettes, embedding of audio/video, etc).&lt;/p&gt;  &lt;p&gt;Also as some one who is completely bereft of the ability to choose good colors that go well with each other, there are palettes on the page that I could use on my web-pages (as well as other design pointers).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bbc.co.uk/blogs/bbcinternet/2010/02/a_new_global_visual_language_f.html"&gt;http://www.bbc.co.uk/blogs/bbcinternet/2010/02/a_new_global_visual_language_f.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_dIvFa14S0yc/S39PXBAKltI/AAAAAAAAJA8/6nE0hi5Ik58/s1600-h/3-GVL2-Grid%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="3-GVL2-Grid" border="0" alt="3-GVL2-Grid" src="http://lh6.ggpht.com/_dIvFa14S0yc/S39PX_UHVnI/AAAAAAAAJBA/Trz6I7psbHc/3-GVL2-Grid_thumb%5B2%5D.jpg?imgmax=800" width="604" height="449" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-6436929380511127988?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/6436929380511127988/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=6436929380511127988&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/6436929380511127988?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/6436929380511127988?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/bbc-redesign.html" title="BBC Redesign" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0AGQXcyfip7ImA9WxBVFk4.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-8525678689693805670</id><published>2010-02-19T19:08:00.001-07:00</published><updated>2010-02-19T19:08:40.996-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-19T19:08:40.996-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Entrepreneur" /><category scheme="http://www.blogger.com/atom/ns#" term="how-tos" /><category scheme="http://www.blogger.com/atom/ns#" term="Personal Development" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>Keeping Employees Motivated</title><content type="html">&lt;p&gt;From a Harvard Business School article:&lt;/p&gt; &lt;p&gt;First step: stop demotivating employees&lt;/p&gt; &lt;p&gt;According to the author there are just three important factors that matter most when it comes to keeping employees motivated: &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Equity&lt;/strong&gt;: To &lt;strong&gt;be respected &lt;/strong&gt;and to &lt;strong&gt;be treated fairly &lt;/strong&gt;in areas such as pay, benefits, and job security.  &lt;li&gt;&lt;strong&gt;Achievement&lt;/strong&gt;: To &lt;strong&gt;be proud of one's job, accomplishments, and employer&lt;/strong&gt;.  &lt;li&gt;&lt;strong&gt;Camaraderie&lt;/strong&gt;: To have &lt;strong&gt;good, productive relationships with fellow employees&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Interestingly, the author found that if one of the above factors is missing, then they cannot be substituted with another factor (for e.g: higher pay).&lt;/p&gt; &lt;p&gt;And here are the main things the author says managers can do in different areas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Achievement related&lt;/strong&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Instill an inspiring purpose&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Provide recognition&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Be an expediter for your employees&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Coach your employees for improvement&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;strong&gt;Equity related&lt;/strong&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Communicate fully&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Face up to poor performance&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;strong&gt;Camaraderie related&lt;/strong&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Promote teamwork&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;strong&gt;All three areas (Achievement, Equity and Camaraderie)&lt;/strong&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Listen and involve&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;Read the entire article as it elaborates on the above listed points.&lt;/p&gt; &lt;p&gt;&lt;a href="http://hbswk.hbs.edu/archive/5289.html"&gt;http://hbswk.hbs.edu/archive/5289.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-8525678689693805670?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/8525678689693805670/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=8525678689693805670&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/8525678689693805670?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/8525678689693805670?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/keeping-employees-motivated.html" title="Keeping Employees Motivated" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0cBQX0_fyp7ImA9WxBVFEo.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-2335905741047172248</id><published>2010-02-17T23:37:00.001-07:00</published><updated>2010-02-17T23:37:30.347-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-17T23:37:30.347-07:00</app:edited><title>Artisteer – Create templates for some common content systems</title><content type="html">&lt;p&gt;I have written many times on this blog that the one skill that I lack is that of an artist. Colors, layout, etc are hard for me to just create. But when I see good design, I know it. It just appeals to me. If I have to work with a good designer, then I can come up with some cool UIs – but a good designer is a luxury that isnt always available on all the projects that we work on. This is especially true for personal projects.&lt;/p&gt;  &lt;p&gt;Today I came across a tool called Artisteer. It looks very promising as a template creation engine, that makes it extremely easy to create design templates for CMSs like DotNetNuke, Blogger, etc.&lt;/p&gt;  &lt;p&gt;I plan on writing more about my experience with Artisteer.&lt;/p&gt;  &lt;p&gt;Today I tested it out with Blogger and I realized that I needed to backout the change. While exporting a template, Artisteer displayed a message about saving a backup of the existing template. But when the time came to revert back to the old design, I could not find it on my machine. Here is where you can find it:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Windows 7&lt;/strong&gt;: C:\Users\&lt;strong&gt;&amp;lt;USER_NAME&amp;gt;&lt;/strong&gt;\AppData\Roaming\Artisteer\Artisteer2\Library\BloggerBackup&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Windows Vista&lt;/strong&gt;: C:\Documents and Settings\&lt;strong&gt;&amp;lt;USER_NAME&amp;gt;&lt;/strong&gt;\Application Data\Artisteer\Artisteer2\Library\BloggerBackup&lt;/p&gt;  &lt;p&gt;Disclosure: I requested a demo license from Artisteer creators to test out the capabilities of the tool when it comes to Blogger blogs and DotNetNuke. The above instruction, as well as any others that I create related to Artisteer, will be based on my testing with a Artisteer version activated by a free license key provided by the developers of the app.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-2335905741047172248?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/2335905741047172248/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=2335905741047172248&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2335905741047172248?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2335905741047172248?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/artisteer-create-templates-for-some.html" title="Artisteer – Create templates for some common content systems" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUECQHk9fSp7ImA9WxBVFEo.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-2323412710330180826</id><published>2010-02-17T23:14:00.001-07:00</published><updated>2010-02-17T23:14:21.765-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-17T23:14:21.765-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Recycled" /><title>Recycled Material Art</title><content type="html">&lt;p&gt;Recycled material/art I came across&lt;/p&gt; &lt;a title="" href="http://tweetphoto.com/11675491"&gt;&lt;img alt="" src="http://cdn.cloudfiles.mosso.com/c54102/x2_b22763" /&gt;&lt;/a&gt; &lt;a title="" href="http://tweetphoto.com/11675383"&gt;&lt;img alt="" src="http://cdn.cloudfiles.mosso.com/c54102/x2_b226f7" /&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-2323412710330180826?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/2323412710330180826/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=2323412710330180826&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2323412710330180826?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2323412710330180826?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/recycled-material-art.html" title="Recycled Material Art" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0ECRX84cCp7ImA9WxBVFEg.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-2688373799197556475</id><published>2010-02-17T17:07:00.001-07:00</published><updated>2010-02-17T17:07:44.138-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-17T17:07:44.138-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DotNetNuke" /><title>DNN Redirect Loop</title><content type="html">&lt;p&gt;I was setting up a local dev edition of our DNN site and I went through the usual cycle:&lt;/p&gt; &lt;p&gt;1. Copy site to local machine&lt;/p&gt; &lt;p&gt;2. Set the permissions on the folder&lt;/p&gt; &lt;p&gt;3. Create a website in IIS&lt;/p&gt; &lt;p&gt;4. Copy the database to the local SQLServer Express instance&lt;/p&gt; &lt;p&gt;5. Update the Portal Alias table to point to the localhost&lt;/p&gt; &lt;p&gt;6. Update web.config’s connection strings and SiteSQLServer settings as well as the “SecureDomains”, “RedirectUrl’, and “DisplayServer” to point to the localhost.&lt;/p&gt; &lt;p&gt;7. Test&lt;/p&gt; &lt;p&gt;Hmmph!&lt;/p&gt; &lt;p&gt;The homepage was ending up in an infinite redirect loop (IE does not complain and just keeps on going in the loop. Chrome is smarter about this and complains and stops with an error page).&lt;/p&gt; &lt;p&gt;Weird thing was that I could hit a page alright if I had the correct tabid. But I could not just go “http://localhost/”&lt;/p&gt; &lt;p&gt;I checked the usual suspects – the PortalAlias table and also made sure that none of the entries ended with a “/” – all that was fine.&lt;/p&gt; &lt;p&gt;Finally found out the issue was occuring because the RedirectUrl setting in the web.config file had a trailing “/” (http://localhost/"). DNN does not like that!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-2688373799197556475?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/2688373799197556475/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=2688373799197556475&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2688373799197556475?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/2688373799197556475?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/dnn-redirect-loop.html" title="DNN Redirect Loop" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0EMR3w-fCp7ImA9WxBVFEk.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-9088508523893447996</id><published>2010-02-17T15:28:00.001-07:00</published><updated>2010-02-17T15:28:06.254-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-17T15:28:06.254-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><title>Comcast XFinity</title><content type="html">&lt;p&gt;Heard about Comcast’s XFinity upgrade today (it isnt yet available in my neck of the woods in Denver), but the features look interesting:&lt;/p&gt; &lt;p&gt;From Xfinity.com: &lt;ul&gt; &lt;li&gt;50Mbps downloads today, &lt;strong&gt;increasing to 100+ Mbps &lt;/strong&gt;and even faster in the future  &lt;li&gt;100+ HD channels, 5,000+ HD choices, and the best HD picture quality available  &lt;li&gt;50 to 70 multi-cultural channels  &lt;li&gt;Approaching 20,000+ Video On Demand titles  &lt;li&gt;Fancast XFINITY TV, with 19,000+ movies, top shows, and other content available online, at home or on the go  &lt;li&gt;&lt;strong&gt;New cross-platform and mobile features like: remote DVR, Universal Caller ID&lt;/strong&gt;, an interactive home telephone, apps for iPhones and the ability to use a remote control to order products and services while watching TV&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Comcast’s service has overall been good. My only problem with them has been the price that they think their customers are willing to pay. I am seriously considering cutting out cable the next time I have to renew my services at a higher fee.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-9088508523893447996?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/9088508523893447996/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=9088508523893447996&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/9088508523893447996?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/9088508523893447996?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/comcast-xfinity.html" title="Comcast XFinity" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;Ak4ERnk-eyp7ImA9WxBVE0o.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-8724349184208377632</id><published>2010-02-16T20:55:00.001-07:00</published><updated>2010-02-16T20:55:07.753-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-16T20:55:07.753-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DotNetNuke" /><title>Denver DNN User Group Meeting</title><content type="html">&lt;p&gt;The next DNN user group meeting will be held at the City and County of Denver’s Webb Municipal building…. more info:   &lt;br /&gt;&lt;a href="http://denver.dnnug.com/news/itemId/40/February-2010-Meeting-2232010--Chris-Hammond-.aspx"&gt;http://denver.dnnug.com/news/itemId/40/February-2010-Meeting-2232010--Chris-Hammond-.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-8724349184208377632?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/8724349184208377632/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=8724349184208377632&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/8724349184208377632?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/8724349184208377632?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/denver-dnn-user-group-meeting.html" title="Denver DNN User Group Meeting" /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CEUEQnc7fCp7ImA9WxBVEUo.&quot;"><id>tag:blogger.com,1999:blog-7656888.post-8654957665099137171</id><published>2010-02-14T11:30:00.001-07:00</published><updated>2010-02-14T11:30:03.904-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-14T11:30:03.904-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><category scheme="http://www.blogger.com/atom/ns#" term="Funnies" /><title>Our disaster recovery plan….</title><content type="html">&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_dIvFa14S0yc/S3hBJnT4TxI/AAAAAAAAI-M/BKGDY0ANjyY/s1600-h/our-disaster-recovery-plan%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="our-disaster-recovery-plan" border="0" alt="our-disaster-recovery-plan" src="http://lh5.ggpht.com/_dIvFa14S0yc/S3hBKQwvtTI/AAAAAAAAI-Q/hooe6TVpEB8/our-disaster-recovery-plan_thumb%5B1%5D.png?imgmax=800" width="479" height="425" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.ca/Disaster-Recovery-Plan-Goes-Something/dp/0740715674"&gt;http://www.amazon.ca/Disaster-Recovery-Plan-Goes-Something/dp/0740715674&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7656888-8654957665099137171?l=blog.aggregatedintelligence.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.aggregatedintelligence.com/feeds/8654957665099137171/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7656888&amp;postID=8654957665099137171&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/8654957665099137171?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7656888/posts/default/8654957665099137171?v=2" /><link rel="alternate" type="text/html" href="http://blog.aggregatedintelligence.com/2010/02/our-disaster-recovery-plan.html" title="Our disaster recovery plan…." /><author><name>Raj M. Rao</name><uri>http://www.blogger.com/profile/02773005045522319448</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10575907043564245607" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry></feed>
