<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-2633800223544631668</atom:id><lastBuildDate>Mon, 30 Aug 2010 09:23:21 +0000</lastBuildDate><title>software + usability</title><description>Web Applications, Usability, Agile/SCRUM and more</description><link>http://blog.roonga.com.au/</link><managingEditor>noreply@blogger.com (Ravi)</managingEditor><generator>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-6955367723725579777</guid><pubDate>Tue, 20 Jul 2010 23:42:00 +0000</pubDate><atom:updated>2010-07-21T09:42:31.718+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Git</category><title>.gitignore file for Visual Studio and Resharper</title><description>&lt;p&gt;The Git Ignore file is used to configure Git to ignore any files/folders you do not want to add to source control.&lt;/p&gt;  &lt;p&gt;The below configures git to ignore common visual studio and Resharper files. &lt;/p&gt;  &lt;p&gt;Create a file called &amp;quot;.gitignore&amp;quot; in your project root with the below lines.&lt;/p&gt;  &lt;p&gt;*/bin    &lt;br /&gt;*/obj     &lt;br /&gt;*.user     &lt;br /&gt;*.suo     &lt;br /&gt;_ReSharper.*     &lt;br /&gt;*.sln.cache     &lt;br /&gt;*.xap     &lt;br /&gt;*.vspcc     &lt;br /&gt;*.vscc     &lt;br /&gt;*.vssscc     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Happy Coding&lt;/p&gt;  &lt;p&gt;Ravi&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-6955367723725579777?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/07/gitignore-file-for-visual-studio-and.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-4207109166662773338</guid><pubDate>Thu, 15 Jul 2010 04:22:00 +0000</pubDate><atom:updated>2010-07-15T14:27:57.675+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Tools</category><category domain='http://www.blogger.com/atom/ns#'>General</category><title>Some Great Free or Open Source Tools for your PC</title><description>&lt;h3&gt;Multimedia&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="VLC Player" href="http://www.videolan.org/"&gt;VLC Player&lt;/a&gt; is light and plays almost all types of media. &lt;/li&gt;    &lt;li&gt;&lt;a title="HandBrake" href="http://handbrake.fr/"&gt;HandBrake&lt;/a&gt; can convert your video from any format to any format. Great for converting your video to iPod or PSP formats. &lt;/li&gt;    &lt;li&gt;&lt;a title="Picasa" href="http://picasa.google.com.au/"&gt;Picasa&lt;/a&gt; from Google is an excellent photo management tool. It also supports some nice editing tools and allows you to publish to your web album.&amp;#160; You can also directly upload your pictures to a Printing service like &lt;a title="snapfish" href="http://www.snapfish.com"&gt;snapfish&lt;/a&gt; directly from Picasa. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;System Tools&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="FileZilla" href="http://filezilla-project.org/"&gt;FileZilla&lt;/a&gt; FTP Client &lt;/li&gt;    &lt;li&gt;&lt;a title="TreeSize Free" href="http://www.jam-software.com/treesize_free/"&gt;TreeSize Free&lt;/a&gt; can tell you all about your disk usage.&amp;#160; Its a invaluable tool when you are trying to figure out why your 1 TB hard drive is getting full. &lt;/li&gt;    &lt;li&gt;&lt;a title="Virtual CloneDrive" href="http://www.slysoft.com/en/virtual-clonedrive.html"&gt;Virtual CloneDrive&lt;/a&gt; virtually mounts your ISO file.&amp;#160; I have used other tools to do this before. But this one has the cleanest implementation. Besides their logo is cool!&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;a title="ImageBurn" href="http://www.imgburn.com/"&gt;ImageBurn&lt;/a&gt; is a lightweight CD / DVD / HD DVD / Blu-ray burning application.&amp;#160; Simple and very easy to use. &lt;/li&gt;    &lt;li&gt;&lt;a title="7-Zip" href="http://www.7-zip.org/"&gt;7-Zip&lt;/a&gt; is a file archiver and I install this as a default in all my PC’s. &lt;/li&gt;    &lt;li&gt;&lt;a title="Notepad++" href="http://notepad-plus-plus.org/"&gt;Notepad++&lt;/a&gt; is a text editor with tabs. Highly Recommended. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Security&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="Microsoft Security Essentials" href="http://www.microsoft.com/security_essentials/"&gt;Microsoft Security Essentials&lt;/a&gt; is free anti-virus and malware protection suite.&amp;#160; It does not have the fancy bells and whistles the other paid for commercial products have and that's why I like it. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Blogging&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="Windows Live Writer" href="http://www.windowslive.com.au/live-suite/writer/"&gt;Windows Live Writer&lt;/a&gt; supports a wide range of blogging platforms like Blogger, WordPress, Windows Live Spaces, SharePoint blog, TypePad etc.,&amp;#160; And from personal experience its heaps better and comfortable than the Bloggers browser based UI.&amp;#160; Most of the blogs from this blog are done using the Windows Live Writer. Highly Recommended.       &lt;ul&gt;       &lt;h3&gt;&lt;/h3&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Would love to hear your favourite free or open source tools you like on your PC.&lt;/p&gt;  &lt;p&gt;Happy Tinkering!&lt;/p&gt;  &lt;p&gt;Ravi&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-4207109166662773338?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/07/some-great-free-or-open-source-tools.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-8911978525782223456</guid><pubDate>Mon, 05 Jul 2010 00:27:00 +0000</pubDate><atom:updated>2010-07-05T10:27:38.413+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>OpenStandards</category><title>Is Mobile Device API’s pushing back Web Application Development?</title><description>&lt;p&gt;We seem to have gone a full circle. First we had applications which needed to be installed on the computer.&amp;#160; Then came the browsers, each with it own implementation of the web.&amp;#160; &lt;/p&gt;  &lt;p&gt;The browser open standards were created and right when the browser seems to be a good platform for creating standards based web application, there are now a multitude of devices each touting its own api and platform. And thereby going back to requiring to install applications on the devices.&amp;#160; &lt;/p&gt;  &lt;p&gt;So the the question is, whether all the energy being spent on individual vendors creating their own implementation of their Mobile Device API the same as the browser wars of the past? Is this diverting the attention from the advancement of the browser based standards?&lt;/p&gt;  &lt;p&gt;Is the future headed for an open standards Mobile API specification?&lt;/p&gt;  &lt;p&gt;Happy Coding&lt;/p&gt;  &lt;p&gt;Ravi&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-8911978525782223456?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/07/is-mobile-device-apis-pushing-back-web.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-2033141081937855926</guid><pubDate>Mon, 14 Jun 2010 09:27:00 +0000</pubDate><atom:updated>2010-06-19T17:54:11.609+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Git</category><title>Setting up Git Repository over network UNC in windows</title><description>&lt;p&gt;&lt;a href="http://git-scm.com/"&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/a&gt; is a Distributed Concurrent Versions System (DCVS).&amp;#160; And as such there is no requirement for a central server which needs to be always available.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Please note this workflow may only be suitable for small teams.&amp;#160; For larger teams setting up a proper Git Server is probably worth the effort.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;And also, It is assumed you have installed Git on all collaborating PCs.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;First we need to set up a Git repository to act as a junction between collaborators.&amp;#160; For this, pick a box which will have reasonably high availability. But because of the nature of Git, it is not necessary for this box to be always on.&lt;/p&gt;  &lt;p&gt;1. Open up the Git Bash (&lt;em&gt;You can also use the windows command prompt. But I prefer the bash&lt;/em&gt;)&lt;/p&gt;  &lt;p&gt;2. Create a new Folder for your project and set it up as a Git bare repository.    &lt;br /&gt;&lt;strong&gt;$ mkdir myapp      &lt;br /&gt;$ cd myapp       &lt;br /&gt;$ git --bare init       &lt;br /&gt;      &lt;br /&gt;&lt;/strong&gt;3.&amp;#160; Share the &lt;em&gt;myapp &lt;/em&gt;folder so that it is available as read/write to all users who need to collaborate in this project. &lt;/p&gt;  &lt;p&gt;Now that we have created a empty git repository and shared it, we need to push some code into into it.&amp;#160; &lt;/p&gt;  &lt;p&gt;Go the the folder where you have the code you want to push into the server.&amp;#160; This may be a on the same box as the server or any box on the network.&amp;#160; &lt;/p&gt;  &lt;p&gt;4. Init the Git repository there if not already done.    &lt;br /&gt;&lt;strong&gt;$ git init      &lt;br /&gt;$ git add *       &lt;br /&gt;$ git commit –m &amp;quot;project setup&amp;quot;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;5. Add the remote server location to this repository.    &lt;br /&gt;&lt;strong&gt;$ git remote add origin &amp;quot;//server_name/myapp/&amp;quot;      &lt;br /&gt;$ git push origin master&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now we have setup the server and pushed some code into it, We have to setup other users to get the initial code and start committing changes.&lt;/p&gt;  &lt;p&gt;6. The following needs to be done on all developer PCs which need to collaborate on this project.&amp;#160; Make sure these users have read/write UNC access to the server project folder.    &lt;br /&gt;&lt;strong&gt;$ git clone &amp;quot;//server_name/myapp&amp;quot;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;7. So all the setting up is done now. Now you can start coding, commit changes and push your code to the server.&amp;#160; So after you have done your code changes,   &lt;br /&gt;&lt;strong&gt;$ git add *     &lt;br /&gt;$ git commit –m &amp;quot;my changes&amp;quot;      &lt;br /&gt;$ git push origin master&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;And if you want to get latest changes from the server,   &lt;br /&gt;&lt;strong&gt;$ git pull origin master&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Please report errors and omissions.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;p&gt;Ravi&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-2033141081937855926?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/06/setting-up-git-repository-over-network.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-965047559153898380</guid><pubDate>Wed, 19 May 2010 05:11:00 +0000</pubDate><atom:updated>2010-07-15T10:52:03.464+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Usability</category><category domain='http://www.blogger.com/atom/ns#'>MVC</category><category domain='http://www.blogger.com/atom/ns#'>JQuery</category><category domain='http://www.blogger.com/atom/ns#'>AJAX</category><category domain='http://www.blogger.com/atom/ns#'>aspnetmvc</category><title>Using jQuery UI Tabs with ASP.Net MVC and Ajax Form Submit</title><description>&lt;a href="http://blog.roonga.com.au/2009/07/using-jquery-ui-dialog-with-aspnet-and.html"&gt;Using jQuery UI Dialog with ASP.Net and AJAX Update Panel&lt;/a&gt; is the most popular post in my blog.&amp;#160; While these dialog boxes are ok,&amp;#160; I have come to hate them. Primarily because of their over use.&amp;#160; And the one thing I hate most about them is they take the control away from the user and forces the user to attend to the dialog box before proceeding.&amp;#160; While this may be appropriate in certain situations, I have seen far too much abuse of the dialog boxes.   &lt;br /&gt;  &lt;br /&gt;And that is the reason I like &lt;a href="http://jqueryui.com/demos/tabs/"&gt;jQuery UI Tabs&lt;/a&gt;.&amp;#160; It does just the opposite.&amp;#160; It allows the user to move freely from tab to tab.&amp;#160; Implementing JQuery UI with ASP.Net Web Forms is difficult.&amp;#160; But with ASP.Net MVC it is fairly straight forward.&amp;#160; &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-bottom: 1em; float: right; margin-left: 1em; clear: right" href="http://3.bp.blogspot.com/_5fKM6yQGlMY/S-4xKNEqrHI/AAAAAAAAIDo/a24VM6wsJFo/s1600/list.png" imageanchor="1"&gt;&lt;img src="http://3.bp.blogspot.com/_5fKM6yQGlMY/S-4xKNEqrHI/AAAAAAAAIDo/a24VM6wsJFo/s320/list.png" /&gt;&lt;/a&gt;&lt;/div&gt; In this example we will look at a simple but non-trivial example.&amp;#160; It involves maintaining&amp;#160; a list of people and performing add, edit, view and delete operations.&amp;#160; Performing each operation opens a new tab and you can perform multiple operations at the same time, switching back and forth between the tabs.   &lt;br /&gt;  &lt;br /&gt;For this example I am using Visual Studio 2010, ASP.Net MVC2,&amp;#160; JQuery 1.4.2 and JQuery UI 1.8.1.&amp;#160; I am also using &lt;a href="http://www.malsup.com/jquery/form/"&gt;jQuery Form Plug-in&lt;/a&gt;.&amp;#160; This plug-in allows us easily and unobtrusively use AJAX with Forms.&amp;#160; Even though I am using MVC 2.0, this could easily be adapted for MVC 1.0 as well.   &lt;br /&gt;  &lt;h2&gt;&amp;#160;&lt;/h2&gt;  &lt;h2&gt;&amp;#160;&lt;/h2&gt;  &lt;h2&gt;&amp;#160;&lt;/h2&gt;  &lt;h2&gt; Some more screen shots:&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_5fKM6yQGlMY/S-5Qxyt3zyI/AAAAAAAAIEk/TmIuiIEoUMc/s1600-h/add%5B8%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="add" border="0" alt="add" src="http://lh3.ggpht.com/_5fKM6yQGlMY/S-5QyZ3zS0I/AAAAAAAAIEs/6CFDzjv_D5Q/add_thumb%5B6%5D.png?imgmax=800" width="304" height="264" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_5fKM6yQGlMY/TD5bqetK--I/AAAAAAAAIT0/1sooFd1yalU/s1600-h/validation%5B1%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="validation" border="0" alt="validation" align="left" src="http://lh3.ggpht.com/_5fKM6yQGlMY/S-5Q0EUc6NI/AAAAAAAAIT4/JOxqXYLC_HA/validation_thumb.png?imgmax=800" width="306" height="181" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_5fKM6yQGlMY/S-5Q0uOBkKI/AAAAAAAAIE8/QYtSIva1Ouk/s1600-h/message%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="message" border="0" alt="message" src="http://lh6.ggpht.com/_5fKM6yQGlMY/S-5Q1RFuiQI/AAAAAAAAIFE/xw-2RVktHks/message_thumb%5B1%5D.png?imgmax=800" width="304" height="268" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_5fKM6yQGlMY/S-5Q14kDQmI/AAAAAAAAIFI/IYT-l7VoRbg/s1600-h/edit%5B7%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="edit" border="0" alt="edit" src="http://lh4.ggpht.com/_5fKM6yQGlMY/S-5Q2UxEqYI/AAAAAAAAIFQ/_7Hl35j1-OQ/edit_thumb%5B5%5D.png?imgmax=800" width="304" height="243" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_5fKM6yQGlMY/S-5Q2yXtqFI/AAAAAAAAIT8/Aa6UNqkwisk/s1600-h/edit-multiple.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="edit-multiple" border="0" alt="edit-multiple" align="left" src="http://lh4.ggpht.com/_5fKM6yQGlMY/S-5Q3vf_5DI/AAAAAAAAIUA/Z975p-kKxzs/edit-multiple_thumb.png?imgmax=800" width="306" height="217" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_5fKM6yQGlMY/S-5Q4Pt7JjI/AAAAAAAAIFk/PUNYidzLc7A/s1600-h/delete%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="delete" border="0" alt="delete" src="http://lh6.ggpht.com/_5fKM6yQGlMY/S-5Q42OkuFI/AAAAAAAAIFw/OFXzM-OSz0U/delete_thumb%5B3%5D.png?imgmax=800" width="304" height="193" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;a href="http://www.mvc101.net/samples/tabs.zip"&gt;Download Source Here&lt;/a&gt;&lt;/b&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;I do not intend to go on a step by step tutorial here. Most of the code is standard ASP.Net MVC.&lt;b&gt;&lt;i&gt; As always, the source is the best tutorial.&lt;/i&gt;&lt;/b&gt;&amp;#160; However I will touch upon the major points.     &lt;br /&gt;&lt;/p&gt;  &lt;h3&gt;Model&lt;/h3&gt; The &lt;i&gt;Person &lt;/i&gt;model in the sample is straight forward.&amp;#160; The only point of note is the Validation Data Annotations.&amp;#160; We will be using these for our validation.   &lt;br /&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Controller&lt;/h3&gt; The code for the controller is the same as how you would do for any model based CURD operation.&amp;#160; All of our controller methods except the index, return partial views.&amp;#160; We will discuss this further later.   &lt;br /&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;View&lt;/h3&gt; From the point of this sample, the Views are the most interesting.&amp;#160; Except the initial view (Index.aspx) which loads up the tabs, all others are all partial views.&amp;#160; This helps us in loading the view onto a tab on the client side using ajax.   &lt;br /&gt;  &lt;h4&gt;&amp;#160;&lt;/h4&gt;  &lt;h4&gt;Unique Ids for all forms and divs&lt;/h4&gt; Because of the nature of the Tabs, the user could be adding a new Person and editing the Person side-by-side. &lt;b&gt;This means we have to keep the ids of our divs and forms unique&lt;/b&gt;.&amp;#160; This helps jQuery to be able to submit the form asynchronously and load up the results in the required div.&amp;#160;&amp;#160; &lt;br /&gt;This sample, keeps the ids unique by post-fixing the id of the model to the div and form ids.&amp;#160;&amp;#160; If that is not possible as in the Create View, where the model does not yet have an id, I am using &lt;i&gt;DateTime.Now.Ticks.ToString()&lt;/i&gt; as an unique id.&amp;#160; But you can use whatever means best suits your scenario.&amp;#160; &lt;br /&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;So How Does This Work?&lt;/h3&gt; For example when the “Create New User” button is clicked,&amp;#160; a new tab is dynamically created with the url for the &lt;i&gt;Create &lt;/i&gt;view.&amp;#160; In this new tab we load a form nested within a div. They both have unique ids.&amp;#160; So even if the user opens up new tab it does not interfere with each other.&amp;#160; And also using the Form Plug-in, we setup the form to post asynchronously   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_5fKM6yQGlMY/S-5rOsZ_bQI/AAAAAAAAIF4/M5IZYaXhuBA/s1600-h/setup-form1%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="setup-form1" border="0" alt="setup-form1" src="http://lh3.ggpht.com/_5fKM6yQGlMY/S-5rPYUDLmI/AAAAAAAAIF8/r0_4ur7CAS4/setup-form1_thumb%5B2%5D.png?imgmax=800" width="404" height="71" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_5fKM6yQGlMY/S-5rP0likHI/AAAAAAAAIGA/zg9eAZZRPYo/s1600-h/form%5B7%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="form" border="0" alt="form" src="http://lh4.ggpht.com/_5fKM6yQGlMY/S-5rQrY_jQI/AAAAAAAAIGE/xInA8aIonFQ/form_thumb%5B5%5D.png?imgmax=800" width="404" height="59" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_5fKM6yQGlMY/S-5rRIOvUqI/AAAAAAAAIGI/4rDAs74fOWk/s1600-h/div%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="div" border="0" alt="div" src="http://lh3.ggpht.com/_5fKM6yQGlMY/S-5rRtoSChI/AAAAAAAAIGM/uG7MChQla1w/div_thumb%5B2%5D.png?imgmax=800" width="354" height="52" /&gt;&lt;/a&gt;   &lt;br /&gt;When a new person is created or a existing person is edited, the form hosting the peoples table is posted hereby displaying the updated data. All this happens asynchronously and the whole page is never refreshed any point. The standard jQuery UI Tabs API is used for all the tabs dynamics.   &lt;br /&gt;Please add a comment if you have any particular queries or a better implementation.   &lt;br /&gt;  &lt;br /&gt;&lt;b&gt;&lt;a href="http://www.mvc101.net/samples/tabs.zip"&gt;Download Source Here&lt;/a&gt;&lt;/b&gt;   &lt;br /&gt;  &lt;br /&gt;&lt;i&gt;Sorry I am not able to post a link to an working sample as I do not have hosting suitable for this.&amp;#160; I will try to rectify this in the near future.&lt;/i&gt;   &lt;br /&gt;  &lt;br /&gt;Happy Coding   &lt;br /&gt;  &lt;br /&gt;Ravi   &lt;br /&gt;  &lt;br /&gt;&lt;i&gt;Check out &lt;/i&gt;&lt;a href="http://www.mvc101.net/"&gt;&lt;i&gt;http://www.MVC101.Net&lt;/i&gt;&lt;/a&gt;&lt;i&gt; for links to great ASP.Net MVC Content.&lt;/i&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-965047559153898380?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/05/using-jquery-ui-tabs-with-aspnet-mvc.html</link><author>noreply@blogger.com (Ravi)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_5fKM6yQGlMY/S-4xKNEqrHI/AAAAAAAAIDo/a24VM6wsJFo/s72-c/list.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-6406281268406752876</guid><pubDate>Fri, 14 May 2010 22:45:00 +0000</pubDate><atom:updated>2010-05-15T19:38:53.654+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Podcast</category><category domain='http://www.blogger.com/atom/ns#'>Agile</category><title>Software Engineering Podcasts</title><description>&lt;b&gt;&lt;a href="http://www.se-radio.net/"&gt;Software Engineering Radio&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;SE-Radio is a high quality podcast and my favourite.&amp;nbsp; They is technology neutral and covers all areas of software engineering practices and processes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.hanselminutes.com/"&gt;Hanselminutes&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Scott Hanselman is a microsoft person.&amp;nbsp; But the content is fairly neutral and would be interesting to even non-microsoft developers.&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;I have not yet tried the following podcasts:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://feeds.feedburner.com/netRocksFullMp3Downloads"&gt;http://feeds.feedburner.com/netRocksFullMp3Downloads&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://feeds2.feedburner.com/PolymorphicPodcast"&gt;http://feeds2.feedburner.com/PolymorphicPodcast&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNetPodcast-MP3.xml"&gt;http://www.scalabledevelopment.com/ftp/ASPNetPodcast-MP3.xml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://feeds.feedburner.com/altnetpodcast"&gt;http://feeds.feedburner.com/altnetpodcast&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://feeds.feedburner.com/deepfriedbytes"&gt;http://feeds.feedburner.com/deepfriedbytes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://feeds2.feedburner.com/HerdingCode"&gt;http://feeds2.feedburner.com/HerdingCode&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.stackoverflow.com/index.php?feed=podcast"&gt;http://blog.stackoverflow.com/index.php?feed=podcast&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://agiletoolkit.libsyn.com/rss"&gt;http://agiletoolkit.libsyn.com/rss&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://consultingblogs.emc.com/howardvanrooijen/rss.aspx?CategoryID=1018"&gt;http://consultingblogs.emc.com/howardvanrooijen/rss.aspx?CategoryID=1018&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;If you&amp;nbsp; have some comments about any of the above or any other podcasts, I would love to hear from you.&lt;br /&gt;&lt;br /&gt;Happy Coding&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-6406281268406752876?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/05/software-engineering-podcasts.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-1157411381161944912</guid><pubDate>Wed, 05 May 2010 00:04:00 +0000</pubDate><atom:updated>2010-05-05T10:04:00.265+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>DesignPattern</category><category domain='http://www.blogger.com/atom/ns#'>Agile</category><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Observer Design Pattern By Example in C#</title><description>&lt;span style="font-style: italic;"&gt;This is part of a series of posts in which we will dea&lt;/span&gt;&lt;span style="font-style: italic;"&gt;l with some of the popular design patters using simple but non-trivial examples.&amp;nbsp; The link to download the sample code is available at the bottom.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Observer &lt;/span&gt;design pattern consists of the the Observer Object and the Subject being observed.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5fKM6yQGlMY/S8pUGMcFV_I/AAAAAAAAH5U/IvDDRYPhbBk/s1600/observer-model.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="81" src="http://2.bp.blogspot.com/_5fKM6yQGlMY/S8pUGMcFV_I/AAAAAAAAH5U/IvDDRYPhbBk/s320/observer-model.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This pattern is useful when the Subject object has a long running operation.&amp;nbsp; And the Observer object would like to know when certain events happen in the subject.&amp;nbsp; One solution would be for the Observer to constantly poll the subject to see what its up to.&amp;nbsp; But wouldn't it be a lot better solution if the subject can just tell you as and when it happens.&lt;br /&gt;&lt;br /&gt;Lets tell a little story.&amp;nbsp; Your internet connection has suddenly stopped working and you call your ISP support line.&amp;nbsp; Their telephone system tells you that all its operators are busy and to wait. &amp;nbsp; The more you wait you more frustrated you get and you are not happy.&amp;nbsp;&amp;nbsp; In a alternative world, your internet connection goes down and you call your ISP.&amp;nbsp; The ISP tells you that their operators are busy,&amp;nbsp; takes your contact number and promises to call you back when a support operator becomes available.&amp;nbsp; You continue to do your own work and some minutes later the ISP's support operator calls you back.&amp;nbsp; This is a far more ideal solution as you are not left hanging doing nothing.&amp;nbsp; This is what the Observer pattern achieves.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;The implementation of the pattern requires that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All the instance of the Observers are registered with the Subject.&lt;/li&gt;&lt;li&gt;The Subject notifies the Observer when something interesting happens.&lt;/li&gt;&lt;li&gt;An observer can also be unregistered from receiving updates from the subject.&lt;/li&gt;&lt;/ul&gt;In this example, we have the IObserver Interface.&amp;nbsp; The classes ObserverA and ObserverB implement this interface.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5fKM6yQGlMY/S8phXv7R8NI/AAAAAAAAH6E/qL89WRBKZAQ/s1600/observer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://4.bp.blogspot.com/_5fKM6yQGlMY/S8phXv7R8NI/AAAAAAAAH6E/qL89WRBKZAQ/s400/observer.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;The Subject class is the object we need to observe.&amp;nbsp; To facilitate this, The Subject class maintains a list of IObserver's and allows for them to be added and removed.&amp;nbsp; And when ever a certain event happens it goes the list of its observers and notifies them.&lt;br /&gt;&lt;br /&gt;The uses of the pattern are many especially in the UI based applications where the user initiated events can be communicated to the registered observers whenever it happens.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/leaf?id=0B-YMfP9CkadaZDRmYmFlNjAtNDNhMi00MWE0LWE4NDItZmJhYTIxM2NlYTQy&amp;amp;hl=en_GB"&gt;Download Sample Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happing Coding&lt;br /&gt;&lt;br /&gt;Ravi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-1157411381161944912?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/05/observer-design-pattern-by-example-in-c.html</link><author>noreply@blogger.com (Ravi)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5fKM6yQGlMY/S8pUGMcFV_I/AAAAAAAAH5U/IvDDRYPhbBk/s72-c/observer-model.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-3979157399885933704</guid><pubDate>Wed, 28 Apr 2010 00:00:00 +0000</pubDate><atom:updated>2010-04-28T10:00:06.391+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>DesignPattern</category><category domain='http://www.blogger.com/atom/ns#'>Agile</category><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Singleton Design Pattern By Example in C#</title><description>&lt;span style="font-style: italic;"&gt;This is part of a series of posts in which we will deal with some of the popular design patters using simple but non-trivial examples.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Singleton Pattern &lt;/b&gt;is probably the most well known of all design patterns.&amp;nbsp; And it is also one of the most simple.&amp;nbsp; The requirement for this pattern arises when you need to share a single instance of a class across your whole application. &lt;i&gt;The download link for this sample project is available at the bottom.&lt;/i&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5fKM6yQGlMY/S8kP5YR8pXI/AAAAAAAAH4s/TXsMGNJemRI/s1600/singleton.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_5fKM6yQGlMY/S8kP5YR8pXI/AAAAAAAAH4s/TXsMGNJemRI/s320/singleton.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;The implementation of the Singleton pattern consists of:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A Class with a private field pointing to its own instance.&amp;nbsp; This can be initialised on the field itself or in the Instance Getter.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Private constructor.&amp;nbsp; There should not be any public constructors to this class.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A Getter property for the Instance.&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;Hence the only way to get a instance of this class is through the Instance property which returns the one and only instance.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why not just use a Static Class?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The advantage of using a normal class is that it can inherit from another class or implement an interface.&amp;nbsp; And also this class can be passed as a parameter in a method.&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_1662162028"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/leaf?id=0B-YMfP9CkadaZWIxZWM1M2QtYWRlNi00Zjg3LThmZTUtZjdhOGRjYTI2NjAx&amp;amp;hl=en_GB"&gt;Download Sample Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding&lt;br /&gt;&lt;br /&gt;Ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-3979157399885933704?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/04/singleton-design-pattern-by-example-in.html</link><author>noreply@blogger.com (Ravi)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_5fKM6yQGlMY/S8kP5YR8pXI/AAAAAAAAH4s/TXsMGNJemRI/s72-c/singleton.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-8967643736501796528</guid><pubDate>Wed, 21 Apr 2010 00:45:00 +0000</pubDate><atom:updated>2010-04-21T10:45:00.401+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>DesignPattern</category><category domain='http://www.blogger.com/atom/ns#'>Agile</category><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Strategy Design Pattern By Example in C#</title><description>&lt;span style="font-style: italic;"&gt;This is part of a series of posts in which we will deal with some of the popular design patters using simple but non-trivial examples.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Strategy Pattern &lt;/b&gt;delivers similar functionality as the Template Pattern. But the implementation is different.  So we will use the same sample scenario as we did for the Template Pattern.&lt;br /&gt;&lt;br /&gt;Our task here is to import data into our system from multiple source types.  The task of  checking for duplication and adding to our repository is common functionality.  Whereas reading and converting the incoming data to our format would be different for each kind of datasource.  In this example we will import Xml and CSV data into our repository.&lt;br /&gt;&lt;br /&gt;The Strategy Pattern involves two parts. The Interface which defines all the varying functionality and&amp;nbsp; a Class with all the common functionality &amp;nbsp; The class also takes in the implementation of the Interface in its constructor. &lt;br /&gt;&lt;br /&gt;Enough theory, Lets dive into our sample implementation and check out the actors.&amp;nbsp;  The download link to this sample is available at the bottom.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;IImportData Interface &lt;/b&gt;is the interface which defines the functionality which with each kind of data we will be importing.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5fKM6yQGlMY/S7aFTWMuYuI/AAAAAAAAH1o/ZhOfo9C68DY/s1600/strategy-dp.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="318" src="http://4.bp.blogspot.com/_5fKM6yQGlMY/S7aFTWMuYuI/AAAAAAAAH1o/ZhOfo9C68DY/s400/strategy-dp.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ImportDataHandler Class&lt;/b&gt; takes in an implementation of IImportData Interface as a parameter in its constructor.&amp;nbsp; This class also has other common functionality like checking for duplicates and add data to the repository.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;ImportCSVData Class &amp;amp; ImportXmlData Class&lt;/b&gt; are implementations of the IImportData Interface.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;So importing csv and xml data into our repository is simply a matter of passing in the required implementation to the ImportDataHandler class and calling its Execute method.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So if the Strategy and Template Patter offer similar functionality, which one to use? The answer is it depends.&amp;nbsp; We will leave that for a later post.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/leaf?id=0B-YMfP9CkadaZjg5ODJiZTEtNzEzZS00ZWE4LTkwODItMzQ1YTM2NjNmOWM0&amp;amp;hl=en_GB"&gt;Download Sample Code &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding&lt;br /&gt;&lt;br /&gt;Ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-8967643736501796528?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/04/strategy-design-pattern-by-example-in-c.html</link><author>noreply@blogger.com (Ravi)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_5fKM6yQGlMY/S7aFTWMuYuI/AAAAAAAAH1o/ZhOfo9C68DY/s72-c/strategy-dp.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-2883667240881177734</guid><pubDate>Wed, 14 Apr 2010 00:55:00 +0000</pubDate><atom:updated>2010-04-14T10:55:00.358+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>DesignPattern</category><category domain='http://www.blogger.com/atom/ns#'>Agile</category><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Command Design Pattern By Example in C#</title><description>&lt;span style="font-style: italic;"&gt;This is part of a series of posts in which we will dea&lt;/span&gt;&lt;span style="font-style: italic;"&gt;l with some of the popular design patters using simple but non-trivial examples.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;Command&lt;/span&gt; is probably the most simple of design patterns.  All it takes is one Interface with one method.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_5fKM6yQGlMY/S7U0-f5WUII/AAAAAAAAH1A/lXSUQjNiuMo/s1600/command-interface.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5455324771947794562" src="http://3.bp.blogspot.com/_5fKM6yQGlMY/S7U0-f5WUII/AAAAAAAAH1A/lXSUQjNiuMo/s400/command-interface.png" style="cursor: pointer; float: left; height: 134px; margin: 0pt 10px 10px 0pt; width: 171px;" /&gt;&lt;/a&gt;&lt;br /&gt;In this example we will implement a simple but non trivial example using the Command pattern.  You can find the link to download the sample at the bottom.  It deals with a couple of common validation scenarios.&lt;br /&gt;&lt;br /&gt;Here we have an interface called IValidatable with a method called IsValid.  So any class which inplements this interface needs to provide functionality for the IsValid method.   In our example the Person class and the Address c&lt;a href="http://4.bp.blogspot.com/_5fKM6yQGlMY/S7U5QWDLrrI/AAAAAAAAH1I/jvtVeIzDYsg/s1600/class-imple.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5455329476588842674" src="http://4.bp.blogspot.com/_5fKM6yQGlMY/S7U5QWDLrrI/AAAAAAAAH1I/jvtVeIzDYsg/s400/class-imple.png" style="cursor: pointer; float: right; height: 284px; margin: 0pt 0pt 10px 10px; width: 334px;" /&gt;&lt;/a&gt;lass implement this interface.&lt;br /&gt;&lt;br /&gt;And we are able to call person.IsValid and address.IsValid to check for validation.&lt;br /&gt;&lt;br /&gt;This also brings us all the advantages of multiple classes implementing the same Interface.  For example we can have a List of IValidatable objects and call the IsValid method on iteration.&lt;br /&gt;&lt;br /&gt;Please note that even though it is more common to use only one method in this pattern.&amp;nbsp; It is not necessarily a strict rule.&amp;nbsp; You can add more methods.&amp;nbsp; For example we could have included an additional method called GetErrorMessages in IValidatable and called it if IsValid returned false.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/leaf?id=0B-YMfP9CkadaMjFhNzIyNmUtMTk1MS00YTg4LTk4MGItZDU1ZDE2MTljOWY0&amp;amp;hl=en_GB"&gt;Download Sample Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding&lt;br /&gt;&lt;br /&gt;Ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-2883667240881177734?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/04/command-design-pattern-by-example-in-c.html</link><author>noreply@blogger.com (Ravi)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_5fKM6yQGlMY/S7U0-f5WUII/AAAAAAAAH1A/lXSUQjNiuMo/s72-c/command-interface.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-4163127031717482448</guid><pubDate>Wed, 07 Apr 2010 02:01:00 +0000</pubDate><atom:updated>2010-04-07T12:01:00.191+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>DesignPattern</category><category domain='http://www.blogger.com/atom/ns#'>Agile</category><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Template Design Pattern By Example in C#</title><description>&lt;span style="font-style: italic;"&gt;This is part of a series of posts in which we will dea&lt;/span&gt;&lt;span style="font-style: italic;"&gt;l with some of the popular design patters using simple but non-trivial examples.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-weight: bold;"&gt;Template&lt;/span&gt;&lt;/b&gt;&lt;b&gt; Design Pattern&lt;/b&gt; is a very simple design pattern and yet is very useful.&amp;nbsp; It helps in situations where multiple tasks have common functionality but have some distinct variations.&lt;br /&gt;&lt;br /&gt;Lets dive straight into our example. The download link to this sample is available at the bottom. Our task here is to import data into our system from multiple sources.&amp;nbsp; The task of&amp;nbsp; checking for duplication and adding to our repository is common functionality.&amp;nbsp; Whereas reading and converting the incoming data to our format would be different for each kind of datasource.&amp;nbsp; In our example we need to import Xml and CSV data into our repository.&lt;br /&gt;&lt;br /&gt;Template Pattern involves creating a abstract class with common functionality implemented and defines abstract methods and properties for areas which are variable.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5fKM6yQGlMY/S7ZxV98C6-I/AAAAAAAAH1Q/5Bzsf689LvQ/s1600/template-dp.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_5fKM6yQGlMY/S7ZxV98C6-I/AAAAAAAAH1Q/5Bzsf689LvQ/s400/template-dp.png" width="257" /&gt;&lt;/a&gt;&lt;/div&gt;So lets check out the actors in our example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ImportData Abstract Class &lt;/b&gt;- implements common functionality like checking for duplicate data and inserting into our repository.&amp;nbsp; But only defines abstract methods for initialising the incoming data and converting the incoming data into a common format.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ImportCSVData Class&lt;/b&gt; - inherits from ImportData abstract class and implements the required property and methods.&amp;nbsp; This class adds functionality to import from CSV data.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;ImportXmlData Class&lt;/b&gt; - likewise inherits from ImportData and adds functionality to import from XML data.&lt;/li&gt;&lt;/ul&gt;Thus if in the future, we are required to import yet another type of data we would create another class inheriting from the abstract base class and implementing it.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/leaf?id=0B-YMfP9CkadaZDE1Mjk2ZTMtMGJiZS00ZDA1LThkYzUtMzM3MTk5MjNiNzhh&amp;amp;hl=en_GB"&gt;Download Sample Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding&lt;br /&gt;&lt;br /&gt;Ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-4163127031717482448?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/04/template-design-pattern-by-example-in-c.html</link><author>noreply@blogger.com (Ravi)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5fKM6yQGlMY/S7ZxV98C6-I/AAAAAAAAH1Q/5Bzsf689LvQ/s72-c/template-dp.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-2330499510775138591</guid><pubDate>Thu, 01 Apr 2010 19:32:00 +0000</pubDate><atom:updated>2010-04-02T06:59:38.038+11:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>MVC</category><category domain='http://www.blogger.com/atom/ns#'>aspnetmvc</category><title>Getting Started with MVC2 for Visual Studio 2008 SP1</title><description>MVC 2 RTM has been released for Visual Studio 2008 SP1 and will be built into Visual Studio 2010.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Downloading and Installing MVC2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You have two options for installing MVC2 for Visual Studio 2008 SP1:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Using the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=185037"&gt;Web Platform Installer&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;As a stand alone download from &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=c9ba1fe1-3ba8-439a-9e21-def90a8615a9"&gt;Microsoft Download Center&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Starting with MVC2&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.asp.net/mvc/"&gt;Microsofts Official website&lt;/a&gt; is a good place to start.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mvc101.net/Articles/MVC2/1"&gt;MVC101&lt;/a&gt; website has a good collection MVC2 resources listed.&lt;/li&gt;&lt;li&gt;&lt;a href="http://live.visitmix.com/Sessions/Tags/MVC"&gt;MIX10&lt;/a&gt; has some really good videos of the MVC sessions by &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt; and &lt;a href="http://haacked.com/"&gt;Phil Haack.&lt;/a&gt; Especially checkout the &lt;a href="http://live.visitmix.com/MIX10/Sessions/FT04"&gt;Whats's New in ASP.Net MVC2&lt;/a&gt; Video to give you good grounding.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Happy Coding&lt;br /&gt;&lt;br /&gt;Ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-2330499510775138591?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/04/getting-started-with-mvc2-for-visual.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-2529461954401234535</guid><pubDate>Sat, 06 Feb 2010 03:43:00 +0000</pubDate><atom:updated>2010-02-06T15:21:13.267+11:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>aspnetmvc</category><title>MVC101.Net is finally Live</title><description>&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.mvc101.net"&gt;http://www.mvc101.net&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have been working on the MVC101.Net project for a while. I have a day job and finding time to work on this was getting a bit tricky. But finally I have managed to push it out.  Of course I will continue to work on this.&lt;br /&gt;&lt;br /&gt;I used to run a similar concept website (connectionstring.com) around 2000-2002 based on Classical ASP. With the advent of ASP.Net, I did not have the time to update it to .net and lost interest.  ASP.Net MVC is best Microsoft innovation in the web world since classical ASP and has rekindled my interest in running a community website.&lt;br /&gt;&lt;br /&gt;The purpose of MVC101 is to help developers keep up to date with the news, blogs and articles in the ASP.Net MVC World.  And one of the biggest feature of the website is its search.  The Search uses the Bing API and limits to search to the resources listed in the website.  This means you are focusing your search to a subsection of hand picked quality resources.  And in most cases this should give a better quality of results.&lt;br /&gt;&lt;br /&gt;And secondly the resources are tagged.  This will help the user in zoning into the area of interest.  The most glaring omission of this website is the ability of the community to participate in it.  I am yet to decide on the model for this. Any suggestions are greatly welcome.&lt;br /&gt;&lt;br /&gt;Thank you and looking forward to some great feed back from the community.&lt;br /&gt;&lt;br /&gt;Happy Coding&lt;br /&gt;&lt;br /&gt;Ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-2529461954401234535?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2010/02/mvc101net-is-finally-live.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-999801222450197065</guid><pubDate>Sun, 16 Aug 2009 21:02:00 +0000</pubDate><atom:updated>2009-08-17T07:30:26.048+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Usability</category><title>Remote Tech Support for your family</title><description>Yesterday I discovered one of the coolest tools of remote tech support.  Well... it has been there for awhile.  But I discovered it only yesterday!&lt;br /&gt;&lt;br /&gt;Well It all started like this.. A family member was trying to set up voice &amp; video chat so we don't have to use the expensive phone. We were trying to help over the phone and going in circles.  That when I remembered there are tools for doing remote access and was prepared to fork some money to get over the frustration.&lt;br /&gt;&lt;br /&gt;And the solution was &lt;a href="https://secure.logmein.com/products/free/"&gt;LogMeIn&lt;/a&gt; and better still, there is a free version.  Quite simply its brilliant.  This could easily qualify as very complex software.  But that didn't stop it from being easy to use.  So usable, I was able guide my non-tech family member to install it and then remotely take control.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://secure.logmein.com/home.asp?hp=1"&gt;LogMeIn&lt;/a&gt; is a excellent example of Usability in software and proves complex software can be easy to use.  Give it a go!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-999801222450197065?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2009/08/remote-tech-support-for-your-family.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-3286827201024101872</guid><pubDate>Fri, 14 Aug 2009 12:23:00 +0000</pubDate><atom:updated>2009-08-16T20:11:52.508+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>MVC</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net</category><title>VS 2010 and ASP.Net MVC Error</title><description>&lt;blockquote&gt;The view at '~/Views/Home/Index.aspx' must derive from ViewPage, ViewPage&amp;lt;TViewData&amp;gt;, ViewUserControl, or ViewUserControl&amp;lt;TViewData&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You have installed the brand new Visual Studio 2010 Beta 1 and ASP.Net MVC 1 and try it out.  Then bang, you get this error.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5fKM6yQGlMY/SoVYzOFykpI/AAAAAAAAGHI/vCCxGO6YyW0/s1600-h/asp-mvc-vs2010-error.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 49px;" src="http://2.bp.blogspot.com/_5fKM6yQGlMY/SoVYzOFykpI/AAAAAAAAGHI/vCCxGO6YyW0/s200/asp-mvc-vs2010-error.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5369795767688139410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But its easily fixed.&lt;br /&gt;&lt;br /&gt;Step 1: Open your project file (*.csproj) and change the below line.&lt;br /&gt;&lt;br /&gt;before:&lt;br /&gt;&amp;lt;Reference Include="System.Web.Mvc, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"&amp;gt;&lt;br /&gt;&lt;br /&gt;after:&lt;br /&gt;&amp;lt;Reference Include="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 2: In your web.config file and change the below line&lt;br /&gt;&lt;br /&gt;before:&lt;br /&gt;&amp;lt;add assembly="System.Web.Mvc, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&amp;gt;&lt;br /&gt;&lt;br /&gt;after:&lt;br /&gt;&amp;lt;add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&amp;gt;&lt;br /&gt;&lt;br /&gt;Re-build and run, and it hopefully works!&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;br /&gt;&lt;br /&gt;ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-3286827201024101872?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2009/08/vs-2010-and-aspnet-mvc-error.html</link><author>noreply@blogger.com (Ravi)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5fKM6yQGlMY/SoVYzOFykpI/AAAAAAAAGHI/vCCxGO6YyW0/s72-c/asp-mvc-vs2010-error.JPG' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-9136096323378003547</guid><pubDate>Thu, 30 Jul 2009 04:41:00 +0000</pubDate><atom:updated>2009-07-30T15:01:29.147+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>JQuery</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net</category><title>ASP.Net RadioButtonList  and JQuery</title><description>This is a short one, but I had to search around quite a bit for an answer.  The internet is peppered with answers which were probably right for the version of jQuery they referred to.  This sample uses jQuery 1.3.2.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Question&lt;/span&gt;:&lt;br /&gt;How to access the value of the ASP.Net RadioButtonList in jQuery ?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Answer&lt;/span&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$('#radioButtonListClientId').find('input[checked]').val();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Remember "radioButtonListClientId" referred above is the ClientID and not the ID of the server control.&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;br /&gt;&lt;br /&gt;ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-9136096323378003547?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2009/07/aspnet-radiobuttonlist-and-jquery.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-64350089487582575</guid><pubDate>Thu, 16 Jul 2009 02:20:00 +0000</pubDate><atom:updated>2009-07-20T20:39:44.244+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>C#</category><title>Generic XML Serialization / De-Searialization</title><description>Generic Serialize and Deserialize Methods:&lt;pre class="brush:c#"&gt;&lt;br /&gt;public static XmlDocument Serialize&amp;lt;T&amp;gt;(T xmlObject)&lt;br /&gt;{&lt;br /&gt;    var xmlDocument = new XmlDocument();&lt;br /&gt;    var xml = new StringBuilder();&lt;br /&gt;    var serializer = new XmlSerializer(typeof(T));&lt;br /&gt;    var writer = new StringWriter(xml);&lt;br /&gt;    serializer.Serialize(writer, xmlObject);&lt;br /&gt;    xmlDocument.LoadXml(xml.ToString());&lt;br /&gt;    return xmlDocument;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static T Deserialize&amp;lt;T&amp;gt;(XmlDocument xmlDocument)&lt;br /&gt;{&lt;br /&gt;    T result;&lt;br /&gt;    XmlSerializer serializer = new XmlSerializer(typeof(T));&lt;br /&gt;&lt;br /&gt;    using (StringReader stringReader = new StringReader(xmlDocument.InnerXml))&lt;br /&gt;    {&lt;br /&gt;        using (XmlTextReader xmlReader = new XmlTextReader(stringReader))&lt;br /&gt;        {&lt;br /&gt;            result = (T) serializer.Deserialize(xmlReader);&lt;br /&gt;            xmlReader.Close();&lt;br /&gt;        }&lt;br /&gt;        stringReader.Close();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sample Usage:&lt;pre class="brush:c#"&gt;&lt;br /&gt;//Serialize&lt;br /&gt;XmlDocument xmlPerson = Serialize(person);&lt;br /&gt;&lt;br /&gt;//Deserialize&lt;br /&gt;Person anotherPerson = Deserialize&amp;lt;Person&amp;gt;(xmlPerson);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-64350089487582575?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2009/07/generic-xml-serialization-de.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-6713531557570241885</guid><pubDate>Thu, 16 Jul 2009 02:19:00 +0000</pubDate><atom:updated>2009-07-18T12:29:53.213+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>ASP.Net</category><title>Setting Up Print view when using a Master Page</title><description>Lets say you are using Master Pages in you ASP.Net Web Site or Application and want to set up a print view for your users.  Your master page has top navigation / side navigation etc which you do not want to appear in the print view.  A simple solution is to pass a print query string in the URL and change your master page to a one suitable for print view.  You will need to do this in the Page_PreInit event.&lt;br /&gt;&lt;br /&gt;Code Sample:&lt;br /&gt;&lt;pre class="brush:c#"&gt;void Page_PreInit(Object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;  if (Request.QueryString["print"] == 1)&lt;br /&gt;  {&lt;br /&gt;    MasterPageFile = "~/MasterPage/Print.Master";&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;[ BTW, the above code syntax highlighting is by &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;http://alexgorbatchev.com/wiki/SyntaxHighlighter&lt;/a&gt;.  Absolutely love this!  Thank you, Alex. ]&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;br /&gt;&lt;br /&gt;Ravi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/ed83eaef-b4dc-4450-abae-97a434ddfc5f/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=ed83eaef-b4dc-4450-abae-97a434ddfc5f" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-6713531557570241885?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2009/07/setting-up-print-view-when-using-master.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-3645094122773399312</guid><pubDate>Thu, 02 Jul 2009 19:17:00 +0000</pubDate><atom:updated>2010-07-15T10:48:49.937+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>JQuery</category><category domain='http://www.blogger.com/atom/ns#'>AJAX</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net</category><title>Using JQuery UI Dialog with ASP.Net and AJAX Update Panel</title><description>&lt;p&gt;One of the first things you will notice when you try and use &lt;a href="http://jqueryui.com/demos/dialog/"&gt;JQuery UI Dialog&lt;/a&gt; in &lt;a class="zem_slink" title="ASP.NET" href="http://www.asp.net/" rel="homepage"&gt;ASP.Net&lt;/a&gt; page is it does not perform post backs from within the dialog window. This is because in a ASP.Net page there is only one form element and &lt;a class="zem_slink" title="JQuery" href="http://jquery.com/" rel="homepage"&gt;Jquery&lt;/a&gt; appends the dialog &amp;quot;div&amp;quot; outside of the form element. There is a easy way to fix this. And once its done then its simple matter of combining some ASP.Net AJAX Update Panels and you are ready to go.     &lt;br /&gt;    &lt;br /&gt;&lt;img style="margin: 0px 0px 10px; width: 152px; display: inline; height: 204px; cursor: pointer" id="BLOGGER_PHOTO_ID_5354337023711005842" border="0" alt="" align="right" src="http://4.bp.blogspot.com/_5fKM6yQGlMY/Sk5tJ5IETJI/AAAAAAAAFuo/_hVI9n5V8eI/s320/list.png" /&gt;Lets look at a simple but non-trivial example of combining JQuery UI Dialog, Asp.Net and AJAX Update Panel. &lt;a href="http://www.mvc101.net/samples/JQueryUiDialogDemo.zip"&gt;You can download the source of the sample here&lt;/a&gt;. Our sample application will display a list of names. To edit a name, you click on a name.&amp;#160; &lt;br /&gt;    &lt;br /&gt;This will pop up a JQuery UI Dialog with the current name. You can edit the name and click save. This will save and automatically close the dialog.&amp;#160;&amp;#160; For adding a new Name, click on the &amp;quot;Add New Person&amp;quot; button. And this will bring up the new person dialog and allow you to save. Adding or Editing names will automatically update the list with the changes.     &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5fKM6yQGlMY/Sk55Ya3fBdI/AAAAAAAAFvg/Vxd3eBy_CCY/s1600-h/edit.png"&gt;&lt;img style="margin: 20px 0px 10px; width: 200px; display: inline; height: 112px; cursor: pointer" id="BLOGGER_PHOTO_ID_5354350467425961426" border="0" alt="" align="left" src="http://1.bp.blogspot.com/_5fKM6yQGlMY/Sk55Ya3fBdI/AAAAAAAAFvg/Vxd3eBy_CCY/s200/edit.png" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_5fKM6yQGlMY/Sk55hqB9YYI/AAAAAAAAFvo/xdNB7l-6X54/s1600-h/new.png"&gt;&lt;img style="margin: 20px 0px 10px 25px; width: 200px; display: inline; height: 117px; cursor: pointer" id="BLOGGER_PHOTO_ID_5354350626115248514" border="0" alt="" align="left" src="http://4.bp.blogspot.com/_5fKM6yQGlMY/Sk55hqB9YYI/AAAAAAAAFvo/xdNB7l-6X54/s200/new.png" /&gt;&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;I am not going to go through explaining each line of the source. Its much easier to read the source code for yourself. I will just point out the main highlights. The first thing you will notices is when setting up the JQuery dialog, we are adding a open event to attach the dialog div to the form element. This will insure the post backs to happen.     &lt;br /&gt;    &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5fKM6yQGlMY/Sk50pLdsPwI/AAAAAAAAFvI/SNBdrkXg4jA/s1600-h/dialog_setup.png"&gt;&lt;img style="margin: 0pt 0px 10px; width: 320px; display: inline; height: 112px; cursor: pointer" id="BLOGGER_PHOTO_ID_5354345257790881538" border="0" alt="" align="left" src="http://1.bp.blogspot.com/_5fKM6yQGlMY/Sk50pLdsPwI/AAAAAAAAFvI/SNBdrkXg4jA/s320/dialog_setup.png" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5fKM6yQGlMY/Sk523XyskII/AAAAAAAAFvY/c_ZTiBM_OhY/s1600-h/update_panel_setup.png"&gt;&lt;img style="text-align: center; margin: 0px 0px 10px; width: 400px; display: inline; height: 90px; cursor: pointer" id="BLOGGER_PHOTO_ID_5354347700641632386" border="0" alt="" align="left" src="http://2.bp.blogspot.com/_5fKM6yQGlMY/Sk523XyskII/AAAAAAAAFvY/c_ZTiBM_OhY/s400/update_panel_setup.png" width="640" height="156" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Secondly, We set up update panels for each of the dialogues. It is important to note that the Update Panels are nested inside the dialog div. And also the GridView to display the list is also within an Update Panel. All of our update panels, UpdateMode is set as &amp;quot;Conditional&amp;quot; and ChildrenAsTriggers as &amp;quot;true&amp;quot;. So they only update when some control within them posts back and we can also trigger the update by their Update method from the server side.    &lt;br /&gt;    &lt;br /&gt;OK, now the code behind. To keep thing simple this example uses a Dictionary to store the names in the viewstate. Most of the code here is self explanatory. However I will point out the use of &amp;quot;ScriptManager.RegisterClientScriptBlock&amp;quot; to close the dialog. RegisterClientScriptBlock helps in adding javascript to be executed on asynchronous post back.     &lt;br /&gt;    &lt;br /&gt;That's pretty much it. Give me a yell if you have any questions or some suggestions.     &lt;br /&gt;    &lt;br /&gt;UPDATE: Also check out &lt;a href="http://blog.roonga.com.au/2010/05/using-jquery-ui-tabs-with-aspnet-mvc.html"&gt;Using jQuery UI Tabs with ASP.Net MVC and Ajax Form Submit&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;Happy Coding     &lt;br /&gt;    &lt;br /&gt;Ravi     &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://www.mvc101.net/samples/JQueryUiDialogDemo.zip"&gt;Download Sample Code&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-3645094122773399312?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2009/07/using-jquery-ui-dialog-with-aspnet-and.html</link><author>noreply@blogger.com (Ravi)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_5fKM6yQGlMY/Sk5tJ5IETJI/AAAAAAAAFuo/_hVI9n5V8eI/s72-c/list.png' height='72' width='72'/><thr:total>24</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-7131692036296372840</guid><pubDate>Wed, 01 Jul 2009 22:41:00 +0000</pubDate><atom:updated>2009-07-02T21:17:04.417+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Agile</category><category domain='http://www.blogger.com/atom/ns#'>SCRUM</category><title>Preparing your team for their very first Agile Scrum</title><description>If not all members of your new team have previously worked using the Agile Scrum framework, it would help to lay some groundwork. To start with, I would suggest taking your team though the concise 90 minute &lt;a href="http://www.mountaingoatsoftware.com/scrum-a-presentation"&gt;Agile scrum presentation by Mountain Goat Software&lt;/a&gt;. It is fully re-distributable and reusable.  This would be a excellent starting point for anybody brand new to Agile/Scrum.&lt;br /&gt;&lt;br /&gt;Secondly I would recommend your team to read this book "Scrum and XP from the Trenches" by Henrik Kniberg.  This is around 120 pages and nice easy read over the weekend.  The ebook version is &lt;a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches"&gt;free to download&lt;/a&gt;.  (Thank you, Henrik Kniberg).&lt;br /&gt;&lt;br /&gt;These two together will help your team to get a good grounding of the Agile Scrum framework.  But don't expect the first couple of sprints to be great! That will only come with experience.&lt;br /&gt;&lt;br /&gt;Happy Sprinting&lt;br /&gt;&lt;br /&gt;Ravi&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-7131692036296372840?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2009/07/preparing-your-team-for-their-very.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2633800223544631668.post-3746031798236549007</guid><pubDate>Thu, 25 Jun 2009 22:56:00 +0000</pubDate><atom:updated>2009-06-28T07:48:39.016+10:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Agile</category><category domain='http://www.blogger.com/atom/ns#'>SCRUM</category><title>Agile/SCRUM : Prioritise Product Back Logs</title><description>&lt;blockquote&gt;"Product Owner: Hey! I don't care in what order you want to build from the Product Backlog as long as the whole Product Backlog gets built!"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;This presents a interesting issue.  This may not be a huge problem for small projects but it shows an underlying misunderstanding in the organisations Agile adaptation.  If you do not prioritise tasks, then at what point can you go production?  According to the above Product Owner, at the end of all items in the backlog. Then the question arises why does scrum even have to be used and not the traditional waterfall methodology.&lt;br /&gt;&lt;br /&gt;In a bigger/complex project this line of thinking by the product owner will be a show stopper.  The power of scrum is in being able involve the customer at an earlier stage then when using waterfall approach.&lt;br /&gt;&lt;br /&gt;The key to be able to successfully prioritise tasks is in being able to classify backlog items into the following:&lt;br /&gt;&lt;br /&gt;1. Core Features&lt;br /&gt;2. Value Additions&lt;br /&gt;3. Nice to Haves&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Core Features&lt;/span&gt; are stuff the product needs to have in order for the customer to start using the product.  One point to remember is that a core feature my have value additions and nice to have features associated to it. And its is important to identify those as such.  For example, if you are building a web based email application, then being able to compose emails is a core feature.  So a story in your product backlog could be "Build a screen for the user to compose email and send it".  So what about spell check? Any half-decent email editor will need it. That is a good &lt;span style="font-weight:bold;"&gt;value addition&lt;/span&gt;. OK, The wire frames also talk about being able to embed YouTube videos in your email. What about be that? That is definitely a &lt;span style="font-weight:bold;"&gt;nice to have&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The customer can start using the application without the value addition and nice to have features.  So as a product owner you can assign high importance factors as follows:&lt;br /&gt;&lt;br /&gt;Compose Email  : 100 points&lt;br /&gt;Spell Check : 75 points&lt;br /&gt;Embed Video: 45 points&lt;br /&gt;&lt;br /&gt;This helps the scrum team to build the core features first and then come back for the other features.  This also means the product is going to be production usable earlier.  It might not have all the cool features, but hey, is works!  We cannot stress strong enough how important it is to get a working product in the hands of the customer as soon as possible.  The enables the customer to give us the best possible feedback. And this in turn enables us to re-organise our priorities for future releases.&lt;br /&gt;&lt;br /&gt;So get your Product Owner to spend the time required to prioritise the tasks properly.  It is a crucial step in implementing scrum.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Happy Sprinting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2633800223544631668-3746031798236549007?l=blog.roonga.com.au' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.roonga.com.au/2009/06/agilescrum-if-product-owner-does-not.html</link><author>noreply@blogger.com (Ravi)</author><thr:total>0</thr:total></item></channel></rss>