<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="http://my.rsscache.com/rsc/atom.xsl"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:rsscache="http://ns.rsscache.com/1.0"><id>tag:blogger.com,1999:blog-8109338</id><updated>2009-06-20T07:15:03.167Z</updated><title type="text">C#, .Net Framework</title><subtitle type="html">A Journal about the experiences I have developing little applications in C#, Perl, Html and Javascript and talking about things new things that I use.
Always Geeky; Always Nerdy; Always poor Grammer!</subtitle><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default?start-index=26&amp;max-results=25" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>454</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-4651500697046969862</id><published>2009-01-17T00:57:00.001Z</published><updated>2009-01-17T00:57:14.927Z</updated><title type="text">Launching FriendDeck</title><content type="html">&lt;p&gt;I have been beavering away at a lot of social network API's recently which lead me first to Twitter's API and then onto FriendFeed's API.&amp;nbsp; I really like FriendFeed's API, it is very meticulous in the data it aggregates and makes available to developers.&lt;/p&gt; &lt;p&gt;So after a couple of hours playing with the API I endeavoured on my first major project with FriendFeed. I named the project &lt;strong&gt;&lt;a href="http://www.frienddeck.com"&gt;FriendDeck&lt;/a&gt;&lt;/strong&gt;, the basic premise is that there is no similar tool available for FriendFeed that works like TweetDeck.&lt;/p&gt; &lt;p&gt;FriendDeck is entirely hosted on the &lt;strong&gt;Google App Engine&lt;/strong&gt; and in the most part is entirely UI driven through liberal use of &lt;strong&gt;jQuery&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;The main problem that I have with FriendFeed is that you see all your friends posts, which is great in the most part, but I want to be able to see posts on the general topics that I am interested in as they occur around the world.&amp;nbsp; So FriendDeck's first focus is to allow you to search FriendFeed and always be up-to date on the topics you are interested without ever leaving the browser or refreshing the page.&lt;/p&gt; &lt;p&gt;You get an ever refreshing view on the parts of the real-time web that you are interested in, and not what all your friends are interested in.&lt;/p&gt; &lt;p&gt;A great example of its use was described by &lt;a href="http://friendfeed.com/neville"&gt;Neville Hobson&lt;/a&gt;, where he was tracking the real-time web using FriendDeck with regards to the US Airways Crash into the Hudson river.&amp;nbsp; His screen-shot of his Deck can be seen &lt;a href="http://i.friendfeed.com/3db96c3806e0efcc683d3cfa98803d7f612b2aef"&gt;here&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I made the decision early on that I wanted as much of the User Interaction to be done through the Query box so I designed a very basic language to support multiple types of queries.&lt;/p&gt; &lt;p&gt;The most basic query is a general topic search and this can be achieved by typing any text into the Query box.&lt;/p&gt; &lt;p&gt;You can post to FriendFeed from FriendDeck, (if you are logged in) by stating the command &lt;strong&gt;say:here is my comment&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;You can also view a list of a user’s likes by using the query &lt;strong&gt;likes:{username}&lt;/strong&gt; for example &lt;strong&gt;likes:kinlan&lt;/strong&gt;, you can also see a users comments by typing &lt;strong&gt;comments:{username}&lt;/strong&gt; in the query box. A user’s friends can be obtained by querying &lt;strong&gt;friends:{username}&lt;/strong&gt;. A list of posts relating to a URL can be found by using the query &lt;strong&gt;url:{url}&lt;/strong&gt; (so &lt;strong&gt;url:www.frienddeck.com&lt;/strong&gt;) and likewise a list of posts about a domain can be found using the query &lt;strong&gt;domain:{domain}&lt;/strong&gt;.&amp;nbsp; If you are associated with a room you can view all the latest posts by using the command &lt;strong&gt;rooms:{roomname},&lt;/strong&gt; for example&lt;strong&gt; rooms:frienddeck&lt;/strong&gt;  &lt;p&gt;Every minute each of your decks will auto refresh (I fixed a bug tonight that was causing them not to refresh correctly) so you will always get the latest information.  &lt;p&gt;A few new features will be available soon, such as inline commenting. You can currently see a list of all the comments by clicking on the comments count. Your comments being highlighted red.  &lt;p&gt;I am always keen to hear peoples comments so please feel free to get in contact.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;FriendDeck: &lt;a href="http://www.frienddeck.com"&gt;www.frienddeck.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5c721793-8952-4a2f-99a6-6f637308bda1" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;A Topical Search Engine Tags: &lt;a href="http://www.atopical.com/FriendDeck" rel="tag"&gt;FriendDeck&lt;/a&gt;, &lt;a href="http://www.atopical.com/FriendFeed" rel="tag"&gt;FriendFeed&lt;/a&gt;, &lt;a href="http://www.atopical.com/Google%20App%20Engine" rel="tag"&gt;Google App Engine&lt;/a&gt;, &lt;a href="http://www.atopical.com/GAE" rel="tag"&gt;GAE&lt;/a&gt;, &lt;a href="http://www.atopical.com/jQuery" rel="tag"&gt;jQuery&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/4651500697046969862/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=4651500697046969862&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/4651500697046969862" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/4651500697046969862" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2009/01/launching-frienddeck.html" title="Launching FriendDeck" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-2822972427714369142</id><published>2008-12-12T12:24:00.001Z</published><updated>2008-12-12T12:24:39.962Z</updated><title type="text">Twollo – Find new people to follow automatically</title><content type="html">&lt;p&gt;&lt;a href="http://www.twollo.com"&gt;&lt;img style="display: inline; margin: 0px 5px 0px 0px" src="http://www.twollo.com/images/thumb.png" align="left"&gt;&lt;/a&gt; Earlier this week I released a new Google App Engine project called &lt;strong&gt;Twollo&lt;/strong&gt; (&lt;a href="http://www.twollo.com"&gt;http://www.twollo.com&lt;/a&gt;).&amp;nbsp; Twollo, allows you to discover new people to follow by entering your interests into the website.&amp;nbsp; By using Twollo, we filter the Twitterverse and find and follow the appropriate Twitterers automatically for you; taking much of the leg work out finding good people to follow.&lt;/p&gt; &lt;p&gt;The main difference between &lt;strong&gt;Twollo&lt;/strong&gt; and &lt;strong&gt;MrTweet&lt;/strong&gt; is that &lt;strong&gt;MrTweet&lt;/strong&gt; appears to suggest “interesting people” to follow based on their popularity.&amp;nbsp; Don’t get me wrong, MrTweet is a good application, but Twollo is different, and I believe better.&lt;/p&gt; &lt;p&gt;Twollo, will only follow people that you share similar interests with.&amp;nbsp; So, for example, you are new to twitter and want to follow people interested in the Google App Engine, you simply insert your interest of “Google App Engine” into Twollo and we will do the rest; every hour or so we will find new people to follow for you.&amp;nbsp; (see image below to see how easy it is to use)&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.twollo.com/images/example-add.png"&gt; &lt;/p&gt; &lt;p&gt;During the early phase of release I received lots of feedback about what to include in Twollo&amp;nbsp; Recently added features include:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;The ability to see who you Twollo followed for you and the associated interest.  &lt;li&gt;The ability to un-follow a twitter  &lt;li&gt;The ability to not re-follow an un-followed Twitterer  &lt;li&gt;The ability to see who followed you back  &lt;li&gt;The ability to limit the maximum number of new Twitterers you will follow for one of your interests  &lt;li&gt;The ability to only follow Twitterers in your language  &lt;li&gt;Allow feedback through UserVoice  &lt;li&gt;Allow users to completely remove their profile with one click&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;In a post next week, I will talk about Twollo and the Google App Engine.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I hope you all enjoy &lt;a href="http://www.twollo.com/"&gt;Twollo&lt;/a&gt;.&amp;nbsp; Any and all feedback is greatly appreciated.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:669f7b85-315f-4a9f-8d72-caccbe8abbfc" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topic Thing Tags: &lt;a href="http://www.thetopicthing.com/twollo" rel="tag"&gt;twollo&lt;/a&gt;, &lt;a href="http://www.thetopicthing.com/mrtweet" rel="tag"&gt;mrtweet&lt;/a&gt;, &lt;a href="http://www.thetopicthing.com/twitter" rel="tag"&gt;twitter&lt;/a&gt;, &lt;a href="http://www.thetopicthing.com/google+app+engine" rel="tag"&gt;google app engine&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/2822972427714369142/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=2822972427714369142&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2822972427714369142" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2822972427714369142" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/12/twollo-find-new-people-to-follow.html" title="Twollo – Find new people to follow automatically" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-392238863958976180</id><published>2008-04-04T22:22:00.001Z</published><updated>2008-04-04T22:22:57.795Z</updated><title type="text">Moving Blog</title><content type="html">&lt;p&gt;I have been using Blogger for many years now on my own server. It has got to the point where I don't find the features of blogger fit in with my needs as a blogging platform so I am moving to Wordpress.&lt;/p&gt; &lt;p&gt;I am keeping all the content here on this site and I may still update it from now and then.&lt;/p&gt; &lt;p&gt;The new blog will still be more broadly focused against all aspects of the development of software not just c#.&amp;nbsp; The new blog can be found at the following URL: &lt;a href="http://www.kinlan.co.uk/blog/"&gt;http://www.kinlan.co.uk/blog/&lt;/a&gt;&lt;/p&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/392238863958976180/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=392238863958976180&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/392238863958976180" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/392238863958976180" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/04/moving-blog.html" title="Moving Blog" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-5228675587655081227</id><published>2008-04-02T20:23:00.001Z</published><updated>2008-04-02T20:39:45.482Z</updated><title type="text">DSL Tools Talk</title><content type="html">&lt;p&gt;On the 17th of April I will be doing a talk at the Liverpool Users of .Net User group about Domain Specific Language Tools and T4 templates.&lt;/p&gt; &lt;p&gt;The general flow of the talk will be:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;A brief overview of Domain Specific Languages.&lt;/li&gt; &lt;li&gt;What are the Microsoft DSL Tools and examples of toolkits in use&lt;/li&gt; &lt;ol&gt; &lt;li&gt;What the Microsoft DSL Tools are not&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Where they can be used and how they can help developers and end-users.&lt;/li&gt; &lt;li&gt;And a step-by-step guide of the creation of a DSL Tool (hopefully this can be workshop based).&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;If you would like to attend it is being held at AIMES (&lt;a title="http://upcoming.yahoo.com/venue/123846/" href="http://upcoming.yahoo.com/venue/123846/"&gt;http://upcoming.yahoo.com/venue/123846/&lt;/a&gt;) the event information can be found on upcomming: &lt;a title="http://upcoming.yahoo.com/event/454169/" href="http://upcoming.yahoo.com/event/454169/"&gt;http://upcoming.yahoo.com/event/454169/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I will make the slides available if anyone wants to look at them.&amp;nbsp; All I have to do is work out what to say!&lt;/p&gt; &lt;p&gt;If you know of any good tools implemented using the DSL Toolkit, let me know and I will include them in the talk.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c78a4dd3-8fa4-49a6-9d9f-f03b6bd3fee2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/DSL" rel="tag"&gt;DSL&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/T4" rel="tag"&gt;T4&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/DSD" rel="tag"&gt;DSD&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/DSL%20Tools" rel="tag"&gt;DSL Tools&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/DSLTools" rel="tag"&gt;DSLTools&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/luodn" rel="tag"&gt;luodn&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/5228675587655081227/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=5228675587655081227&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/5228675587655081227" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/5228675587655081227" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/04/dsl-tools-talk.html" title="DSL Tools Talk" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-2156483270098784568</id><published>2008-03-27T22:41:00.001Z</published><updated>2008-03-27T22:41:26.547Z</updated><title type="text">Topicala Business Search</title><content type="html">&lt;p&gt;I am just about to release some Business Listing search software.&amp;nbsp; It is called Topicala Business (&lt;a href="http://www.topicala.com/business/"&gt;http://www.topicala.com/business/&lt;/a&gt;). If you are the owner of a UK business you have to opportunity to claim your listing and add a description of your line of business, a list of services you offer and contact information such as a URL, Address and telephone numbers for free.&lt;/p&gt; &lt;p&gt;Topicala Business is Unique in that it also searches the web for you so that you can find out what your customers and competitors are saying about your business.&lt;/p&gt; &lt;p&gt;If you know your company number you can visit your page by typing in the follow www.topicala.com/business/{companyNumber}.&amp;nbsp; Alternatively, you can perform search on the business name from either the main page (http://www.topicala.com/business/ ) or by using a direct query string request. For example, Topicala Ltd can be found using the URL &lt;a href="http://www.topicala.com/business/topicala"&gt;http://www.topicala.com/business/topicala&lt;/a&gt; or &lt;a title="http://www.topicala.com/business/06512461" href="http://www.topicala.com/business/06512461"&gt;http://www.topicala.com/business/06512461&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The information is pulled from Companies House (&lt;a href="http://www.companies-house.gov.uk"&gt;http://www.companies-house.gov.uk&lt;/a&gt;) and is licenced under Crown Copyright.&lt;/p&gt; &lt;p&gt;I am still in the process of loading business information but there are already 169106 companies listed.&amp;nbsp; Granted, only the registered addresses are available.&amp;nbsp; But as more companies use the site, the more information that will be available.&lt;/p&gt; &lt;p&gt;Anyway, give it a try, claim your business and edit your listings so that potential customers can find your business.&amp;nbsp; All the Business Listings are submitted to Google, so you can promote your listings how you like to give your company information a boost on the search engines.&lt;/p&gt; &lt;p&gt;I will be adding more features as I go, but I am very interested in any comments you have or any features you would like to see.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:20182c26-0194-4f1c-9046-3042c078619d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/Topicala" rel="tag"&gt;Topicala&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Business" rel="tag"&gt;Business&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Yell" rel="tag"&gt;Yell&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Yellow%20Pages" rel="tag"&gt;Yellow Pages&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Business%20Listings" rel="tag"&gt;Business Listings&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/2156483270098784568/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=2156483270098784568&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2156483270098784568" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2156483270098784568" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/03/topicala-business-search.html" title="Topicala Business Search" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-584266751941643973</id><published>2008-03-26T22:22:00.001Z</published><updated>2008-03-26T22:22:59.428Z</updated><title type="text">Twitter</title><content type="html">&lt;p&gt;I am now on twitter.&lt;/p&gt; &lt;p&gt;Twit me. My username is PaulKinlan &lt;a href="http://www.twitter.com/PaulKinlan"&gt;http://www.twitter.com/PaulKinlan&lt;/a&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:76a8ec8b-5637-4934-853b-531c03977653" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/Twitter" rel="tag"&gt;Twitter&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Twit" rel="tag"&gt;Twit&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/PaulKinlan" rel="tag"&gt;PaulKinlan&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/584266751941643973/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=584266751941643973&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/584266751941643973" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/584266751941643973" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/03/twitter.html" title="Twitter" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-5357700722565667591</id><published>2008-03-26T21:42:00.001Z</published><updated>2008-03-26T21:42:25.879Z</updated><title type="text">Liverpool .Net User Group</title><content type="html">&lt;p&gt;A few .Net developers have gotten together in Liverpool to form a User Group where we can discuss everything .Net.&lt;/p&gt; &lt;p&gt;We have a web page with a rather snappy URL (&lt;a title="http://liverpool.usersof.net/" href="http://www.usersof.net/"&gt;http://www.usersof.net/&lt;/a&gt;), so if you are in the area and are interested in .Net why not join the Google group &lt;a title="http://groups.google.co.uk/group/liverpoolusersofdotnet" href="http://groups.google.co.uk/group/liverpoolusersofdotnet"&gt;http://groups.google.co.uk/group/liverpoolusersofdotnet&lt;/a&gt; and come to meetings if you want(The next one is April the 17th 2008 - &lt;a title="http://upcoming.yahoo.com/event/454169/" href="http://upcoming.yahoo.com/event/454169/"&gt;http://upcoming.yahoo.com/event/454169/&lt;/a&gt;).&amp;nbsp; The more the merrier.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:336569b4-1e01-45a8-a53a-119927fbe78d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/luodn" rel="tag"&gt;luodn&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Liverpool" rel="tag"&gt;Liverpool&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/.Net" rel="tag"&gt;.Net&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Usergroup" rel="tag"&gt;Usergroup&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/asp.net" rel="tag"&gt;asp.net&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/mvc" rel="tag"&gt;mvc&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/dsl" rel="tag"&gt;dsl&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/5357700722565667591/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=5357700722565667591&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/5357700722565667591" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/5357700722565667591" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/03/liverpool-net-user-group.html" title="Liverpool .Net User Group" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-3386921502838775268</id><published>2008-02-23T14:44:00.001Z</published><updated>2008-02-23T14:44:09.444Z</updated><title type="text">Know your Privacy, an Application on Facebook</title><content type="html">&lt;p&gt;I have created the "Know your Privacy" application on Facebook.&lt;/p&gt; &lt;p&gt;This application is designed to give you insight into how the data in your profile is available to Third Party applications. &lt;p&gt;Key pieces of your Facebook profile are available to external applications, this information could be used for purposes that harm you. &lt;p&gt;The application can be found at &lt;a title="http://apps.facebook.com/knowyourprivacy/" href="http://apps.facebook.com/knowyourprivacy/"&gt;http://apps.facebook.com/knowyourprivacy/&lt;/a&gt; &lt;p&gt;Please let me know what you think of the application and if it helps you understand the privacy aspects of letting 3rd Party applications into your Facebook profile. &lt;h4&gt;Disclaimer&lt;/h4&gt; &lt;p&gt;This application is for your informational purposes only. This application in no way suggests that the applications that you have installed in your profile are in anyway using your data for purposes other than those set out by their privacy statements. &lt;p&gt;The advice given by this application is &lt;b&gt;common sense&lt;/b&gt; and in no way represents the opinions of my employer's past, present and future. The information is not guaranteed to be correct, and the author cannot be held responsible. If you require accurate information contact your local authorities. Informational Links are at the end of this application. &lt;p&gt;If you believe you have been a victim of identity theft contact the police and your banks &lt;b&gt;immediately&lt;/b&gt;. &lt;h3&gt;Identity Theft Information&lt;/h3&gt; &lt;p&gt;If you would like more information about Identity theft, please contact your local authorities, police, credit reference agencies and banks. &lt;h4&gt;Links&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.identity-theft.org.uk/"&gt;Home Office - Identity Theft&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.identity-theft.org.uk/who-can-help.html"&gt;Home office - Who can help&lt;/a&gt; &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Identity_theft"&gt;Wikipedia - Information about Identity theft&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.cifas.org.uk/default.asp?edit_id=561-56"&gt;CIFAS&lt;/a&gt; &lt;li&gt;&lt;a href="http://apps.facebook.com/knowyourprivacy/www.experian.com/identity_fraud/fraud.html"&gt;Experian&lt;/a&gt; &lt;li&gt;&lt;a href="http://apps.facebook.com/knowyourprivacy/www.equifax.com/credit-information/identity-theft"&gt;Equifax&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.callcredit.co.uk/consumer/hot-topics/identity-theft"&gt;Call Credit&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b9a9bd58-665a-43a3-83e0-0df8be63af5a" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/fraud" rel="tag"&gt;fraud&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/privacy" rel="tag"&gt;privacy&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/facebook" rel="tag"&gt;facebook&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/facebook%20application" rel="tag"&gt;facebook application&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/3386921502838775268/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=3386921502838775268&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/3386921502838775268" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/3386921502838775268" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/02/know-your-privacy-application-on.html" title="Know your Privacy, an Application on Facebook" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-2593333375236145200</id><published>2008-02-23T13:27:00.001Z</published><updated>2008-02-23T13:27:51.306Z</updated><title type="text">Topicala on Facebook</title><content type="html">&lt;p&gt;I have added the Topicala (&lt;a href="http://www.topicala.com/"&gt;www.topicala.com/&lt;/a&gt;) application in to Facebook (&lt;a href="http://www.facebook.com"&gt;www.facebook.com&lt;/a&gt;).&amp;nbsp; &lt;/p&gt; &lt;p&gt;If you add this application you will be able to search the Internet with directly leaving Facebook.&lt;/p&gt; &lt;p&gt;The application can be found at &lt;a title="Topicala" href="http://apps.facebook.com/topicala/ "&gt;http://apps.facebook.com/topicala/ &lt;/a&gt;&lt;/p&gt; &lt;p&gt;The application was really simple to develop and doesn't require that you pass any personal details to Topicala.&lt;/p&gt; &lt;p&gt;Let me know what you think.&amp;nbsp; I appreciate all feedback.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f65873d6-ee8f-44c4-a48a-89e839eabc54" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/Facebook" rel="tag"&gt;Facebook&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Facebook%20Application" rel="tag"&gt;Facebook Application&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Topicala" rel="tag"&gt;Topicala&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Application" rel="tag"&gt;Application&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/API" rel="tag"&gt;API&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/2593333375236145200/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=2593333375236145200&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2593333375236145200" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2593333375236145200" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/02/topicala-on-facebook.html" title="Topicala on Facebook" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-1714036132809532123</id><published>2007-12-18T08:14:00.001Z</published><updated>2007-12-18T08:14:41.877Z</updated><title type="text">IDataRecord Fields to Dictionary Extension Method</title><content type="html">&lt;p&gt;I have never been a fan of directly passing IDataRecords, or IDataReaders for that matter, about the place to get simple field values out.&lt;/p&gt; &lt;p&gt;Therefore, with the introduction of C# 3.0 and Extension Methods, I thought it would be cool to write (and share) a simple implementation of some code that I use to convert the IDataRecord Field data to an Dictionary&amp;lt;string, object&amp;gt; object.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Kinlan.Data.Extensions&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataExtensions&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; FieldsToDictionary(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IDataRecord dataRecord)&lt;br /&gt;        {&lt;br /&gt;            Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; fieldBag = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;(dataRecord.FieldCount);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (dataRecord != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;            {               &lt;br /&gt;                &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; fieldIdx = 0; fieldIdx &amp;lt; dataRecord.FieldCount; fieldIdx++)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name = dataRecord.GetName(fieldIdx);&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = dataRecord[fieldIdx];&lt;br /&gt;                    fieldBag.Add(name, &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; fieldBag;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;It is quite simple really and nothing too complex.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A place where it can be used it Windows Workflow.&amp;nbsp; If you are injecting parameters into your Workflow instance you need to pass a Dictionary&amp;lt;string, object&amp;gt; in, well now you can (if you desired) simply convert a IDataReader/IDataRecord object into with the following simple piece of code:&lt;/p&gt;&lt;pre&gt;WorkflowInstance instance = runtime.CreateWorkflow(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(_WorkflowClass_), dataReaderInstance.FieldsToDictionary());&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;This code should be used sparingly, for instance if you wanted a very high performance access to the field data, you might as well stay on the IDataRecord.&lt;/p&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8c7ab40a-da6d-4ede-a3e5-962c673fbbd0" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/Extension%20Method" rel="tag"&gt;Extension Method&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/ExtensionMethod" rel="tag"&gt;ExtensionMethod&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/C#" rel="tag"&gt;C#&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/C#3.0" rel="tag"&gt;C#3.0&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/IDataReader" rel="tag"&gt;IDataReader&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/IDataRecord" rel="tag"&gt;IDataRecord&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/1714036132809532123/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=1714036132809532123&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/1714036132809532123" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/1714036132809532123" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2007/12/idatarecord-fields-to-dictionary.html" title="IDataRecord Fields to Dictionary Extension Method" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-7474558437188879595</id><published>2007-09-08T14:02:00.001Z</published><updated>2007-09-10T10:34:52.684Z</updated><title type="text">Microformat.net</title><content type="html">&lt;p&gt;I would like to take this opportunity to announce that I have&amp;nbsp;created a usable [although beta] release of a generic Microformat parser for .Net.&amp;nbsp; I don't know of any other frameworks that easily allow you to find Microformats in an html/XML stream that are specifically built for .Net, so I believe that this project is a first (and hopefully a de-facto choice in time to come).&lt;/p&gt; &lt;p&gt;The project can be found on Codeplex at &lt;a href="http://www.codeplex.com/microformat"&gt;http://www.codeplex.com/microformat&lt;/a&gt;.&amp;nbsp; The current release is Iteration 3.  &lt;p&gt;The parser is stream based and uses an application&amp;nbsp;configuration (see below for an example) to define the how the parser should parse the html/XML stream.&amp;nbsp; This flexible configuration means that if a spec changes for a Microformat or a new one is introduced then no code needs to be changed in the framework to let users of the framework see the changed data. &lt;pre class="code"&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;configSections&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;section&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;MicroformatsSection&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Microformats.ConfigurationSections.MicroformatConfigSection, Microformat.net&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;configSections&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;MicroformatsSection&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformats&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;rel-tag&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;rootType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;rel&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;root&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;tag&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.Uri&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;hCard&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;rootType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;class&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;root&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;vcard&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Fields&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;fn&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;url&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.Uri&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;email&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.Uri&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;adr&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Microformat&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Fields&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;adr&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;rootType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;class&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;root&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;adr&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Fields&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;post-office-box&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;extended-address&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;street-address&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;locality&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;region&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;postal-code&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;country-name&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Fields&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformats&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;MicroformatsSection&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;The above configuration says that the following Microformats are to be searched for: rel-tag, hCard and adr.&amp;nbsp; Each Microformat configuration can also be nested (see the hCard spec that allows an adr to be nested inside itself).&amp;nbsp; This saves on duplicating configuration information.&amp;nbsp; (Unfortunately a circular reference in the configuration can be defined and plurality of elements is not&amp;nbsp;implemented.&amp;nbsp; This will be fixed soon).&amp;nbsp; Currently in this configuration not all of the hCard spec is defined (this was done for simplicity of me showing you how the config works), obviously this means that any parts of a Microformat that you are not interested in you won't see in the output of the framework. &lt;br /&gt;&lt;p&gt;The code that follows shows how easy it is to use this framework:&lt;pre class="code"&gt;&lt;span style="color: rgb(0,0,255)"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;TextReader&lt;/span&gt; ms = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;StringReader&lt;/span&gt;(&lt;span style="color: rgb(163,21,21)"&gt;@"&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;div class=""vcard author""&amp;gt;&lt;br /&gt; &amp;lt;a class=""url fn"" href=""http://www.kinlan.co.uk/""&amp;gt;Paul Kinlan&amp;lt;/a&amp;gt;&lt;br /&gt; &amp;lt;a class=""email"" href=""mailto:paul.kinlan@gmail.com""&amp;gt;paul.kinlan@gmail.com&amp;lt;/a&amp;gt;&lt;br /&gt; &amp;lt;div class=""adr""&amp;gt;&lt;br /&gt;  &amp;lt;span class=""locality""&amp;gt;Liverpool&amp;lt;/span&amp;gt;,&amp;lt;span class=""region""&amp;gt;Merseyside&amp;lt;/span&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&amp;lt;a href=""http://test.com/test"" rel=""tag""&amp;gt;Test Tag&amp;lt;/a&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"&lt;/span&gt;))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: rgb(0,0,255)"&gt;using&lt;/span&gt; (Microformats.Readers.&lt;span style="color: rgb(43,145,175)"&gt;MicroformatReader&lt;/span&gt; mr = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; Microformats.Readers.&lt;span style="color: rgb(43,145,175)"&gt;MicroformatReader&lt;/span&gt;(ms))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: rgb(43,145,175)"&gt;Microformat&lt;/span&gt; m = &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(( m = mr.Read()) != &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.Out.Write(&lt;span style="color: rgb(163,21,21)"&gt;"Found Microformat: "&lt;/span&gt; + m.Name + &lt;span style="color: rgb(163,21,21)"&gt;". Machine Value:"&lt;/span&gt; + m.MachineValue + &lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: rgb(0,0,255)"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;IField&lt;/span&gt; f &lt;span style="color: rgb(0,0,255)"&gt;in&lt;/span&gt; m.Fields)&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.Out.WriteLine(&lt;span style="color: rgb(163,21,21)"&gt;"\t"&lt;/span&gt; + f.Name + &lt;span style="color: rgb(163,21,21)"&gt;": "&lt;/span&gt; + f.MachineValue);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    &lt;br /&gt;                }&lt;br /&gt;            }&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;The first line, simply converts makes a TextReader object that can be used to pass into the MicroformatReader object.&amp;nbsp; Once the stream has been presented to the framework, then it is as simple as calling mr.Read to iterate to across all the valid Microformats in the document.&amp;nbsp; The Read() method returns fully constructed Microformat objects that can be&amp;nbsp;examined and used directly in your programs.&lt;br /&gt;&lt;p&gt;I still have a lot of work to do, however it appears (to me at least) to be quite flexible.&amp;nbsp; I would greatly appreciate any comments and feedback and if you use the framework I would love to hear about it.&amp;nbsp; If anyone is interested in joining the project let me know. &lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:722ba1f4-c674-4af5-8c23-08c66a8e0340" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/c#" rel="tag"&gt;c#&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/c#.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/microformat" rel="tag"&gt;microformat&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/microformat.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/microformats" rel="tag"&gt;microformats&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/microformats.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/.net" rel="tag"&gt;.net&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/.net.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/framework" rel="tag"&gt;framework&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/framework.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/api" rel="tag"&gt;api&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/api.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/codeplex" rel="tag"&gt;codeplex&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/codeplex.opml"&gt;OPML&lt;/a&gt;]&lt;/div&gt;   - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/7474558437188879595/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8109338&amp;postID=7474558437188879595&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/7474558437188879595" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/7474558437188879595" /><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2007/09/microformatnet.html" title="Microformat.net" /><author><name>Paul Kinlan</name><uri>http://www.blogger.com/profile/13277279448565336988</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-392238863958976180</id><published>2008-04-04T22:22:00.001Z</published><updated>2008-04-04T22:22:57.795Z</updated><title type="text">Moving Blog</title><content type="html">&lt;p&gt;I have been using Blogger for many years now on my own server. It has got to the point where I don't find the features of blogger fit in with my needs as a blogging platform so I am moving to Wordpress.&lt;/p&gt; &lt;p&gt;I am keeping all the content here on this site and I may still update it from now and then.&lt;/p&gt; &lt;p&gt;The new blog will still be more broadly focused against all aspects of the development of software not just c#.&amp;nbsp; The new blog can be found at the following URL: &lt;a href="http://www.kinlan.co.uk/blog/"&gt;http://www.kinlan.co.uk/blog/&lt;/a&gt;&lt;/p&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/04/moving-blog.html" title="Moving Blog" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=392238863958976180&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/392238863958976180" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/392238863958976180" /><author><name>Paul Kinlan</name></author></entry><entry xmlns=""><title>[Ad] Los Angeles Mom Lost 47 lbs Following 1 rule!</title><link rel="alternate" type="text/html" href="http://www.rsscache.com/Section/Advertise/click.aspx?a=192609" /><content>I Cut Down 47 lbs of Stomach Fat In A Month By Obeying This 1 Old Rule</content></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-5228675587655081227</id><published>2008-04-02T20:23:00.001Z</published><updated>2008-04-02T20:39:45.482Z</updated><title type="text">DSL Tools Talk</title><content type="html">&lt;p&gt;On the 17th of April I will be doing a talk at the Liverpool Users of .Net User group about Domain Specific Language Tools and T4 templates.&lt;/p&gt; &lt;p&gt;The general flow of the talk will be:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;A brief overview of Domain Specific Languages.&lt;/li&gt; &lt;li&gt;What are the Microsoft DSL Tools and examples of toolkits in use&lt;/li&gt; &lt;ol&gt; &lt;li&gt;What the Microsoft DSL Tools are not&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Where they can be used and how they can help developers and end-users.&lt;/li&gt; &lt;li&gt;And a step-by-step guide of the creation of a DSL Tool (hopefully this can be workshop based).&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;If you would like to attend it is being held at AIMES (&lt;a title="http://upcoming.yahoo.com/venue/123846/" href="http://upcoming.yahoo.com/venue/123846/"&gt;http://upcoming.yahoo.com/venue/123846/&lt;/a&gt;) the event information can be found on upcomming: &lt;a title="http://upcoming.yahoo.com/event/454169/" href="http://upcoming.yahoo.com/event/454169/"&gt;http://upcoming.yahoo.com/event/454169/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I will make the slides available if anyone wants to look at them.&amp;nbsp; All I have to do is work out what to say!&lt;/p&gt; &lt;p&gt;If you know of any good tools implemented using the DSL Toolkit, let me know and I will include them in the talk.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c78a4dd3-8fa4-49a6-9d9f-f03b6bd3fee2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/DSL" rel="tag"&gt;DSL&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/T4" rel="tag"&gt;T4&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/DSD" rel="tag"&gt;DSD&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/DSL%20Tools" rel="tag"&gt;DSL Tools&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/DSLTools" rel="tag"&gt;DSLTools&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/luodn" rel="tag"&gt;luodn&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/04/dsl-tools-talk.html" title="DSL Tools Talk" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=5228675587655081227&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/5228675587655081227" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/5228675587655081227" /><author><name>Paul Kinlan</name></author></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-2156483270098784568</id><published>2008-03-27T22:41:00.001Z</published><updated>2008-03-27T22:41:26.547Z</updated><title type="text">Topicala Business Search</title><content type="html">&lt;p&gt;I am just about to release some Business Listing search software.&amp;nbsp; It is called Topicala Business (&lt;a href="http://www.topicala.com/business/"&gt;http://www.topicala.com/business/&lt;/a&gt;). If you are the owner of a UK business you have to opportunity to claim your listing and add a description of your line of business, a list of services you offer and contact information such as a URL, Address and telephone numbers for free.&lt;/p&gt; &lt;p&gt;Topicala Business is Unique in that it also searches the web for you so that you can find out what your customers and competitors are saying about your business.&lt;/p&gt; &lt;p&gt;If you know your company number you can visit your page by typing in the follow www.topicala.com/business/{companyNumber}.&amp;nbsp; Alternatively, you can perform search on the business name from either the main page (http://www.topicala.com/business/ ) or by using a direct query string request. For example, Topicala Ltd can be found using the URL &lt;a href="http://www.topicala.com/business/topicala"&gt;http://www.topicala.com/business/topicala&lt;/a&gt; or &lt;a title="http://www.topicala.com/business/06512461" href="http://www.topicala.com/business/06512461"&gt;http://www.topicala.com/business/06512461&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The information is pulled from Companies House (&lt;a href="http://www.companies-house.gov.uk"&gt;http://www.companies-house.gov.uk&lt;/a&gt;) and is licenced under Crown Copyright.&lt;/p&gt; &lt;p&gt;I am still in the process of loading business information but there are already 169106 companies listed.&amp;nbsp; Granted, only the registered addresses are available.&amp;nbsp; But as more companies use the site, the more information that will be available.&lt;/p&gt; &lt;p&gt;Anyway, give it a try, claim your business and edit your listings so that potential customers can find your business.&amp;nbsp; All the Business Listings are submitted to Google, so you can promote your listings how you like to give your company information a boost on the search engines.&lt;/p&gt; &lt;p&gt;I will be adding more features as I go, but I am very interested in any comments you have or any features you would like to see.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:20182c26-0194-4f1c-9046-3042c078619d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/Topicala" rel="tag"&gt;Topicala&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Business" rel="tag"&gt;Business&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Yell" rel="tag"&gt;Yell&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Yellow%20Pages" rel="tag"&gt;Yellow Pages&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Business%20Listings" rel="tag"&gt;Business Listings&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/03/topicala-business-search.html" title="Topicala Business Search" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=2156483270098784568&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2156483270098784568" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2156483270098784568" /><author><name>Paul Kinlan</name></author></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-584266751941643973</id><published>2008-03-26T22:22:00.001Z</published><updated>2008-03-26T22:22:59.428Z</updated><title type="text">Twitter</title><content type="html">&lt;p&gt;I am now on twitter.&lt;/p&gt; &lt;p&gt;Twit me. My username is PaulKinlan &lt;a href="http://www.twitter.com/PaulKinlan"&gt;http://www.twitter.com/PaulKinlan&lt;/a&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:76a8ec8b-5637-4934-853b-531c03977653" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/Twitter" rel="tag"&gt;Twitter&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Twit" rel="tag"&gt;Twit&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/PaulKinlan" rel="tag"&gt;PaulKinlan&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/03/twitter.html" title="Twitter" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=584266751941643973&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/584266751941643973" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/584266751941643973" /><author><name>Paul Kinlan</name></author></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-5357700722565667591</id><published>2008-03-26T21:42:00.001Z</published><updated>2008-03-26T21:42:25.879Z</updated><title type="text">Liverpool .Net User Group</title><content type="html">&lt;p&gt;A few .Net developers have gotten together in Liverpool to form a User Group where we can discuss everything .Net.&lt;/p&gt; &lt;p&gt;We have a web page with a rather snappy URL (&lt;a title="http://liverpool.usersof.net/" href="http://www.usersof.net/"&gt;http://www.usersof.net/&lt;/a&gt;), so if you are in the area and are interested in .Net why not join the Google group &lt;a title="http://groups.google.co.uk/group/liverpoolusersofdotnet" href="http://groups.google.co.uk/group/liverpoolusersofdotnet"&gt;http://groups.google.co.uk/group/liverpoolusersofdotnet&lt;/a&gt; and come to meetings if you want(The next one is April the 17th 2008 - &lt;a title="http://upcoming.yahoo.com/event/454169/" href="http://upcoming.yahoo.com/event/454169/"&gt;http://upcoming.yahoo.com/event/454169/&lt;/a&gt;).&amp;nbsp; The more the merrier.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:336569b4-1e01-45a8-a53a-119927fbe78d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/luodn" rel="tag"&gt;luodn&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Liverpool" rel="tag"&gt;Liverpool&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/.Net" rel="tag"&gt;.Net&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Usergroup" rel="tag"&gt;Usergroup&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/asp.net" rel="tag"&gt;asp.net&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/mvc" rel="tag"&gt;mvc&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/dsl" rel="tag"&gt;dsl&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/03/liverpool-net-user-group.html" title="Liverpool .Net User Group" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=5357700722565667591&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/5357700722565667591" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/5357700722565667591" /><author><name>Paul Kinlan</name></author></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-3386921502838775268</id><published>2008-02-23T14:44:00.001Z</published><updated>2008-02-23T14:44:09.444Z</updated><title type="text">Know your Privacy, an Application on Facebook</title><content type="html">&lt;p&gt;I have created the "Know your Privacy" application on Facebook.&lt;/p&gt; &lt;p&gt;This application is designed to give you insight into how the data in your profile is available to Third Party applications. &lt;p&gt;Key pieces of your Facebook profile are available to external applications, this information could be used for purposes that harm you. &lt;p&gt;The application can be found at &lt;a title="http://apps.facebook.com/knowyourprivacy/" href="http://apps.facebook.com/knowyourprivacy/"&gt;http://apps.facebook.com/knowyourprivacy/&lt;/a&gt; &lt;p&gt;Please let me know what you think of the application and if it helps you understand the privacy aspects of letting 3rd Party applications into your Facebook profile. &lt;h4&gt;Disclaimer&lt;/h4&gt; &lt;p&gt;This application is for your informational purposes only. This application in no way suggests that the applications that you have installed in your profile are in anyway using your data for purposes other than those set out by their privacy statements. &lt;p&gt;The advice given by this application is &lt;b&gt;common sense&lt;/b&gt; and in no way represents the opinions of my employer's past, present and future. The information is not guaranteed to be correct, and the author cannot be held responsible. If you require accurate information contact your local authorities. Informational Links are at the end of this application. &lt;p&gt;If you believe you have been a victim of identity theft contact the police and your banks &lt;b&gt;immediately&lt;/b&gt;. &lt;h3&gt;Identity Theft Information&lt;/h3&gt; &lt;p&gt;If you would like more information about Identity theft, please contact your local authorities, police, credit reference agencies and banks. &lt;h4&gt;Links&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.identity-theft.org.uk/"&gt;Home Office - Identity Theft&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.identity-theft.org.uk/who-can-help.html"&gt;Home office - Who can help&lt;/a&gt; &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Identity_theft"&gt;Wikipedia - Information about Identity theft&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.cifas.org.uk/default.asp?edit_id=561-56"&gt;CIFAS&lt;/a&gt; &lt;li&gt;&lt;a href="http://apps.facebook.com/knowyourprivacy/www.experian.com/identity_fraud/fraud.html"&gt;Experian&lt;/a&gt; &lt;li&gt;&lt;a href="http://apps.facebook.com/knowyourprivacy/www.equifax.com/credit-information/identity-theft"&gt;Equifax&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.callcredit.co.uk/consumer/hot-topics/identity-theft"&gt;Call Credit&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b9a9bd58-665a-43a3-83e0-0df8be63af5a" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/fraud" rel="tag"&gt;fraud&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/privacy" rel="tag"&gt;privacy&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/facebook" rel="tag"&gt;facebook&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/facebook%20application" rel="tag"&gt;facebook application&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/02/know-your-privacy-application-on.html" title="Know your Privacy, an Application on Facebook" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=3386921502838775268&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/3386921502838775268" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/3386921502838775268" /><author><name>Paul Kinlan</name></author></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-2593333375236145200</id><published>2008-02-23T13:27:00.001Z</published><updated>2008-02-23T13:27:51.306Z</updated><title type="text">Topicala on Facebook</title><content type="html">&lt;p&gt;I have added the Topicala (&lt;a href="http://www.topicala.com/"&gt;www.topicala.com/&lt;/a&gt;) application in to Facebook (&lt;a href="http://www.facebook.com"&gt;www.facebook.com&lt;/a&gt;).&amp;nbsp; &lt;/p&gt; &lt;p&gt;If you add this application you will be able to search the Internet with directly leaving Facebook.&lt;/p&gt; &lt;p&gt;The application can be found at &lt;a title="Topicala" href="http://apps.facebook.com/topicala/ "&gt;http://apps.facebook.com/topicala/ &lt;/a&gt;&lt;/p&gt; &lt;p&gt;The application was really simple to develop and doesn't require that you pass any personal details to Topicala.&lt;/p&gt; &lt;p&gt;Let me know what you think.&amp;nbsp; I appreciate all feedback.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f65873d6-ee8f-44c4-a48a-89e839eabc54" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/Facebook" rel="tag"&gt;Facebook&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Facebook%20Application" rel="tag"&gt;Facebook Application&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Topicala" rel="tag"&gt;Topicala&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/Application" rel="tag"&gt;Application&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/API" rel="tag"&gt;API&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2008/02/topicala-on-facebook.html" title="Topicala on Facebook" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=2593333375236145200&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2593333375236145200" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/2593333375236145200" /><author><name>Paul Kinlan</name></author></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-1714036132809532123</id><published>2007-12-18T08:14:00.001Z</published><updated>2007-12-18T08:14:41.877Z</updated><title type="text">IDataRecord Fields to Dictionary Extension Method</title><content type="html">&lt;p&gt;I have never been a fan of directly passing IDataRecords, or IDataReaders for that matter, about the place to get simple field values out.&lt;/p&gt; &lt;p&gt;Therefore, with the introduction of C# 3.0 and Extension Methods, I thought it would be cool to write (and share) a simple implementation of some code that I use to convert the IDataRecord Field data to an Dictionary&amp;lt;string, object&amp;gt; object.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Kinlan.Data.Extensions&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataExtensions&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; FieldsToDictionary(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IDataRecord dataRecord)&lt;br /&gt;        {&lt;br /&gt;            Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt; fieldBag = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;(dataRecord.FieldCount);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (dataRecord != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;            {               &lt;br /&gt;                &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; fieldIdx = 0; fieldIdx &amp;lt; dataRecord.FieldCount; fieldIdx++)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name = dataRecord.GetName(fieldIdx);&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = dataRecord[fieldIdx];&lt;br /&gt;                    fieldBag.Add(name, &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; fieldBag;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;It is quite simple really and nothing too complex.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A place where it can be used it Windows Workflow.&amp;nbsp; If you are injecting parameters into your Workflow instance you need to pass a Dictionary&amp;lt;string, object&amp;gt; in, well now you can (if you desired) simply convert a IDataReader/IDataRecord object into with the following simple piece of code:&lt;/p&gt;&lt;pre&gt;WorkflowInstance instance = runtime.CreateWorkflow(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(_WorkflowClass_), dataReaderInstance.FieldsToDictionary());&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;This code should be used sparingly, for instance if you wanted a very high performance access to the field data, you might as well stay on the IDataRecord.&lt;/p&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8c7ab40a-da6d-4ede-a3e5-962c673fbbd0" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/Extension%20Method" rel="tag"&gt;Extension Method&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/ExtensionMethod" rel="tag"&gt;ExtensionMethod&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/C#" rel="tag"&gt;C#&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/C#3.0" rel="tag"&gt;C#3.0&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/IDataReader" rel="tag"&gt;IDataReader&lt;/a&gt;, &lt;a href="http://www.topicala.com/tag/IDataRecord" rel="tag"&gt;IDataRecord&lt;/a&gt;&lt;/div&gt;     - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2007/12/idatarecord-fields-to-dictionary.html" title="IDataRecord Fields to Dictionary Extension Method" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=1714036132809532123&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/1714036132809532123" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/1714036132809532123" /><author><name>Paul Kinlan</name></author></entry><entry xmlns="http://www.w3.org/2005/Atom"><id>tag:blogger.com,1999:blog-8109338.post-7474558437188879595</id><published>2007-09-08T14:02:00.001Z</published><updated>2007-09-10T10:34:52.684Z</updated><title type="text">Microformat.net</title><content type="html">&lt;p&gt;I would like to take this opportunity to announce that I have&amp;nbsp;created a usable [although beta] release of a generic Microformat parser for .Net.&amp;nbsp; I don't know of any other frameworks that easily allow you to find Microformats in an html/XML stream that are specifically built for .Net, so I believe that this project is a first (and hopefully a de-facto choice in time to come).&lt;/p&gt; &lt;p&gt;The project can be found on Codeplex at &lt;a href="http://www.codeplex.com/microformat"&gt;http://www.codeplex.com/microformat&lt;/a&gt;.&amp;nbsp; The current release is Iteration 3.  &lt;p&gt;The parser is stream based and uses an application&amp;nbsp;configuration (see below for an example) to define the how the parser should parse the html/XML stream.&amp;nbsp; This flexible configuration means that if a spec changes for a Microformat or a new one is introduced then no code needs to be changed in the framework to let users of the framework see the changed data. &lt;pre class="code"&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;configSections&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;section&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;MicroformatsSection&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Microformats.ConfigurationSections.MicroformatConfigSection, Microformat.net&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;configSections&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;MicroformatsSection&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformats&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;rel-tag&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;rootType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;rel&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;root&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;tag&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.Uri&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;hCard&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;rootType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;class&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;root&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;vcard&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Fields&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;fn&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;url&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.Uri&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;email&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.Uri&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;adr&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Microformat&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Fields&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;adr&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;rootType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;class&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;root&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;adr&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Fields&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;post-office-box&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;extended-address&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;street-address&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;locality&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;region&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;postal-code&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Field&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;country-name&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;dataType&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;System.String&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;plurality&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;Singular&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Fields&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformat&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Microformats&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;MicroformatsSection&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;The above configuration says that the following Microformats are to be searched for: rel-tag, hCard and adr.&amp;nbsp; Each Microformat configuration can also be nested (see the hCard spec that allows an adr to be nested inside itself).&amp;nbsp; This saves on duplicating configuration information.&amp;nbsp; (Unfortunately a circular reference in the configuration can be defined and plurality of elements is not&amp;nbsp;implemented.&amp;nbsp; This will be fixed soon).&amp;nbsp; Currently in this configuration not all of the hCard spec is defined (this was done for simplicity of me showing you how the config works), obviously this means that any parts of a Microformat that you are not interested in you won't see in the output of the framework. &lt;br /&gt;&lt;p&gt;The code that follows shows how easy it is to use this framework:&lt;pre class="code"&gt;&lt;span style="color: rgb(0,0,255)"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;TextReader&lt;/span&gt; ms = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;StringReader&lt;/span&gt;(&lt;span style="color: rgb(163,21,21)"&gt;@"&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;div class=""vcard author""&amp;gt;&lt;br /&gt; &amp;lt;a class=""url fn"" href=""http://www.kinlan.co.uk/""&amp;gt;Paul Kinlan&amp;lt;/a&amp;gt;&lt;br /&gt; &amp;lt;a class=""email"" href=""mailto:paul.kinlan@gmail.com""&amp;gt;paul.kinlan@gmail.com&amp;lt;/a&amp;gt;&lt;br /&gt; &amp;lt;div class=""adr""&amp;gt;&lt;br /&gt;  &amp;lt;span class=""locality""&amp;gt;Liverpool&amp;lt;/span&amp;gt;,&amp;lt;span class=""region""&amp;gt;Merseyside&amp;lt;/span&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&amp;lt;a href=""http://test.com/test"" rel=""tag""&amp;gt;Test Tag&amp;lt;/a&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"&lt;/span&gt;))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: rgb(0,0,255)"&gt;using&lt;/span&gt; (Microformats.Readers.&lt;span style="color: rgb(43,145,175)"&gt;MicroformatReader&lt;/span&gt; mr = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; Microformats.Readers.&lt;span style="color: rgb(43,145,175)"&gt;MicroformatReader&lt;/span&gt;(ms))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: rgb(43,145,175)"&gt;Microformat&lt;/span&gt; m = &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(( m = mr.Read()) != &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.Out.Write(&lt;span style="color: rgb(163,21,21)"&gt;"Found Microformat: "&lt;/span&gt; + m.Name + &lt;span style="color: rgb(163,21,21)"&gt;". Machine Value:"&lt;/span&gt; + m.MachineValue + &lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: rgb(0,0,255)"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;IField&lt;/span&gt; f &lt;span style="color: rgb(0,0,255)"&gt;in&lt;/span&gt; m.Fields)&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.Out.WriteLine(&lt;span style="color: rgb(163,21,21)"&gt;"\t"&lt;/span&gt; + f.Name + &lt;span style="color: rgb(163,21,21)"&gt;": "&lt;/span&gt; + f.MachineValue);&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    &lt;br /&gt;                }&lt;br /&gt;            }&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;The first line, simply converts makes a TextReader object that can be used to pass into the MicroformatReader object.&amp;nbsp; Once the stream has been presented to the framework, then it is as simple as calling mr.Read to iterate to across all the valid Microformats in the document.&amp;nbsp; The Read() method returns fully constructed Microformat objects that can be&amp;nbsp;examined and used directly in your programs.&lt;br /&gt;&lt;p&gt;I still have a lot of work to do, however it appears (to me at least) to be quite flexible.&amp;nbsp; I would greatly appreciate any comments and feedback and if you use the framework I would love to hear about it.&amp;nbsp; If anyone is interested in joining the project let me know. &lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:722ba1f4-c674-4af5-8c23-08c66a8e0340" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Topicala Tags: &lt;a href="http://www.topicala.com/tag/c#" rel="tag"&gt;c#&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/c#.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/microformat" rel="tag"&gt;microformat&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/microformat.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/microformats" rel="tag"&gt;microformats&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/microformats.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/.net" rel="tag"&gt;.net&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/.net.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/framework" rel="tag"&gt;framework&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/framework.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/api" rel="tag"&gt;api&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/api.opml"&gt;OPML&lt;/a&gt;], &lt;a href="http://www.topicala.com/tag/codeplex" rel="tag"&gt;codeplex&lt;/a&gt; [&lt;a href="http://www.topicala.com/opml/codeplex.opml"&gt;OPML&lt;/a&gt;]&lt;/div&gt;   - Bandwidth saved by RSScache.com (http://www.rsscache.com)</content><link rel="alternate" type="text/html" href="http://www.kinlan.co.uk/2007/09/microformatnet.html" title="Microformat.net" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8109338&amp;postID=7474558437188879595&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://www.kinlan.co.uk/atom.xml" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/7474558437188879595" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8109338/posts/default/7474558437188879595" /><author><name>Paul Kinlan</name></author></entry><rsscache:id>15192</rsscache:id></feed>