<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TechBubble &#187; ASP.NET</title>
	<atom:link href="http://www.kalyani.com/tag/aspnet/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kalyani.com</link>
	<description>Nik Kalyani&#039;s Irrationally Exuberant Musings on Technology</description>
	<lastBuildDate>Mon, 23 Jan 2012 08:16:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Redirecting to Canonical URL in IIS7</title>
		<link>http://www.kalyani.com/2010/01/redirecting-to-canonical-url-in-iis7/</link>
		<comments>http://www.kalyani.com/2010/01/redirecting-to-canonical-url-in-iis7/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 04:42:50 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://kalyani.com/?p=1072</guid>
		<description><![CDATA[If you are using IIS7, it&#8217;s very easy to ensure that all requests always go to your preferred canonical URL. It&#8217;s a two step process: Step 1: Install the UrlRewrite module for IIS: http://www.iis.net/expand/URLRewrite Step 2: Add the following rule to your applications web.config file: &#38;lt;configuration&#38;gt; &#38;lt;system.webServer&#38;gt; &#38;lt;rewrite&#38;gt; &#38;lt;rules&#38;gt; &#38;lt;clear /&#38;gt; &#38;lt;rule name=&#38;quot;Redirect from www&#38;quot; <a href='http://www.kalyani.com/2010/01/redirecting-to-canonical-url-in-iis7/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">If you are using IIS7, it&#8217;s very easy to ensure that all requests always go to your preferred canonical URL. It&#8217;s a two step process:</p>
<p style="text-align: left;"><strong>Step 1:</strong> Install the UrlRewrite module for IIS: <a href="http://www.iis.net/expand/URLRewrite" target="_blank">http://www.iis.net/expand/URLRewrite</a><a href="http://www.iis.net/expand/URLRewrite"><img class="size-full wp-image-1074 aligncenter" style="border: 0pt none; margin-top: 10px; margin-bottom: 10px;" title="IIS Rewrite" src="http://kalyani.com/wp-content/uploads/2010/01/iisrewrite.png" alt="IIS Rewrite" width="335" height="251" /></a></p>
<p><strong>Step 2:</strong> Add the following rule to your applications web.config file:</p>
<pre class="brush: xml">&amp;lt;configuration&amp;gt;
 &amp;lt;system.webServer&amp;gt;
    &amp;lt;rewrite&amp;gt;
      &amp;lt;rules&amp;gt;
        &amp;lt;clear /&amp;gt;
        &amp;lt;rule name=&amp;quot;Redirect from www&amp;quot; stopProcessing=&amp;quot;true&amp;quot;&amp;gt;
           &amp;lt;match url=&amp;quot;.*&amp;quot; /&amp;gt;
           &amp;lt;conditions&amp;gt;
              &amp;lt;add input=&amp;quot;{HTTP_HOST}&amp;quot; pattern=&amp;quot;^www.yoursite.com$&amp;quot; /&amp;gt;
           &amp;lt;/conditions&amp;gt;
           &amp;lt;action type=&amp;quot;Redirect&amp;quot; url=&amp;quot;http://yoursite.com/{R:0}&amp;quot; redirectType=&amp;quot;Permanent&amp;quot; /&amp;gt;
        &amp;lt;/rule&amp;gt;
     &amp;lt;/rules&amp;gt;
   &amp;lt;/rewrite&amp;gt;
 &amp;lt;/system.webServer&amp;gt;
&amp;lt;/configuration&amp;gt;</pre>
<p><strong>IMPORTANT: </strong>When using the above code, take care to merge it with your existing web.config without duplicating any existing elements.</p>
<p>I like my URL&#8217;s to be in the format http://mysite.com. If you prefer http://www.mysite.com, simply remove &#8220;www.&#8221; from the &lt;add&gt; element and add it to the &lt;action&gt; element&#8217;s &#8220;url&#8221; attribute.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2010/01/redirecting-to-canonical-url-in-iis7/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Customer-driven Business Innovation with DotNetNuke</title>
		<link>http://www.kalyani.com/2009/08/customer-driven-business-innovation-with-dotnetnuke/</link>
		<comments>http://www.kalyani.com/2009/08/customer-driven-business-innovation-with-dotnetnuke/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 00:37:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/222/Customer-driven-Business-Innovation-with-DotNetNuke.aspx</guid>
		<description><![CDATA[In an increasingly hyper-competitive world, businesses look for every possible opportunity that can give them an edge over their competition. It’s no secret &#8212; businesses that innovate survive and win, and those that don’t either die, don’t grow or become the walking dead. But innovation isn’t easy. In fact, it is a challenge for most <a href='http://www.kalyani.com/2009/08/customer-driven-business-innovation-with-dotnetnuke/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">
<p style="text-align: left;">In an increasingly hyper-competitive world, businesses look for every possible opportunity that can give them an edge over their competition. It’s no secret &#8212; businesses that <cite>innovate</cite> survive and win, and those that don’t either die, don’t grow or become the walking dead.</p>
<p>But innovation isn’t easy. In fact, it is a challenge for most companies. There are many reasons for this – corporate culture, inertia, risk-aversion – but I think the biggest reason is “expertise.” The quote I have on my desktop wallpaper sums it up nicely:</p>
<p><strong><span style="font-size: larger;"><em>“In the beginner’s mind there are many possibilities, in the expert’s mind there are few.” </em></span></strong></p>
<p><span style="font-size: larger;"><em>– Shunryu Suzuki</em></span></p>
<p>I have this quote on my desktop because it’s a constant reminder that as I become more familiar with a technology or business skill, my ability to come up with innovative ideas about that technology or business area decreases. This is my totally unscientific thesis at a personal level; your experience may differ, but I suspect not by much. Since businesses are primarily just people doing stuff, the corollary is that businesses face the same issue – dearth of innovation due to expertise.</p>
<p>So if a business can’t look internally to its employees, where should it look for those innovative ideas that will propel it to the next level? (NO, the answer is definitely not consultants.) The best source of innovative ideas for your business is your <strong>customers</strong> and the best place to engage them for these ideas is <strong>online</strong>.</p>
<p><a href="http://kalyani.com/wp-content/uploads/2009/08/onlinecustomerequation.png"><img class="alignnone size-full wp-image-873" title="onlinecustomerequation" src="http://kalyani.com/wp-content/uploads/2009/08/onlinecustomerequation.png" alt="" width="450" height="117" /></a></p>
<p>Many companies have discovered that the same concepts that work amazingly well on a personal and social level with FaceBook and MySpace, work equally well for business (albeit without any sheep being thrown about in the process). Creating an online community for your business is an effective way to engage your customers online and provide a direct channel to them, bereft of the hierarchical and departmental boundaries that stifle discussion and open dialog offline. This should not come as a surprise, after all “people want to connect with people; people want to help and be helped” (Study: <a href="http://www.slideshare.net/fgossieaux/2008-tribalization-of-business-study-447040" target="_blank">Tribalization of Business</a>). Chances are that if you follow some basic guidelines, you can very quickly and easily engage your customers and make innovation an open and collaborative process.</p>
<p><a href="http://kalyani.com/wp-content/uploads/2009/08/IdeaNetwork.jpg"><img class="alignnone size-full wp-image-874" title="IdeaNetwork" src="http://kalyani.com/wp-content/uploads/2009/08/IdeaNetwork.jpg" alt="" width="450" height="424" /></a></p>
<p>One company that has been successful in creating such an online customer community is <a href="http://www.exacttarget.com" target="_blank">ExactTarget</a>. The company has been a long-time sponsor of the DotNetNuke project (thanks!). The “3sixty”<cite> community</cite> site it created for its customers using <a href="http://www.dotnetnuke.com/Products/ProfessionalEdition/tabid/1209/Default.aspx" target="_blank">DotNetNuke Professional Edition</a> is a prime example of best practices for creating online communities recommended by <a href="http://www.hivelive.com" target="_blank">HiveLive</a>, a SAAS provider of enterprise online customer communities. Since 3sixty was created, the site has become a key competitive differentiator for <cite>ExactTarget</cite> resulting in over 100 customer-suggested feature innovations into its product. You can get the straight scoop on how ExactTarget achieved this by attending the free webinar “<a href="http://www.dotnetnuke.com/Products/Webinars.aspx">ExactTarget: Using DotNetNuke to Build an Interactive Business Community</a>” on Aug. 26, 2009 (download a recording of the video by following the link if you are reading this after Aug. 26).<img src="http://kalyani.com/wp-content/uploads/2009/08/ET3sixty.png" border="0" alt="ExactTarget 3sixty" hspace="10" vspace="10" width="159" height="124" align="right" /></p>
<p>While ExactTarget could have developed a custom ASP.NET solution for this site, it selected <cite>DotNetNuke</cite> because of its ability to easily integrate with existing web-based business applications while providing a robust platform for rapid application development. Let me stop myself right here and not get carried away discussing the merits of DotNetNuke as an excellent platform for building online communities. It is very tempting to look at creating such communities as a technology problem and delve into a discussion about features, API’s and such. But as <a href="http://blogs.zdnet.com/bio.php?id=hinchcliffe" target="_blank">Dion Hinchcliffe</a> accurately points out in <a href="http://blogs.zdnet.com/Hinchcliffe/?p=190" target="_blank">Twelve Best Practices for Online Customer Communities</a>, “community is mostly not a technology problem.” Indeed, as he points out, platforms like DotNetNuke make it easy to create compelling communities. (If you are reading this on <a href="http://www.dotnetnuke.com" target="_blank">DotNetNuke.com</a>, you are looking at the best evidence to support this claim.) Creating successful online business communities is more an exercise in adapting your business to a new form of customer engagement and creating the social architecture for such a community.</p>
<p>In order to succeed, here is a summation of HiveLive’s recommendations:</p>
<table border="0" cellspacing="0" cellpadding="10">
<tbody>
<tr>
<td align="center" valign="top"><img src="http://kalyani.com/wp-content/uploads/2009/08/ClearGoals.png" border="0" alt="Clear Goals" /></td>
<td align="left" valign="top"><span class="Head">Best Practice #1: Build a community with clear goals in mind</span></p>
<p>Start with a narrow and tightly defined scope and develop the community structure from there. This is essential for rallying members and motivating them to contribute. Be prepared to expand the scope quickly as the community evolves.</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="10">
<tbody>
<tr>
<td align="left" valign="top"><span class="Head">Best Practice #2: Motivate your members</span></p>
<p>Online community members are power users, participants or spectators. Explore ways to keep power users engaged to ensure a steady stream of relevant and authentic content. This in turn will motivate others to play a more active role. Also, think of ways in which you can compensate participants. Compensation, does not have to be monetary – insider status, avatars, recognition, they all work.</td>
<td align="center" valign="top"><img src="http://kalyani.com/wp-content/uploads/2009/08/TightScope.png" border="0" alt="Tight Scope" /></td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="10">
<tbody>
<tr>
<td align="center" valign="top"><img src="http://kalyani.com/wp-content/uploads/2009/08/DesignThinking.png" border="0" alt="Design Thinking" /></td>
<td align="left" valign="top"><span class="Head">Best Practice #3: Use Design Thinking Principles</span></p>
<p><a href="http://en.wikipedia.org/wiki/Design_thinking" target="_blank">Design Thinking</a> is a process for practical, creative resolution of problems or issues that looks for an improved future result. Using this approach can establish ground rules and foster a culture of crowd-sourced innovation in an online community.</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="10">
<tbody>
<tr>
<td align="left" valign="top"><span class="Head">Best Practice #4: Build a Culture of Openness</span></p>
<p>Direct engagement through genuine interactions will yield significant benefits and convince more members to participate in the innovation process. Don’t try to control the conversation, listen more than you talk, and make sure the culture of openness is not just a façade. Although painful at first, such a culture is critical to the success of an online community.</td>
<td align="center" valign="top"><img src="http://kalyani.com/wp-content/uploads/2009/08/OpenCulture.png" border="0" alt="Open Culture" /></td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="10">
<tbody>
<tr>
<td align="center" valign="top"><img src="http://kalyani.com/wp-content/uploads/2009/08/ContinuousImprovement.png" border="0" alt="Continuous Improvement" /></td>
<td align="left" valign="top"><span class="Head">Best Practice #5: Remain Dedicated to Continuous Improvement</span></p>
<p>View your online community as a journey, instead of a technology initiative with a defined end-point. Committing to a posture of cultivation will yield tangible results in the form of a steady flow of innovative ideas from the community. This also builds trust and gives members a greater sense of ownership as their ideas and suggestions are realized.</td>
</tr>
</tbody>
</table>
<p>Has your company created an online business community? Do share! What were the challenges you faced? What did you learn from the experience?</p>
<p>If you have not created an online business community yet, hopefully this post and the <a href="http://www.dotnetnuke.com/products/webinars.aspx">webinar</a> will give you some ideas that will help guide you in the process.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2009/08/customer-driven-business-innovation-with-dotnetnuke/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enabling a Pre-existing Project as a WebRole in Azure Solution</title>
		<link>http://www.kalyani.com/2008/11/enabling-a-pre-existing-project-as-a-webrole-in-azure-solution/</link>
		<comments>http://www.kalyani.com/2008/11/enabling-a-pre-existing-project-as-a-webrole-in-azure-solution/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Azure]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/213/Enabling-a-Pre-existing-Project-as-a-WebRole-in-Azure-Solution.aspx</guid>
		<description><![CDATA[In trying to use an existing VS2008 Project as a WebRole in a Windows Azure Solution, I discovered that the project did not appear as a candidate for selection from the Roles &#62; Add &#62; Web Role Project in solution menu. All the Azure documentation indicates that there is no special requirement for a web <a href='http://www.kalyani.com/2008/11/enabling-a-pre-existing-project-as-a-webrole-in-azure-solution/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>In trying to use an existing VS2008 Project as a WebRole in a Windows Azure Solution, I discovered that the project did not appear as a candidate for selection from the Roles &gt; Add &gt; Web Role Project in solution menu. All the Azure documentation indicates that there is no special requirement for a web project to be a candidate for Azure, so I found this to be odd. The solution, as it turns out, is pretty simple:</p>
<p>1) Open the existing project&#8217;s .csproj file in a text editor.</p>
<p>2) Add the following two lines of code anywhere within the first  element:</p>
<p><span style="font-family: Courier New; color: #0000ff;"> Web<br />
$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\<cite>Microsoft</cite> SDKs\ServiceHosting\v1.0@InstallPath)</span></p>
<p>Reload the project and it now becomes available as a WebRole.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2008/11/enabling-a-pre-existing-project-as-a-webrole-in-azure-solution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Updating ASP.NET Assemblies</title>
		<link>http://www.kalyani.com/2008/08/updating-asp-net-assemblies/</link>
		<comments>http://www.kalyani.com/2008/08/updating-asp-net-assemblies/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/207/Updating-ASP-NET-Assemblies.aspx</guid>
		<description><![CDATA[I posted a comment on Rick Strahl&#8217;s post on Server Errors when updating live Web applications online about a technique to update assemblies of live apps. I use the following approach: 1) I only keep the assemblies unlikely to change in bin (i.e. components, third-party libs etc.). I put my app&#8217;s assemblies into a sub-folder <a href='http://www.kalyani.com/2008/08/updating-asp-net-assemblies/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>I posted a comment on Rick Strahl&#8217;s post on <a href="http://west-wind.com/Weblog/posts/449761.aspx">Server Errors when updating live Web applications online</a> about a technique to update assemblies of live apps. I use the following approach:</p>
<p>1) I only keep the<br />
assemblies unlikely to change in bin (i.e. components, third-party libs<br />
etc.). I put my app&#8217;s assemblies into a sub-folder of bin and name the<br />
folder according to the date (for example: bin\20080801)</p>
<p>2) My web.config has the following:</p>
<p><runtime><br />  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><br /> 
<probing privatePath="bin;bin\20080801;" />  </assemblyBinding><br /></runtime></p>
<p>When<br />
I need to update assemblies, I just upload them into a new sub-folder<br />
in bin, again with a name corresponding to the current date<br />
(bin\20080812). After the upload is complete, I upload web.config with<br />
a change to the sub-folder name. The app re-starts and picks up the new<br />
assemblies and forgets about the old sub-folder assemblies which I can<br />
leave or delete.</p>
<p>Seems to work and has the added benefit of speeding up the app start since the sub-folder assemblies are ignored until needed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2008/08/updating-asp-net-assemblies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exploring New Things</title>
		<link>http://www.kalyani.com/2008/08/exploring-new-things/</link>
		<comments>http://www.kalyani.com/2008/08/exploring-new-things/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/208/Exploring-New-Things.aspx</guid>
		<description><![CDATA[Last month, a few days before my birthday, I decided that I needed to acquire some new skills and do some new things, while broadening my knowledge of things I already know (i.e. software development). More importantly, I wanted to not spend as much time in front of the computer. Instead of posting about it <a href='http://www.kalyani.com/2008/08/exploring-new-things/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Last month, a few days before my birthday, I decided that I needed to acquire some new skills and do some new things, while broadening my knowledge of things I already know (i.e. software development). More importantly, I wanted to not spend as much time in front of the computer. Instead of posting about it and then hoping to follow through, I decided to do the opposite. I started the process and am now happy to report that I have made good progress in five areas:</p>
<p><strong>1) Building Stuff</strong>: I love working with tools and making things. My first project was to build a swing set for my daughters. I got lumber from Lowe&#8217;s and built one from scratch. My kids love it and it&#8217;s great not having to drive down to the playground every day.</p>
<p>My second project is to build <a href="http://www.seattleoil.com/Flyers/Earthbox.pdf">earth boxes</a>, five to be precise. <cite>Savi</cite> wants to grow vegetables and the earth boxes are the perfect solution. It&#8217;s labor intensive to build one, but not very difficult. I have completed one and am working on the rest.</p>
<p><strong>2) Baking</strong>: I love bread but rarely find bread I like at the store. Solution &#8212; bake my own. <cite>Savi</cite> got me a bread-maker for my birthday and I love it. So far I have baked a loaf of plain, white bread and yesterday, I baked a walnut-raisin loaf. I am not much of a cook and making eggs is the extent of my culinary expertise. But after baking this bread, I am beginning to see why so many people love to cook. It is quite relaxing and to have an end product that family and friends can enjoy is quite rewarding.</p>
<p><strong>3) Mixing:</strong> As I have mentioned on this blog before, I am an avid fan of A/V. Until about 2003, one of my favorite things to do was to V.J. parties and weddings for friends. I never did it for money as then it would become work and stop being fun. After moving to <cite>DC</cite> in 2003, I never did any gigs until last week. Friday (8/8/08), my friends Todd and Diana got married in Napa. My daughter <cite>Gia</cite> was the flower girl and I had the honor of providing the entertainment for the wedding. Since I did not want to abandon the wife and kids during the reception, I did something novel (for me) &#8212; I created a video mix on DVD for the entire evening&#8217;s entertainment. Everything from the bride/groom dances to the various dance sets were all on DVD and all I had to do was press Play. I used an 80&#8242;s theme and mixed lots of music videos from the decade along with an intro scene from &#8220;Back to the Future,&#8221; Todd&#8217;s favorite movie. I enjoyed making the mix so much, that I am now motivated to create more DVD mixes of my kids photos/videos for family back in India.</p>
<p><strong>4) Software:</strong> This item is more about broadening my skills beyond <cite>ASP.Net</cite> and DotNetNuke. I have been an avid fan of <cite>Google</cite> AppEngine since the day it went live. Since I had no prior knowledge of Python or Django, I had to come up to speed fast. I attended a few meet-ups at <cite>Google</cite> and picked-up a copy of <a href="http://www.amazon.com/Python-Power-Comprehensive-Guide/dp/1598631586/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1218594487&#038;sr=8-1">Python Power</a>. Between the book and the meet-ups and just tinkering with code, I now have progressed far enough to create fairly advanced apps on AppEngine in Python. I plan on continuing to learn more advanced concepts and focus on developing a single application that will also be the basis of my AppEngine presentation at the <a href="http://www.sdc.nl/Default.aspx?tabid=71&#038;language=en-US"><cite>DotNetNuke</cite> <cite>OpenForce</cite> / SDN Conference</a> in Amsterdam this October. More about this application in a future post.</p>
<p><strong>5) Teaching:</strong> I love to teach kids. It doesn&#8217;t matter what the subject matter is, it&#8217;s just fun to be able to share and help them learn. This summer, I have undertaken to teach my 12-year-old nephew how to program, continuing indefinitely. After researching the topic, I settled on <a href="http://phrogram.com/Default.aspx">Phrogram</a> as the language to use for instruction. So far, I am quite impressed with everything about the IDE and the language. I setup a virtual machine, put it on a DVD and mailed it to him (he is not allowed to use the Internet other than for class assignments). He was able to install VPC, get the virtual machine up and running and write his first Phrogram. I will have some detailed blog posts about my experience on this in the near future also.</p>
<p>Yes, it&#8217;s true that three of the five things require time in front of the computer. But they still represent a shift and have helped me achieve my goals.</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2008/08/exploring-new-things/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MVP Award</title>
		<link>http://www.kalyani.com/2008/04/mvp-award/</link>
		<comments>http://www.kalyani.com/2008/04/mvp-award/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/201/MVP-Award.aspx</guid>
		<description><![CDATA[Got word today that I have received the Microsoft MVP Award for the third time. Of course it is April 1, so it could all be a big joke. I am hoping not. Dear Nik Kalyani,   Congratulations! We are pleased to present you with the 2008 Microsoft® MVP Award! The MVP Award is our <a href='http://www.kalyani.com/2008/04/mvp-award/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Got word today that I have received the <cite>Microsoft</cite> <cite>MVP</cite> Award for the third time. Of course it is April 1, so it could all be a big joke. I am hoping not. </p>
<p><i>Dear Nik Kalyani,  </p>
<p>Congratulations! We are pleased to present you with the 2008<br />
Microsoft® <cite>MVP</cite> Award! The <cite>MVP</cite> Award is our way to say thank you for<br />
promoting the spirit of community and improving people’s lives and the<br />
industry’s success every day. We appreciate your extraordinary efforts<br />
in ASP/<cite>ASP.NET</cite> technical communities during the past year&#8230;</p>
<p></i>I am honored. Thanks Microsoft.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2008/04/mvp-award/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DotNetKicks: Digg for .NET Developers</title>
		<link>http://www.kalyani.com/2008/01/dotnetkicks-digg-for-net-developers/</link>
		<comments>http://www.kalyani.com/2008/01/dotnetkicks-digg-for-net-developers/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/189/DotNetKicks-Digg-for-NET-Developers.aspx</guid>
		<description><![CDATA[DotNetKicks is a Digg-like site focused on .NET development. Thanks for Jon Galloway&#8217;s useful tip, I figured out how to add a dynamic Kick image to my posts. He has Javascript code, but I just hard-coded the following into the DasBlog itemTemplate.blogTemplate file for the theme in use: &#160;I have not figured out how to <a href='http://www.kalyani.com/2008/01/dotnetkicks-digg-for-net-developers/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dotnetkicks.com">DotNetKicks</a> is a Digg-like site focused on .NET development. Thanks for <a href="http://weblogs.asp.net/jgalloway/archive/2007/03/08/adding-a-dotnetkicks-image-via-javascript.aspx">Jon Galloway&#8217;s useful tip</a>, I figured out how to add a dynamic Kick image to my posts. He has <cite>Javascript</cite> code, but I just hard-coded the following into the <cite>DasBlog</cite> itemTemplate.blogTemplate file for the theme in use:</p>
<p><font color="#0000ff"><a href="http://www.dotnetkicks.com/kick/?url=<%PermalinkUrl%>&#8220;><img align="absmiddle" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=<%PermalinkUrl%>&#8220;></a>&nbsp;<br /></font><br />I have not figured out how to dynamically make the link appear only when a specific category such as .NET is selected, but this is good for now.</p>
<p>Of course, this is of no use if I don&#8217;t post anything worth kicking. <img src='http://www.kalyani.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2008/01/dotnetkicks-digg-for-net-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>InfoWorld Rates DotNetNuke &#8220;Very Good&#8221;</title>
		<link>http://www.kalyani.com/2007/10/infoworld-rates-dotnetnuke-very-good/</link>
		<comments>http://www.kalyani.com/2007/10/infoworld-rates-dotnetnuke-very-good/#comments</comments>
		<pubDate>Wed, 17 Oct 2007 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/180/InfoWorld-Rates-DotNetNuke-Very-Good.aspx</guid>
		<description><![CDATA[InfoWorld&#8217;s recent comparison of Open Source web CMS systems gave DotNetNuke high marks with a &#8220;Very Good&#8221; rating. DotNetNuke was the only ASP.NET-based contender in the field of five. We are working hard on many exciting new enhancements and it won&#8217;t be long before we will bridge the gap from &#8220;Very Good&#8221; to &#8220;Excellent.&#8221; You <a href='http://www.kalyani.com/2007/10/infoworld-rates-dotnetnuke-very-good/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>InfoWorld&#8217;s recent comparison of <cite>Open Source</cite> web CMS systems gave <cite>DotNetNuke</cite> high marks with a &#8220;Very Good&#8221; rating. <cite>DotNetNuke</cite> was the only ASP.NET-based contender in the field of five. We are working hard on many exciting new enhancements and it won&#8217;t be long before we will bridge the gap from &#8220;Very Good&#8221; to &#8220;Excellent.&#8221; </p>
<p>You can <a target="_new" href="http://www.infoworld.com/article/07/10/08/41TC-open-source-cms_1.html">see the report</a> on which this comparison table is based:<br /> </p>
<p><!--[if !excel]>  <![endif]--><br />
<!--The following information was generated by <cite>Microsoft</cite> Office Excel&#8217;s Publish<br />
as Web Page wizard.&#8211;><br />
<!--If the same item is republished from Excel, all information between the DIV<br />
tags will be replaced.--><br />
<!-----------------------------><br />
<!--START OF OUTPUT FROM EXCEL PUBLISH AS WEB PAGE WIZARD --></p>
<p><!-----------------------------></p>
<div id="CMS Comparison_6025" x:publishsource="Excel" align="center">
<table class="xl655356025" style="border-collapse: collapse; table-layout: fixed; width: 511pt;" border="0" cellpadding="0" cellspacing="0" width="678">
<col class="xl656025" style="width: 96pt;" width="128">
<col class="xl636025" style="width: 83pt;" span="5" width="110">
<tbody>
<tr class="xl666025" style="height: 47.25pt;" height="63">
<td class="xl1006025" style="height: 47.25pt; width: 96pt;" height="63" width="128"><a name="RANGE!A1:F22"> </a></td>
<td class="xl1016025" style="border-left: medium none; width: 83pt;" width="110">DotNetNuke</td>
<td class="xl1026025" style="border-left: medium none; width: 83pt;" width="110">Alfresco<br />
  Community Edition</td>
<td class="xl1026025" style="border-left: medium none; width: 83pt;" width="110">Drupal</td>
<td class="xl1026025" style="border-left: medium none; width: 83pt;" width="110">Plone</td>
<td class="xl1036025" style="border-left: medium none; width: 83pt;" width="110">Joomla</td>
</tr>
<tr class="xl646025" style="height: 15pt;" height="20">
<td class="xl676025" style="border-top: medium none; height: 15pt;" height="20">Version</td>
<td class="xl686025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">4.4.5</td>
<td class="xl696025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">2.1</td>
<td class="xl696025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">5.2</td>
<td class="xl696025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">3.0</td>
<td class="xl706025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">1.0.13</td>
</tr>
<tr style="height: 24pt;" height="32">
<td class="xl716025" style="border-top: medium none; height: 24pt;" height="32">Publisher</td>
<td class="xl726025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"><cite>DotNetNuke</cite> Corporation</td>
<td class="xl736025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Alfresco Software</td>
<td class="xl736025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Drupal</td>
<td class="xl736025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Plone Foundation</td>
<td class="xl746025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"><cite>Open Source</cite> Matters</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl716025" style="border-top: medium none; height: 15pt;" height="20"> </td>
<td class="xl726025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl736025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl736025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl736025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl746025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl756025" style="border-top: medium none; height: 15pt;" height="20">Rating</td>
<td class="xl766025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Very Good</td>
<td class="xl776025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Excellent</td>
<td class="xl776025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Very Good</td>
<td class="xl776025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Very Good</td>
<td class="xl786025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Very Good</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl716025" style="border-top: medium none; height: 15pt;" height="20"> </td>
<td class="xl796025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl816025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl826025" style="border-top: medium none; height: 15pt;" height="20">Criteria<br />
  (weight)</td>
<td class="xl836025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl846025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl846025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl846025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl856025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl826025" style="border-top: medium none; height: 15pt;" height="20">Ease-of-use<br />
  (25%)</td>
<td class="xl866025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl886025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl826025" style="border-top: medium none; height: 15pt;" height="20">Features<br />
  (25%)</td>
<td class="xl866025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">10</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl886025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl826025" style="border-top: medium none; height: 15pt;" height="20">Security<br />
  (15%)</td>
<td class="xl866025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl886025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl826025" style="border-top: medium none; height: 15pt;" height="20">Scalability<br />
  (15%)</td>
<td class="xl866025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl886025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl826025" style="border-top: medium none; height: 15pt;" height="20">Management<br />
  (10%)</td>
<td class="xl866025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl876025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl886025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
</tr>
<tr style="height: 15.75pt;" height="21">
<td class="xl896025" style="border-top: medium none; height: 15.75pt;" height="21">Value<br />
  (10%)</td>
<td class="xl906025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">8</td>
<td class="xl916025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl916025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl916025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
<td class="xl926025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">9</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl826025" style="height: 15pt;" height="20">Score</td>
<td class="xl936025" style="border-left: medium none; width: 83pt;" width="110">8.4</td>
<td class="xl946025" style="border-left: medium none; width: 83pt;" width="110">9.2</td>
<td class="xl946025" style="border-left: medium none; width: 83pt;" width="110">8.3</td>
<td class="xl946025" style="border-left: medium none; width: 83pt;" width="110">8.6</td>
<td class="xl956025" style="border-left: medium none; width: 83pt;" width="110">8.4</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl716025" style="border-top: medium none; height: 15pt;" height="20"> </td>
<td class="xl796025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl816025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl716025" style="border-top: medium none; height: 15pt;" height="20">Cost</td>
<td class="xl796025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">FREE</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">FREE</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">FREE</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">FREE</td>
<td class="xl816025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">FREE</td>
</tr>
<tr style="height: 24pt;" height="32">
<td class="xl716025" style="border-top: medium none; height: 24pt;" height="32">License</td>
<td class="xl796025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">BSD-style license</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">GPL 2 with FLOSS exception</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">GPL</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">GPL</td>
<td class="xl816025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">GPL</td>
</tr>
<tr style="height: 72pt;" height="96">
<td class="xl716025" style="border-top: medium none; height: 72pt;" height="96">Platforms</td>
<td class="xl796025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">ASP.NET, Windows Server, SQL Server 2005</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Windows and Linux</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Apache or IIS Web servers; Unix, Linux, BSD, Solaris, Windows or<br />
  Mac OS X; PHP; PHP-supported database server (MySQL or PostgresSQL)</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Windows, Mac OS X, BSD, Solaris and SuSE</td>
<td class="xl816025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Apache, PHP, MySQL</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl716025" style="border-top: medium none; height: 15pt;" height="20">Support</td>
<td class="xl796025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl816025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl716025" style="border-top: medium none; height: 15pt;" height="20">Website</td>
<td class="xl796025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">dotnetnuke.com</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">alfresco.com</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">drupal.org</td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">plone.org</td>
<td class="xl816025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">joomla.org</td>
</tr>
<tr style="height: 15pt;" height="20">
<td class="xl716025" style="border-top: medium none; height: 15pt;" height="20"> </td>
<td class="xl796025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl806025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
<td class="xl816025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110"> </td>
</tr>
<tr style="height: 387.75pt;" height="517">
<td class="xl966025" style="border-top: medium none; height: 387.75pt;" height="517">Bottom<br />
  Line</td>
<td class="xl976025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Written in VB.Net, <cite>DotNetNuke</cite> is an extensible content management<br />
  system suitable for intranets, extranets, and public Web sites. The core<br />
  distribution includes three dozen CMS modules, including a skin system (based<br />
  on simple templates) that separates design from content, personalization, and<br />
  search; other modules range from e-commerce systems and photo galleries to<br />
  blogs, forums, and wikis. Commercial publishers offer other components.</td>
<td class="xl986025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">This very inclusive offering, developed using Java, sits on top<br />
  of a JSR-170 content repository. Out of the box Alfresco provides a Web<br />
  <cite>portal</cite> framework; CIFS (file share) interface that works on Windows and Linux<br />
  clients; and a Web-content management system –- plus document, imagine, and<br />
  records management. Further, Alfresco scales well with options for deploying<br />
  content to multiple servers.</td>
<td class="xl986025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Written in PHP, Drupal&#8217;s Web application framework anchors a<br />
  content management system that includes modules for e-commerce and workflow.<br />
  Drupal, unlike other systems, also has a taxonomy system to classify content<br />
  – but this does take extra work to configure (as does setup). Themes are<br />
  created with the standard PHPTemplate engine. A blogging system makes this<br />
  system good for building online communities.</td>
<td class="xl986025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">The Plone CMS, which is built on top of the Zope application<br />
  server, performs well for intranets – as well as a document management server<br />
  and team collaboration tool. The system is easy to use and also notable for<br />
  its multi-lingual capabilities. Additionally, Plone powers a number of<br />
  high-traffic Internet sites, though this configuration should included<br />
  additional components, such as Squid caching.<span style=""> </span></td>
<td class="xl996025" style="border-top: medium none; border-left: medium none; width: 83pt;" width="110">Joomla, written with PHP and back-ended by a MySQL database, is<br />
  appropriate for external Web sites and intranets. The system&#8217;s caching<br />
  provides good performance on higher-volume sites while various extensions<br />
  cover essential CMS functions; these plug-ins include news, blogs, polls,<br />
  search, and internationalization. To further expand functionality, such as<br />
  site backup, both free and commercial components are readily available.
    </td>
</tr>
<p> <!--[if supportMisalignedColumns]--></p>
<tr style="display: none;" height="0">
<td style="width: 96pt;" width="128"></td>
<td style="width: 83pt;" width="110"></td>
<td style="width: 83pt;" width="110"></td>
<td style="width: 83pt;" width="110"></td>
<td style="width: 83pt;" width="110"></td>
<td style="width: 83pt;" width="110"></td>
</tr>
<p> <!--[endif]--><br />
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2007/10/infoworld-rates-dotnetnuke-very-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Evolution of Web UI Components</title>
		<link>http://www.kalyani.com/2007/09/the-evolution-of-web-ui-components/</link>
		<comments>http://www.kalyani.com/2007/09/the-evolution-of-web-ui-components/#comments</comments>
		<pubDate>Sun, 02 Sep 2007 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/175/The-Evolution-of-Web-UI-Components.aspx</guid>
		<description><![CDATA[Several months after the official release of Microsoft&#8217;s ASP.NET AJAX, I am still waiting to be amazed by slick web components from Redmond that make it possible to create rich, interactive user interfaces without third-party component suites. From the looks of it, my wait is not going to end anytime soon. With all the attention Microsoft is <a href='http://www.kalyani.com/2007/09/the-evolution-of-web-ui-components/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Several months after the official release of Microsoft&#8217;s <cite>ASP.NET</cite> AJAX, I am still waiting to be amazed by slick web components from Redmond that make it possible to create rich, interactive user interfaces without third-party component suites. From the looks of it, my wait is not going to end anytime soon. With all the attention <cite>Microsoft</cite> is showering on Silverlight, it is now obvious that the component aspect of its AJAX solution has been and will continue to be a step-child. The message is clear &#8212; if you want to make your apps more responsive with fewer postbacks, use AJAX; if you want to create graphically rich user interfaces without spending a lot of time, use Silverlight; if you want to create graphically rich user interfaces that are also usable, keep looking. </p>
<p>Seriously, what is the ASP.NET team thinking? Is the crap officially named <a href="http://asp.net/AJAX/Control-Toolkit/Live/Default.aspx"><cite>ASP.NET</cite> AJAX Control Toolkit</a> the best <cite>Microsoft</cite> can do? With a handful of exceptions, these components are a joke. They are ugly, clunky and lack consistency in their usability. What is the deal? Are there no designers or usability engineers in the company that can help the <cite>ASP.NET</cite> team fix this garbage?</p>
<p>In all fairness, I should not single out Microsoft. This problem occurs more or less across the board. Every major AJAX framework is so heavily focused on the technology, that usability and elegance are after-thoughts. DOJO and YUI have the exact same problem at varying levels. Excellent frameworks&#8230;mediocre components.</p>
<p>If you want slick components, you have only one choice &#8211; break out the wallet and check in with Telerik, ComponentArt or Infragistics, or write them yourself.</p>
<p>Crappy components are just one small aspect of the problem as I see it. There is a much, much bigger problem &#8212; each of these free (and commercial) frameworks is guilty of delivering a solution that puts the responsibility on developers to work out the appearance and overall user experience of an app that makes use of its components. Let me repeat that&#8230;the responsibility for appearance and user experience is placed on DEVELOPERS. </p>
<p>Take those alluringly elegant components from Telerik and ComponentArt, put them into the hands of your average <cite>ASP.NET</cite> developer, and what do you have &#8212; disaster. Why? Because there is nothing that makes it easy for a developer to:</p>
<ol>
<li>Determine in which situations it is appropriate to use a certain component</li>
<li>Make multiple components work together so the user experience is fluid</li>
<li>Style components so they have a consistent appearance, different from the shipping default</li>
<li>Interchange or mix in the same app, components from different vendors without going insane</li>
</ol>
<p>It seems to me that components are not the solution, they are the problem. Ever since Visual Basic 1.0 gave developers the means to easily drag all manner of UI widgets onto a canvas, we have been stuck with this problem of horrible user interfaces. And no one has fixed it. Now, don&#8217;t be telling me about Silverlight or Flex or RIA. They all are stuck in the same evolutionary rut. All they are doing is swapping out the what and the where; the how remains unchanged. </p>
<p>There are enough desktop and web applications out now where it should be possible for us to evolve past UI components and isolate and identify UI patterns that can then be used to create &#8220;UI Pattern Panels&#8221; that snap together to form a complete application. </p>
<p>How would these be different from components? Well, for one, they would represent a complete solution. Let&#8217;s take a common situation &#8212; tree on the left, data grid on the right, some action icons on the top, some action buttons on the bottom. I have just described some 90% of apps that allow management of any kind of hierarchical data. Instead of a developer wiring all this together with individual components, this should be a &#8220;Tree-Grid Data Panel.&#8221; Instead of having a zillion places where a developer can customize the styles, colors, fonts etc. there should be one for the panel. That&#8217;s it. You can&#8217;t muck with individual pieces. This might be painful at first, but once you get used to not mucking with the individual pieces, it leaves you with more time to focus on more important things and create a better solution. Does this sound familiar? You bet&#8230;it&#8217;s &#8220;<a href="http://www.rubyonrails.org/">convention over configuration</a>.&#8221;</p>
<p>To its credit, the YUI! team has taken a small step in this direction with its <a href="http://developer.yahoo.com/ypatterns/index.php">Design Pattern Library</a>. This is not nearly enough. TIBCO, which has arguably the most elegant and powerful UI suite of all, the <a href="http://www.tibco.com/devnet/gi/default.jsp">TIBCO General Interface</a> is heading in the generally correct direction with a SOA emphasis on UI components.</p>
<p>Who will put UI&#8217;s on Rails? What do you think about component-centric versus pattern-centric approaches to user interfaces?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2007/09/the-evolution-of-web-ui-components/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Namespaces in Javascript</title>
		<link>http://www.kalyani.com/2007/02/using-namespaces-in-javascript/</link>
		<comments>http://www.kalyani.com/2007/02/using-namespaces-in-javascript/#comments</comments>
		<pubDate>Thu, 08 Feb 2007 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/164/Using-Namespaces-in-Javascript.aspx</guid>
		<description><![CDATA[As AJAX and Javascript widgets get more popular, it is not unusual to see Javascript from multiple parties running on the same page. This greatly increases the chances of collisions in variable and function names. For instance, two unrelated scripts might define the function “modifySomething()”. In this case, the last definition of “modifySomething()” on the <a href='http://www.kalyani.com/2007/02/using-namespaces-in-javascript/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>As AJAX and <cite>Javascript</cite> widgets get more popular, it is not unusual to see <cite>Javascript</cite> from multiple parties running on the same page. This greatly increases the chances of collisions in variable and function names. For instance, two unrelated scripts might define the function “modifySomething()”. In this case, the last definition of “modifySomething()” on the page will be the one called. This is an invitation to disaster.</p>
<p>One way to prevent this is to practice defensive Javascript coding through the use of namespaces. In .Net and Java, the use of namespaces clearly delineates classes and prevents collisions. While <cite>Javascript</cite> does not have a built-in mechanism for using namespaces, it is relatively easy to implement them. In fact, just about every library such as <a href="http://www.dojotoolkit.org/" target=_blank>Dojo Toolkit</a>, <a href="http://developer.yahoo.com/yui/" target=_blank><cite>Yahoo</cite> UI</a> and <a href="http://ajax.asp.net/" target=_blank><cite>ASP.Net</cite> AJAX </a>provides a mechanism for registering and using namespaces in Javascript. This is fine if you are using one of the libraries, but if you are not, then how do you go about creating namespaces in your <cite>Javascript</cite> code. Read on.</p>
<p>Let’s create a simple “Cube” class with properties of Width, Height, Depth and methods grow() and shrink(). This class must reside in the “Speerio.Web.Solids” namespace.</p>
<p>If we try something like this: </p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<style type=text/css>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}</p>
<p>.csharpcode pre { margin: 0em; }</p>
<p>.csharpcode .rem { color: #008000; }</p>
<p>.csharpcode .kwrd { color: #0000ff; }</p>
<p>.csharpcode .str { color: #006080; }</p>
<p>.csharpcode .op { color: #0000c0; }</p>
<p>.csharpcode .preproc { color: #cc6633; }</p>
<p>.csharpcode .asp { background-color: #ffff00; }</p>
<p>.csharpcode .<cite>html</cite> { color: #800000; }</p>
<p>.csharpcode .attr { color: #ff0000; }</p>
<p>.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}</p>
<p>.csharpcode .lnum { color: #606060; }
</style>
<div class=csharpcode>
<pre class=alt>Speerio.Web.Solids.Cube = function(width, height, depth)</pre>
<pre>{</pre>
<pre class=alt>      this.width = width;</pre>
<pre>      this.height = height;</pre>
<pre class=alt>      this.depth = depth;</pre>
<pre>}</pre>
</div>
<p>…we get an error. This is because <cite>Javascript</cite> expects to find an object “Speerio”, with a child object “Web”, which has a child object “Solids”. To make this work, we will first need to define a way to tell <cite>Javascript</cite> that the “Speerio.Web.Solids” hierarchy exists. We can do this by creating a function to create the hierarchy like this:</p>
<div class=csharpcode>
<pre class=alt>function $register(ns)</pre>
<pre>{</pre>
<pre class=alt>    var segs = ns.split(".");</pre>
<pre>    var namespace = window;</pre>
<pre class=alt>    for(var s = 0; s <span class=kwrd><</span> segs.length; s++)</pre>
<pre>    {</pre>
<pre class=alt>        var seg = segs[s];</pre>
<pre>        if (typeof(namespace[seg]) == "undefined")</pre>
<pre class=alt>            namespace[seg] = new Object();</pre>
<pre>            </pre>
<pre class=alt>        namespace = namespace[seg];</pre>
<pre>    }</pre>
<pre class=alt>}</pre>
</div>
<p>This function adds our namespace as a hierarchy of objects that are children of the top-level “window” object. It only works if the object has not already been defined, so it’s OK to register the same or similar namespaces multiple times. Now, it’s a simple matter of calling the function:</p>
<div class=csharpcode>
<pre class=alt>$register(“Speerio.Web.Solids”);</pre>
</div>
<p>Once the namespace is registered, we can use it in our code as we would any other object. Since we are talking about defensive coding, let’s go further and define the “Cube” class.</p>
<div class=csharpcode>
<pre class=alt>Speerio.Web.Solids.Cube = function(width, height, depth)</pre>
<pre>{</pre>
<pre class=alt>       this.__width = width;</pre>
<pre>       this.__height = height;</pre>
<pre class=alt>       this.__depth = depth;</pre>
<pre>}</pre>
<pre class=alt> </pre>
<pre>Speerio.Web.Solids.Cube.prototype =</pre>
<pre class=alt>{</pre>
<pre>       shrink : $Speerio_Web_Solids_Cube_Shrink,</pre>
<pre class=alt>       grow : $Speerio_Web_Solids_Cube_Grow,</pre>
<pre>       getWidth : $Speerio_Web_Solids_Cube_GetWidth,</pre>
<pre class=alt>       setWidth : $Speerio_Web_Solids_Cube_SetWidth</pre>
<pre>}</pre>
</div>
<p>We start by defining the Cube class whose constructor takes three parameters — width, height and depth. In the definition of the class, these parameters are used to initialize properties __width, __height and __depth respectively. Why the underscores you ask? Mainly to discourage them from being directly modified. <cite>Javascript</cite> does not provide a set/get mechanism so to protect properties from being set directly, a small layer of obfuscation is necessary. It is not fool-proof…anyone studying your code will see this right away. However, it should be obvious that the intent is to protect the integrity of the data and prevent it from being modified directly.</p>
<p>Next, we define the various methods for the Cube class. For each method, the “public” method name is clear and simple. The actual method that does the work has a longer name. I used the following convention:</p>
<ul>
<li>prefix all class methods with $
<li>append the namespace and class name, replacing periods with underscores
<li>append the name of the method, prefixed with “Get” or “Set” if the method is intended to be a property getter/setter</li>
</ul>
<p>Now, we can define the actual methods:</p>
<div class=csharpcode>
<pre class=alt>function $Speerio_Web_Solids_Cube_Shrink()</pre>
<pre>{</pre>
<pre class=alt>    if ((this.__width <span class=kwrd>></span> 1) &#038;&#038; (this.__height <span class=kwrd>></span> 1) &#038;&#038; (this.__depth <span class=kwrd>></span> 1))</pre>
<pre>    {</pre>
<pre class=alt>        this.__width--;</pre>
<pre>        this.__height--;</pre>
<pre class=alt>        this.__depth--;</pre>
<pre>    }</pre>
<pre class=alt>}</pre>
<pre> </pre>
<pre class=alt>function $Speerio_Web_Solids_Cube_Grow()</pre>
<pre>{</pre>
<pre class=alt>    this.__width++;</pre>
<pre>    this.__height++;</pre>
<pre class=alt>    this.__depth++;</pre>
<pre>}</pre>
<pre class=alt> </pre>
<pre>function $Speerio_Web_Solids_Cube_GetWidth()</pre>
<pre class=alt>{</pre>
<pre>    return(this.__width);</pre>
<pre class=alt>}</pre>
<pre> </pre>
<pre class=alt>function $Speerio_Web_Solids_Cube_SetWidth(w)</pre>
<pre>{</pre>
<pre class=alt>    if (w <span class=kwrd>></span> 0)</pre>
<pre>       this.__width = w;</pre>
<pre class=alt>}</pre>
</div>
<p>And finally, some code to test the class:</p>
<div class=csharpcode>
<pre class=alt>var cube = new Speerio.Web.Solids.Cube(10, 10, 10);</pre>
<pre>cube.grow();</pre>
<pre class=alt>cube.grow();</pre>
<pre>cube.shrink();</pre>
<pre class=alt>alert("The cube width should be 11; the actual value is " + cube.getWidth());</pre>
<pre>cube.setWidth(100);</pre>
<pre class=alt>alert("The cube width should be 100; the actual value is " + cube.getWidth());</pre>
</div>
<p>The above namespace-based class definition protects your code when it is running on a page where code from other parties is also executing. In addition the code is readable and likely easy to manage, even if months have elapsed since you last took a look at it. There may be a small performance hit the first time the script file is downloaded to the user’s browser due to the verbosity, but I’ll take verbose code that works over concise code that breaks the page any day.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2007/02/using-namespaces-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hierarchical, Scrollable Javascript Checkbox List</title>
		<link>http://www.kalyani.com/2007/01/hierarchical-scrollable-javascript-checkbox-list/</link>
		<comments>http://www.kalyani.com/2007/01/hierarchical-scrollable-javascript-checkbox-list/#comments</comments>
		<pubDate>Wed, 24 Jan 2007 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/157/Hierarchical-Scrollable-Javascript-Checkbox-List.aspx</guid>
		<description><![CDATA[I needed a way to present the user with a hierarchical list of categories in an ASP.Net application. I also needed the code to be light-weight and the UI to be simple and customizable with CSS. Having AJAX functionality was not important as the number of categories in the list will not be very large. <a href='http://www.kalyani.com/2007/01/hierarchical-scrollable-javascript-checkbox-list/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>I needed a way to present the user with a hierarchical list of categories in an <cite>ASP.Net</cite> application. I also needed the code to be light-weight and the UI to be simple and customizable with CSS. Having AJAX functionality was not important as the number of categories in the list will not be very large. After checking-out several commercial tree components, existing JS libraries and various code snippets, I decided to write my own as I did not find anything that matched my needs.</p>
<p>The resulting “checkboxList” class is simple and easy to use. I have completed the <cite>Javascript</cite> coding, but still need to wire it up into an <cite>ASP.Net</cite> component. Below is the working <cite>Javascript</cite> code with some usage notes.</p>
<p><strong>Usage:</strong></p>
<p><em>checkboxList(instanceVariableName, trackingFieldId, containerId)</em></p>
<p><em>instanceVariableName: Name of variable with a reference to the object<br />trackingFieldId: The client-side ID of a text field where a list of checked item IDs will be stored delimited by “|”<br />containerId: The client-side ID of an <cite>HTML</cite> container element (such as DIV) where the list will be injected</em></p>
<p>Example: <strong>var myList = new checkboxList(“myList”, “trackingField”, “container”);</strong></p>
<p>Adding items to the checkbox list is done using the appropriately named “add()” method as follows:</p>
<p><em>checkboxList.add(itemId, itemLabel, isChecked[, parentItemId])</em></p>
<p>Examples: <br />myList.add(“node1”, “My First Node”, false);<br />myList.add(“node2”, “My Second Node”, false);<br />myList.add(“node3”, “Child of First Node”, true, “node1”);</p>
<p>After adding nodes as desired, call the “render()” method to render the checkbox list to the browser:</p>
<p>myList.render();</p>
<p>One important thing to remember is that the “render()” method expects to already find the container element. If the browser has not yet created the container element, then the checkbox list will not be rendered. The result will look something like this:</p>
<p><img alt="Cblist" src="http://www.devtao.com/assets/cblist.gif" border="0" /></p>
<p>The text field where the values will be stored should ideally be hidden (displayed here just to show the data values). For simplicity, I decided not to include images and instead rely on <cite>CSS</cite> styling to indicate if a node has children and is expandable. There are three style classes:</p>
<p>node: appearance of the text label<br />nodeChild: appearance of the SPAN element used for a child node block<br />nodeParent: appended to “node” for nodes that contain child nodes</p>
<p>Here’s the code:</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}</p>
<p>.csharpcode pre { margin: 0em; }</p>
<p>.csharpcode .rem { color: #008000; }</p>
<p>.csharpcode .kwrd { color: #0000ff; }</p>
<p>.csharpcode .str { color: #006080; }</p>
<p>.csharpcode .op { color: #0000c0; }</p>
<p>.csharpcode .preproc { color: #cc6633; }</p>
<p>.csharpcode .asp { background-color: #ffff00; }</p>
<p>.csharpcode .<cite>html</cite> { color: #800000; }</p>
<p>.csharpcode .attr { color: #ff0000; }</p>
<p>.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}</p>
<p>.csharpcode .lnum { color: #606060; }
</style>
<div class="csharpcode">
<pre class="alt"> </pre>
<pre><span class="kwrd"><</span><span class="html">style</span><span class="kwrd">></span></pre>
<pre class="alt">body</pre>
<pre>{</pre>
<pre class="alt">    font: 10pt Verdana,sans-serif;</pre>
<pre>    color: navy;</pre>
<pre class="alt">}</pre>
<pre>.node</pre>
<pre class="alt">{</pre>
<pre>    cursor: pointer;</pre>
<pre class="alt">    cursor: hand;</pre>
<pre>    display: block;</pre>
<pre class="alt">}</pre>
<pre> </pre>
<pre class="alt">.nodeChild</pre>
<pre>{</pre>
<pre class="alt">    display: none;</pre>
<pre>    margin-left: 16px;</pre>
<pre class="alt">}</pre>
<pre> </pre>
<pre class="alt">.nodeParent</pre>
<pre>{</pre>
<pre class="alt">    font-weight: bold;</pre>
<pre>}</pre>
<pre class="alt"> </pre>
<pre>.scrollingList</pre>
<pre class="alt">{</pre>
<pre>    height: 120px;</pre>
<pre class="alt">    width: 250px;</pre>
<pre>    overflow: auto;</pre>
<pre class="alt">    border:1px solid #e0e0e0;</pre>
<pre>}</pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">style</span><span class="kwrd">></span></pre>
<pre> </pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">script</span> <span class="attr">language</span><span class="kwrd">="JavaScript"</span><span class="kwrd">></span></pre>
<pre> </pre>
<pre class="alt"><span class="kwrd">function</span> checkboxList(instanceName, trackingElementId, containerElementId)</pre>
<pre>{</pre>
<pre class="alt">    <span class="kwrd">this</span>.instanceName = instanceName;</pre>
<pre>    <span class="kwrd">this</span>.add = addNode;</pre>
<pre class="alt">    <span class="kwrd">this</span>.render = renderCheckboxList;</pre>
<pre>    <span class="kwrd">this</span>.allNodes = <span class="kwrd">new</span> Object; </pre>
<pre class="alt">    <span class="kwrd">this</span>.tracker = document.getElementById(trackingElementId);</pre>
<pre>    <span class="kwrd">this</span>.containerElementId = containerElementId;</pre>
<pre class="alt">}</pre>
<pre> </pre>
<pre class="alt"><span class="kwrd">function</span> node(id, text, <span class="kwrd">checked</span>)</pre>
<pre>{</pre>
<pre class="alt">    <span class="kwrd">this</span>.id = id;</pre>
<pre>    <span class="kwrd">this</span>.text = text;</pre>
<pre class="alt">        <span class="kwrd">this</span>.<span class="kwrd">checked</span> = <span class="kwrd">checked</span>;</pre>
<pre>    <span class="kwrd">this</span>.parentId = <span class="kwrd">null</span>;</pre>
<pre class="alt">    <span class="kwrd">this</span>.show = expandParent;</pre>
<pre>    <span class="kwrd">this</span>.rootInstance = <span class="str">''</span>;</pre>
<pre class="alt">}</pre>
<pre> </pre>
<pre class="alt"><span class="kwrd">function</span> expandParent()</pre>
<pre>{</pre>
<pre class="alt">    <span class="rem">// Expands the parent node causing a node to be displayed</span></pre>
<pre>    <span class="rem">// This is automatically done when rendering to ensure</span></pre>
<pre class="alt">    <span class="rem">// that all checked nodes are visible</span></pre>
<pre> </pre>
<pre class="alt">    <span class="kwrd">var</span> p = <span class="kwrd">this</span>.parent;</pre>
<pre>    <span class="kwrd">while</span>(p)</pre>
<pre class="alt">    {</pre>
<pre>        <span class="kwrd">var</span> el = document.getElementById(p.id);</pre>
<pre class="alt">        el.style.display = <span class="str">'block'</span>;</pre>
<pre>        p = p.parent;        </pre>
<pre class="alt">    }</pre>
<pre>}</pre>
<pre class="alt"> </pre>
<pre> </pre>
<pre class="alt"><span class="kwrd">function</span> renderCheckboxList()</pre>
<pre>{</pre>
<pre class="alt">    <span class="rem">// Renders all checkboxes</span></pre>
<pre>    <span class="kwrd">var</span> checkboxListString = <span class="str">''</span>;</pre>
<pre class="alt">    <span class="kwrd">for</span>(<span class="kwrd">var</span> n <span class="kwrd">in</span> <span class="kwrd">this</span>.allNodes)</pre>
<pre>    {</pre>
<pre class="alt">        <span class="kwrd">if</span> (!<span class="kwrd">this</span>.allNodes[n].parentId)</pre>
<pre>            checkboxListString += <span class="kwrd">this</span>.allNodes[n].render(<span class="kwrd">this</span>);</pre>
<pre class="alt">    }</pre>
<pre> </pre>
<pre class="alt">    <span class="kwrd">var</span> container = document.getElementById(<span class="kwrd">this</span>.containerElementId);</pre>
<pre> </pre>
<pre class="alt">    <span class="kwrd">if</span> (container)</pre>
<pre>        container.inner<cite>HTML</cite> = checkboxListString;</pre>
<pre class="alt"> </pre>
<pre>    <span class="kwrd">this</span>.updateValue(<span class="kwrd">true</span>);</pre>
<pre class="alt"> </pre>
<pre>}</pre>
<pre class="alt"> </pre>
<pre>checkboxList.prototype.updateValue = <span class="kwrd">function</span>(display)</pre>
<pre class="alt">{</pre>
<pre>    <span class="rem">// "display" controls if the UI is rendered to ensure that every checked node is</span></pre>
<pre class="alt">    <span class="rem">// visible. If "display" is true, a node's show() method is called.</span></pre>
<pre> </pre>
<pre class="alt">        <span class="kwrd">var</span> checkedString = <span class="str">""</span>;</pre>
<pre>    <span class="kwrd">for</span>(<span class="kwrd">var</span> n <span class="kwrd">in</span> <span class="kwrd">this</span>.allNodes)</pre>
<pre class="alt">    {</pre>
<pre>        <span class="kwrd">if</span> (<span class="kwrd">this</span>.allNodes[n].<span class="kwrd">checked</span>)</pre>
<pre class="alt">        {</pre>
<pre>            <span class="kwrd">if</span> (display)</pre>
<pre class="alt">                <span class="kwrd">this</span>.allNodes[n].show();</pre>
<pre>            checkedString += (checkedString == <span class="str">""</span> ? <span class="str">""</span> : <span class="str">"|"</span>) + <span class="kwrd">this</span>.allNodes[n].id;</pre>
<pre class="alt">        }</pre>
<pre>    }</pre>
<pre class="alt">    <span class="kwrd">this</span>.tracker.value = checkedString;    </pre>
<pre>}</pre>
<pre class="alt"> </pre>
<pre>checkboxList.prototype.toggle = <span class="kwrd">function</span>(nodeId, <span class="kwrd">checked</span>)</pre>
<pre class="alt">{</pre>
<pre>    <span class="rem">// If the user clicks a checkbox, the corresponding object in the associative array is updated</span></pre>
<pre class="alt"> </pre>
<pre>    <span class="kwrd">for</span>(<span class="kwrd">var</span> n <span class="kwrd">in</span> <span class="kwrd">this</span>.allNodes)</pre>
<pre class="alt">    {</pre>
<pre>        <span class="kwrd">if</span> (<span class="kwrd">this</span>.allNodes[n].id == nodeId)</pre>
<pre class="alt">        {</pre>
<pre>            <span class="kwrd">this</span>.allNodes[n].<span class="kwrd">checked</span> = <span class="kwrd">checked</span>;</pre>
<pre class="alt">            <span class="kwrd">break</span>;</pre>
<pre>        }    </pre>
<pre class="alt">    }</pre>
<pre> </pre>
<pre class="alt">    <span class="rem">// The tracking field is updated, but the nodes are not auto-expanded</span></pre>
<pre>    <span class="kwrd">this</span>.updateValue(<span class="kwrd">false</span>);</pre>
<pre class="alt"> </pre>
<pre>}</pre>
<pre class="alt"> </pre>
<pre> </pre>
<pre class="alt"><span class="kwrd">function</span> addNode(id, label, <span class="kwrd">checked</span>, parentId)</pre>
<pre>{</pre>
<pre class="alt">    <span class="kwrd">var</span> n = <span class="kwrd">new</span> node(id, label, <span class="kwrd">checked</span>);</pre>
<pre> </pre>
<pre class="alt">    <span class="rem">// If the specified parentId node is not present, the node is</span></pre>
<pre>    <span class="rem">// added to the top level</span></pre>
<pre class="alt">    <span class="kwrd">if</span> (<span class="kwrd">this</span>.allNodes[parentId])</pre>
<pre>        n.parentId = parentId;</pre>
<pre class="alt">    <span class="kwrd">else</span></pre>
<pre>        n.parentId = <span class="kwrd">null</span>;</pre>
<pre class="alt">    n.rootInstance = <span class="kwrd">this</span>.instanceName;</pre>
<pre>    <span class="kwrd">this</span>.allNodes[n.id] = n;</pre>
<pre class="alt">}</pre>
<pre> </pre>
<pre class="alt">node.prototype.render = <span class="kwrd">function</span>(root)</pre>
<pre>{</pre>
<pre class="alt">    <span class="rem">// Renders a node to the browser</span></pre>
<pre> </pre>
<pre class="alt">    </pre>
<pre>    <span class="rem">// Obtain a list of child nodes by looking for nodes which have</span></pre>
<pre class="alt">    <span class="rem">// this node's Id as their parentId</span></pre>
<pre>    <span class="kwrd">var</span> childNodes = <span class="kwrd">new</span> Array();</pre>
<pre class="alt">    <span class="kwrd">for</span>(<span class="kwrd">var</span> n <span class="kwrd">in</span> root.allNodes)</pre>
<pre>    {</pre>
<pre class="alt">        <span class="kwrd">if</span> (root.allNodes[n].parentId == <span class="kwrd">this</span>.id)</pre>
<pre>            childNodes[childNodes.length] = root.allNodes[n].id;</pre>
<pre class="alt">    }</pre>
<pre> </pre>
<pre class="alt">    <span class="kwrd">var</span> numNodes = childNodes.length;</pre>
<pre> </pre>
<pre class="alt">    <span class="rem">// Compose the <cite>HTML</cite> string for rendering this node</span></pre>
<pre>    <span class="rem">// Toggling the checkbox calls the toggle method of the root list object</span></pre>
<pre class="alt"> </pre>
<pre>    <span class="kwrd">var</span> nodeString = <span class="str">'<span class="node'</span> + (numNodes > 0 ? <span class=str>' nodeParent'</span> : <span class=str>''</span>) + <span class=str>'">'</span>;</pre>
<pre class="alt">    nodeString += <span class="str">'
<input type="checkbox" id="cb'</span> + <span class=kwrd>this</span>.id + <span class=str>'" '</span>;</pre>
<pre>    nodeString += <span class="str">'onClick="'</span> + <span class=kwrd>this</span>.rootInstance + <span class=str>'.toggle(\''</span> + <span class=kwrd>this</span>.id + <span class=str>'\', this.checked)"'</span>;</pre>
<pre class="alt">    nodeString += (<span class="kwrd">this</span>.<span class="kwrd">checked</span> ? <span class="str">' checked'</span> : <span class="str">''</span>) + <span class="str">'> '</span>;</pre>
<pre>    nodeString += <span class="str">'<span'</span> + (numNodes > 0 ? <span class="str">' onClick="showNode(\''</span> + <span class=kwrd>this</span>.id + <span class=str>'\')"'</span> : <span class="str">''</span>) + <span class="str">'>'</span> + <span class="kwrd">this</span>.text + <span class="str">'</span>'</span>;</pre>
<pre class="alt">    nodeString += <span class="str">'</span>'</span>;</pre>
<pre> </pre>
<pre class="alt">    <span class="rem">// If any child nodes are present, recursively render them also</span></pre>
<pre>    <span class="kwrd">if</span> (numNodes > 0)</pre>
<pre class="alt">    {</pre>
<pre>        nodeString += <span class="str">'<span class="nodeChild" id="'</span> + <span class=kwrd>this</span>.id + <span class=str>'">'</span>;</pre>
<pre class="alt">        <span class="kwrd">for</span>(<span class="kwrd">var</span> j=0;j<numNodes;j++)</pre>
<pre>            nodeString += root.allNodes[childNodes[j]].render(root);</pre>
<pre class="alt">        nodeString += <span class="str">'</span>'</span>;</pre>
<pre>    }</pre>
<pre class="alt">    </pre>
<pre>    <span class="kwrd">return</span> nodeString;</pre>
<pre class="alt">}</pre>
<pre> </pre>
<pre class="alt"> </pre>
<pre><span class="kwrd">function</span> showNode(node)</pre>
<pre class="alt">{</pre>
<pre>    <span class="rem">// When a user clicks on a node label</span></pre>
<pre class="alt">    <span class="rem">// this function is called to toggle the display</span></pre>
<pre> </pre>
<pre class="alt">    <span class="kwrd">var</span> objNode = document.getElementById(node).style;</pre>
<pre>    <span class="kwrd">if</span>(objNode.display==<span class="str">"block"</span>)</pre>
<pre class="alt">        objNode.display=<span class="str">"none"</span>;</pre>
<pre>    <span class="kwrd">else</span></pre>
<pre class="alt">        objNode.display=<span class="str">"block"</span>;</pre>
<pre>}</pre>
<pre class="alt"> </pre>
<pre> </pre>
<pre class="alt"><span class="kwrd">var</span> myCheckboxList = <span class="kwrd">new</span> checkboxList(<span class="str">"myCheckboxList"</span>,<span class="str">"trackingField"</span>, <span class="str">"scrollingList"</span>);</pre>
<pre> </pre>
<pre class="alt">myCheckboxList.add(<span class="str">'node1'</span>,<span class="str">'Node 1'</span>, <span class="kwrd">false</span>);</pre>
<pre>myCheckboxList.add(<span class="str">'node2'</span>, <span class="str">'Node 2'</span>, <span class="kwrd">false</span>, <span class="str">'node1'</span>);</pre>
<pre class="alt">myCheckboxList.add(<span class="str">'node3'</span>, <span class="str">'Node 3'</span>, <span class="kwrd">true</span>, <span class="str">'node2'</span>);</pre>
<pre>myCheckboxList.add(<span class="str">'node4'</span>, <span class="str">'Node 4'</span>, <span class="kwrd">false</span>, <span class="str">'node2'</span>);</pre>
<pre class="alt">myCheckboxList.add(<span class="str">'node5'</span>, <span class="str">'Node 5'</span>, <span class="kwrd">false</span>);</pre>
<pre>myCheckboxList.add(<span class="str">'node6'</span>, <span class="str">'Node 6'</span>, <span class="kwrd">true</span>, <span class="str">'node5'</span>);</pre>
<pre class="alt"> </pre>
<pre><span class="kwrd"></</span><span class="html">script</span><span class="kwrd">></span></pre>
<pre class="alt"></head></pre>
<pre><body></pre>
<pre class="alt">
</pre>
<pre>
<input type=<span class="str">"text"</span> id=<span class="str">"trackingField"</span> style=<span class="str">"width:400px"</span>></pre>
<pre class="alt">
</pre>
<pre> </pre>
<pre class="alt">
<div id=<span class="str">"scrollingList"</span> <span class="kwrd">class</span>=<span class="str">"scrollingList"</span> /></pre>
<pre><script></pre>
<pre class="alt">myCheckboxList.render();</pre>
<pre><span class="kwrd"></</span><span class="html">script</span><span class="kwrd">></span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2007/01/hierarchical-scrollable-javascript-checkbox-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiple ASP.Net Versions of Windows 2003 Server 64-bit</title>
		<link>http://www.kalyani.com/2007/01/multiple-asp-net-versions-of-windows-2003-server-64-bit/</link>
		<comments>http://www.kalyani.com/2007/01/multiple-asp-net-versions-of-windows-2003-server-64-bit/#comments</comments>
		<pubDate>Mon, 15 Jan 2007 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/156/Multiple-ASP-Net-Versions-of-Windows-2003-Server-64-bit.aspx</guid>
		<description><![CDATA[One of my dedicated servers at PowerDNN is running 64–bit Windows 2003 Server. Recently I had to get an app that was ASP.Net 1.1–dependent to run on this box. No problem, right? Wrong…big problem. Turns out that in order to run ASP.Net 1.1 and 2.0 concurrently on 64–bit Windows Server, you have to run IIS in 32–bit <a href='http://www.kalyani.com/2007/01/multiple-asp-net-versions-of-windows-2003-server-64-bit/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>One of my dedicated servers at <a href="http://www.powerdnn.com/" target="_blank">PowerDNN</a> is running 64–bit Windows 2003 Server. Recently I had to get an app that was <cite>ASP.Net</cite> 1.1–dependent to run on this box. No problem, right? Wrong…big problem. Turns out that in order to run <cite>ASP.Net</cite> 1.1 and 2.0 concurrently on 64–bit Windows Server, you have to run IIS in 32–bit mode. Here’s the reason according to <cite>Microsoft</cite> <a href="http://support.microsoft.com/kb/894435" target="_blank">KB894435</a>:</p>
<p><em>IIS 6.0 supports both the 32-bit mode and the 64-bit mode. However IIS 6.0 does not support running both modes at the same time on a 64-bit version of Windows. ASP.NET 1.1 runs only in 32-bit mode. <cite>ASP.NET</cite> 2.0 runs in 32-bit mode or in 64-bit mode. Therefore, if you want to run <cite>ASP.NET</cite> 1.1 and <cite>ASP.NET</cite> 2.0 at the same time, you must run IIS in 32-bit mode.</em></p>
<p>Unfortunate, but understandable. I followed the instructions in the article and everything worked fine until I needed to switch the <cite>ASP.Net</cite> version for the app that I mentioned earlier. Despite having both versions of <cite>ASP.Net</cite> installed, the <cite>ASP.Net</cite> tab was not displayed.</p>
<p><img alt="IIS Properties Dialog" src="http://www.devtao.com/assets/iisprops.jpg" border="0" /></p>
<p>Googling a bit, I discovered that this problem often appeared when upgrading from an <cite>ASP.Net</cite> 2 beta to the production version. The fix was to delete some obsolete registry keys and register the framework again using aspnet_regiis. I did this, rebooted and saw no difference.</p>
<p>After spending almost two hours looking for a solution, I decided that there was no easy fix (of course, I was completely wrong). It then occurred to me that since the properties dialog is just a UI for WMI, it should be possible to accomplish the <cite>ASP.Net</cite> version switching using script. Googled some more and discovered that this was a solution, but not the simplest one. If you know the website ID, then aspnet_regiis can set the <cite>ASP.Net</cite> version for an IIS site. And <a href="http://www.denisbauer.com/" target="_blank">Denis Bauer</a> (of Reflector File Disassembler fame) had already solved the problem with a neat utility called <a href="http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx" target="_blank"><cite>ASP.Net</cite> Version Switcher</a>.</p>
<p><img alt="ASPNETVersionSwitcher" src="http://www.devtao.com/assets/ASPNETVersionSwitcher.jpg" border="0" /></p>
<p>This utility solved the problem and had me up and running in seconds. I selected the site, clicked the <cite>ASP.Net</cite> version I wanted and hit the Switch button. Done.</p>
<p>Thanks, Denis. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2007/01/multiple-asp-net-versions-of-windows-2003-server-64-bit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DotNetNuke Factoid</title>
		<link>http://www.kalyani.com/2006/09/dotnetnuke-factoid/</link>
		<comments>http://www.kalyani.com/2006/09/dotnetnuke-factoid/#comments</comments>
		<pubDate>Tue, 05 Sep 2006 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/149/DotNetNuke-Factoid.aspx</guid>
		<description><![CDATA[DotNetNuke forums user odontech has posted an excellent collection of DNN-related links which I am reproducing here:   DotNetNuke Factoid Community · A community of over 300,000 members · [link] Within the top 25 Open Source Projects at SourceForge.net (by Page Views)  Performance Scalability · [link] Web Farm Support · High Traffic Reference Sites <a href='http://www.kalyani.com/2006/09/dotnetnuke-factoid/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>DotNetNuke forums user <a href="http://dotnetnuke.com/Community/ForumsDotNetNuke/tabid/795/ctl/UserProfile/mid/2108/userid/11928/Default.aspx">odontech</a> has posted an excellent collection of DNN-related links which I am reproducing here:</p>
<p> </p>
<p><strong><font size="4">DotNetNuke Factoid</font></strong> <br /> 
<p><strong>Community</strong>
<p>· A community of over 300,000 members
<p>· [<a href="http://sourceforge.net/top/toplist.php?type=pageviews_proj"><u>link</u></a>] Within the top 25 <cite>Open Source</cite> Projects at SourceForge.net (by Page Views)
<p><strong></strong>
<p><strong>Performance</strong>
<p><strong>Scalability</strong>
<p>· [<a href="http://dotnetnuke.com/Default.aspx?tabid=629"><u>link</u></a>] Web Farm Support<b></b>
<p><strong></strong>
<p>· <strong>High Traffic Reference Sites</strong>
<p>· [<a href="http://www.alexa.com/data/details/traffic_details?&#038;range=3m&#038;size=medium&#038;compare_sites=&#038;y=p&#038;url=http://www.dotnetnuke.com#top"><u>link</u></a>] DotNetNuke itself handles ~ 15 million pageviews daily<b></b>
<p>· [<a href="http://www.alexa.com/data/details/traffic_details?&#038;range=3m&#038;size=medium&#038;compare_sites=&#038;y=p&#038;url=http%3A%2F%2Fwww.edi.gatech.edu%2F#top"><u>link</u></a>] Geor<cite>gia</cite> Institute of Technology > 10 million pageviews daily<b></b>
<p>· [<a href="http://www.alexa.com/data/details/traffic_details?&#038;range=3m&#038;size=medium&#038;compare_sites=&#038;y=p&#038;url=http%3A%2F%2Fwww.wildvoice.com%2F#top"><u>link</u></a>] WildVoice.com > 6 million pageviews daily<b></b>
<p>· [<a href="http://www.alexa.com/data/details/traffic_details?&#038;compare_sites=&#038;y=p&#038;q=&#038;size=medium&#038;range=&#038;url=transperth.wa.gov.au"><u>link</u></a>] Transperth > 6 million pageviews daily<b></b>
<p>· [<a href="http://www.alexa.com/data/details/traffic_details?&#038;range=3m&#038;size=medium&#038;compare_sites=&#038;y=p&#038;url=http%3A%2F%2Fwww.nrl.com%2F#top"><u>link</u></a>] National Rugby League > 4 million pageviews daily<b></b>
<p>· [<a href="http://www.alexa.com/data/details/traffic_details?&#038;range=3m&#038;size=medium&#038;compare_sites=&#038;y=p&#038;url=sa.gov.au#top"><u>link</u></a>] South Australian Central > 4 million pageviews daily<b></b>
<p>· [<a href="http://www.alexa.com/data/details/traffic_details?&#038;range=3m&#038;size=medium&#038;compare_sites=&#038;y=p&#038;url=http%3A%2F%2Fwww.vinum.ca#top"><u>link</u></a>] Vinum Canada ~ 1 million pageviews daily<b></b>
<p>· [<a href="http://www.alexa.com/data/details/traffic_details?&#038;range=3m&#038;size=medium&#038;compare_sites=&#038;y=p&#038;url=http%3A%2F%2Fwww.utep.edu%2F#top"><u>link</u></a>] University of Texas El Paso ~ 1 million pageviews daily<b></b>
<p><img src="http://dotnetnuke.com/DesktopModules/Forum/Themes/DNNSilver/Images/height_spacer.gif" border="0"><br /><img src="http://dotnetnuke.com/DesktopModules/Forum/Themes/DNNSilver/Images/height_spacer.gif" border="0">
<p><strong>Security</strong>
<p>· <strong>Public Registration</strong><br />Allows the general public to sign up for accounts.<b></b>
<p>o [<a href="http://dotnetnuke.com/Community/Blogs/tabid/825/EntryID/386/Default.aspx"><u>link</u></a>] <b>CAPTCHA <br /></b>Prevents people from writing programs to create accounts.<b></b>
<p>· [<a href="http://dotnetnuke.com/About/DotNetNukeOnlineHelp/tabid/787/TID/1212/cid/79/Default.aspx"><u>link</u></a>] <b>Security Groups<br /></b>Allows site users to be placed into groups.<b></b>
<p>o Group Settings<b></b>
<p>§ <strong>Auto Assignment</strong><br />Automatically assigns new users into the role.<b></b>
<p>§ <strong>Public Role</strong><br />Allows users to subscribe/unsubscribe into different roles.<b></b>
<p>§ <strong>Private Role<br /></strong>Prevents users from changing their assignmment to a role.<b></b>
<p>· <strong>Page Level Security</strong>
<p>o Allows security settings on a page level basis<b></b>
<p>§ Ability to View Page<b></b>
<p>§ Ability to Edit Page<b></b>
<p>· <strong>Module Level Security</strong>
<p>o Allows security settings to be set on modules placed on pages<b></b>
<p>§ Ability to View Module<b></b>
<p>§ Ability to Edit Module<b></b>
<p>§ (Custom settings available on a per module basis)<b></b>
<p><strong>Skins</strong>
<p>· [<a href="http://www.salaro.com/Default.aspx?tabid=402&#038;subcategoryid=7http://www.salaro.com/Default.aspx?tabid=1064"><u>link</u></a>] Over 70 skins listed on Salaro<b></b>
<p>· [<a href="http://www.snowcovered.com/snowcovered2/Default.aspx?tabid=241&#038;tagid=119&#038;tagid=379&#038;pagenumber=0"><u>link</u></a>] Over 500 skins listed on SnowCovered<b></b>
<p><strong></strong>
<p><strong>Modules </strong>
<p>· Over 30 Core Modules
<p>o [<a href="http://dotnetnuke.com/About/Modules/AccountLogIn/tabid/614/Default.aspx"><u>link</u></a>] Account LogIn
<p>o [<a href="http://dotnetnuke.com/About/Modules/Announcements/tabid/442/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/DotNetNukeProjects/ModuleAnnouncements/tabid/924/Default.aspx"><u>project page</u></a>] Announcements
<p>o [<a href="http://dotnetnuke.com/LinkClick.aspx?link=842&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Blog
<p>o [<a href="http://dotnetnuke.com/About/Modules/Banners/tabid/443/Default.aspx"><u>link</u></a>] Banner
<p>o [<a href="http://dotnetnuke.com/DotNetNukeProjects/ModuleChat/tabid/965/Default.aspx"><u>project page</u></a>] Chat
<p>o [<a href="http://dotnetnuke.com/About/Modules/Contacts/tabid/444/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=832&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Contacts
<p>o [<a href="http://dotnetnuke.com/About/Modules/Discussions/tabid/445/Default.aspx"><u>link</u></a>] Discussion
<p>o [<a href="http://dotnetnuke.com/About/Modules/Documents/tabid/446/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=826&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Documents
<p>o [<a href="http://dotnetnuke.com/About/Modules/Events/tabid/450/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=833&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Events List / Calendar
<p>o [<a href="http://dotnetnuke.com/About/Modules/FAQs/tabid/451/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/DotNetNukeProjects/ModuleFAQ/tabid/892/Default.aspx"><u>project page</u></a>] FAQs
<p>o [<a href="http://dotnetnuke.com/About/Modules/Feedback/tabid/458/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=841&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Feedback
<p>o [<a href="http://dotnetnuke.com/LinkClick.aspx?link=820&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Forum
<p>o [<a href="http://dotnetnuke.com/LinkClick.aspx?link=843&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Gallery
<p>o [<a href="http://dotnetnuke.com/LinkClick.aspx?link=850&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Help
<p>o [<a href="http://dotnetnuke.com/About/Modules/IFrame/tabid/460/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=845&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] IFrame
<p>o [<a href="http://dotnetnuke.com/About/Modules/Image/tabid/453/Default.aspx"><u>link</u></a>] Image
<p>o [<a href="http://dotnetnuke.com/About/Modules/Links/tabid/454/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=857&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Links
<p>o [<a href="http://dotnetnuke.com/DotNetNukeProjects/ModuleMap/tabid/952/Default.aspx"><u>project page</u></a>] Map
<p>o [<a href="http://dotnetnuke.com/LinkClick.aspx?link=846&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Media
<p>o [<a href="http://dotnetnuke.com/About/Modules/NewsFeedsRSS/tabid/456/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=847&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] News Feed (RSS)
<p>o [<a href="http://dotnetnuke.com/DotNetNukeProjects/ModuleReports/tabid/970/Default.aspx"><u>project page</u></a>] Reports
<p>o [<a href="http://dotnetnuke.com/LinkClick.aspx?link=830&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Repository
<p>o [<a href="http://dotnetnuke.com/DotNetNukeProjects/ModuleStore/tabid/890/Default.aspx"><u>project page</u></a>] Store
<p>o [<a href="http://dotnetnuke.com/About/Modules/Search/tabid/462/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=834&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Search
<p>o [<a href="http://dotnetnuke.com/About/Modules/Survey/tabid/467/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=837&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Survey
<p>o [<a href="http://dotnetnuke.com/About/Modules/TextHTML/tabid/452/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/LinkClick.aspx?link=844&#038;tabid=824&#038;mid=2189"><u>project page</u></a>]Text/<cite>HTML</cite>
<p>o [<a href="http://dotnetnuke.com/About/Modules/UserAccounts/tabid/615/Default.aspx"><u>link</u></a>] User Accounts
<p>o [<a href="http://dotnetnuke.com/About/Modules/UserDefinedTable/tabid/457/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/DotNetNukeProjects/ModuleUserDefinedTable/tabid/877/Default.aspx"><u>project page</u></a>] User Defined Table
<p>o [<a href="http://dotnetnuke.com/LinkClick.aspx?link=835&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Users Online
<p>o [<a href="http://dotnetnuke.com/LinkClick.aspx?link=848&#038;tabid=824&#038;mid=2189"><u>project page</u></a>] Wiki
<p>o [<a href="http://dotnetnuke.com/About/Modules/XMLXSL/tabid/463/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/DotNetNukeProjects/ModuleXML/tabid/836/Default.aspx"><u>project page</u></a>] XML/XSL
<p>· Community Developed
<p>o [<a href="http://dotnetnuke.com/Community/Modules/NonCoreModulesVersion34/tabid/794/Default.aspx"><u>link</u></a>] Over 100 modules listed on DotNetNuke
<p>o [<a href="http://www.snowcovered.com/snowcovered2/Default.aspx?tabid=241&#038;tagid=119&#038;tagid=203&#038;pagenumber=30"><u>link</u></a>] Over 700 modules listed on <cite>SnowCovered</cite>
<p><strong>Localized</strong>
<p>· [<a href="http://dotnetnuke.com/DotNetNukeProjects/CoreLocalization/LanguagePacks/tabid/933/Default.aspx"><u>link</u></a>] [<a href="http://dotnetnuke.com/DotNetNukeProjects/CoreLocalization/tabid/839/Default.aspx"><u>project page</u></a>] DNN Supports multiple languages (currently 25 user submitted language packs)<b></b>
<p><strong>Books</strong> &#8211; Five books have been published on DotNetNuke
<p>· [<a href="http://www.amazon.com/gp/product/0471788163/sr=1-1/qid=1153828911/ref=pd_bbs_1/102-1023042-8832944?ie=UTF8&#038;s=books"><u>link</u></a>] Professional DotNetNuke 4: <cite>Open Source</cite> Web Application Framework for <cite>ASP.NET</cite> 2.0
<p>· [<a href="http://www.amazon.com/gp/product/0764595636/sr=1-2/qid=1153828911/ref=pd_bbs_2/102-1023042-8832944?ie=UTF8&#038;s=books"><u>link</u></a>] Professional DotNetNuke <cite>ASP.NET</cite> Portals
<p>· [<a href="http://www.amazon.com/gp/product/1590596811/sr=1-3/qid=1153828911/ref=pd_bbs_3/102-1023042-8832944?ie=UTF8&#038;s=books"><u>link</u></a>] Beginning DotNetNuke 4.0 Website Creation in C# 2005 with Visual Web Developer 2005 Express: From Novice to Professional
<p>· [<a href="http://www.amazon.com/gp/product/0471798436/sr=1-4/qid=1153828911/ref=sr_1_4/102-1023042-8832944?ie=UTF8&#038;s=books"><u>link</u></a>] DotNetNuke For Dummies
<p>· [<a href="http://www.amazon.com/gp/product/1904811272/sr=1-5/qid=1153828911/ref=sr_1_5/102-1023042-8832944?ie=UTF8&#038;s=books"><u>link</u></a>] Building Websites with VB.NET and DotNetNuke 3.0
<p><strong>Magazines / Media</strong>
<p>· <cite>Microsoft</cite> published a 2 part webcast on <cite>DNN</cite> 4.0 (March 17, 2006)
<p>o [<a href="http://www.thedifferenceisobviousvb05.com/ViewOffering.aspx?ticket=d9bc3a5c-954b-4774-a493-d098300dd2a5"><u>part1</u></a>] Overview and What&#8217;s New
<p>o [<a href="http://www.thedifferenceisobviousvb05.com/ViewOffering.aspx?ticket=8b807e70-647f-4ead-8273-a3882da9473b"><u>part2</u></a>] Running on <cite>ASP.NET</cite> 2.0
<p>· <cite>Microsoft</cite> published a 6 part webcast on <cite>DNN</cite> (Jan 10 – Jan 31, 2006)
<p>o [<a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032286477&#038;Culture=en-US"><u>part1</u></a>] Overview and Installation of DotNetNuke
<p>o [<a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032286481&#038;Culture=en-US"><u>part2</u></a>] Working with Modules in DotNetNuke
<p>o [<a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032286483&#038;Culture=en-US"><u>part3</u></a>] Programming Your Own DotNetNuke Module Using Visual Basic .NET
<p>o [<a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032286487&#038;Culture=en-US"><u>part4</u></a>] Using Security Features in DotNetNuke
<p>o [<a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032287403&#038;Culture=en-US"><u>part5</u></a>] Creating Skins for Your DotNetNuke <cite>Portal</cite>
<p>o [<a href="http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032287581&#038;EventCategory=5&#038;culture=en-US&#038;CountryCode=US"><u>part6</u></a>] DotNetNuke Architecture and Wrap-up
<p>· DotNet Developers Journal ran a 4 part series on <cite>DNN</cite> (Dec 2005 – Feb 2006)
<p>o [<a href="http://ca.sys-con.com/read/153974.htm"><u>part1</u></a>] An Introduction to the <cite>DotNetNuke</cite> Application Framework (Nov 2005)
<p>o [<a href="http://br.sys-con.com/read/163749.htm"><u>part2</u></a>] Managing an <cite>Open Source</cite> Project for <cite>DotNetNuke</cite> (Dec 2005)
<p>o [<a href="http://it.sys-con.com/read/171171.htm"><u>part3</u></a>] When Design and Development First Met (Jan 2006)
<p>o [<a href="http://be.sys-con.com/read/180968.htm"><u>part4</u></a>] Rapid Module Development for <cite>DotNetNuke</cite> (Feb 2006)
<p>· [<a href="http://news.com.com/Microsoft+learns+to+live+with+open+source/2100-7344_3-5780030.html"><u>link</u></a>] CNet published article (July 11, 2005)
<p>· [<a href="http://www.eweek.com/article2/0,1759,1787142,00.asp"><u>link</u></a>] EWeek published article (April18, 2005)
<p>· [<a href="http://www.ftponline.com/vsm/2003_12/magazine/columns/gettingstarted/"><u>link</u></a>] Visual Studio Magazine published article (Sept 30, 2003)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2006/09/dotnetnuke-factoid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Locked assemblies when using &lt;probing privatePath=&#8221;&#8230;&#8221;&gt;</title>
		<link>http://www.kalyani.com/2006/09/locked-assemblies-when-using-probing-privatepath/</link>
		<comments>http://www.kalyani.com/2006/09/locked-assemblies-when-using-probing-privatepath/#comments</comments>
		<pubDate>Sun, 03 Sep 2006 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/148/Locked-assemblies-when-using-lt-probing-privatePath-quot-quot-gt.aspx</guid>
		<description><![CDATA[Several of you tried the tip in Speeding-up DNN Module Development and emailed to report that this does work, but on occasion, the assemblies in the private assembly folder are locked during development. I did some testing to find the cause and a solution. Background: Assemblies in the &#8220;bin&#8221; folder are automatically shadow copied to a different <a href='http://www.kalyani.com/2006/09/locked-assemblies-when-using-probing-privatepath/'>[...]</a>]]></description>
			<content:encoded><![CDATA[</p>
<p>Several of you tried the tip in <a href="http://www.devtao.com/Default.aspx#a46930367-0068-4dcf-8bad-14b71499ef94" target="_blank">Speeding-up <cite>DNN</cite> Module Development</a> and emailed to report that this does work, but on occasion, the assemblies in the private assembly folder are locked during development. I did some testing to find the cause and a solution.</p>
<p><strong>Background:</strong> Assemblies in the &#8220;bin&#8221; folder are automatically shadow copied to a different folder before the <cite>ASP.net</cite> process loads them. This allows the files in the &#8220;bin&#8221; folder to be replaced without causing any locking issues. According to this <a href="http://msdn2.microsoft.com/en-us/library/system.appdomainsetup.shadowcopydirectories.aspx" target="_blank">article</a> even assemblies specified in AppDomainSetup.PrivateBinPath are shadow copied. Of course, this raised the question &#8212; does PrivateBinPath get initialized from the web.config
<probing> element.</p>
<p>My curiosity piqued, I did some testing to find the answer. The test is simple enough &#8212; delete the existing shadow copy folder for an app (typically in C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary <cite>ASP.NET</cite> Files\{appname}); setup
<probing> with a private path and move some assemblies there; run the app. Assemblies that are shadow copied will then show up in a sub-directory of this folder. In my test, the files from the
<probing> path were not shadow copied (i.e. AppDomainSetup.PrivateBinPath is not initialized from
<probing> element). But does this explain why the assemblies are locked sometimes? Not completely.</p>
<p>Typically, garbage collection is able to determine if an assembly should be unloaded if there are no more references to its contents. You can ensure that the unload attempt happens right away with GC.Collect(). However, if references to the assembly exist, then GC will not unload the assembly, and since there is no shadow copy, the result is a locked file. If you are recompiling in <cite>VS.Net</cite> and the file is still locked, it may indicate that there is a problem with your code &#8230; i.e. something has a reference to &#8220;something&#8221; in your assembly after the <cite>ASP.Net</cite> page execution is complete. Or, it may not be your code, but <cite>VS.Net</cite> that has locked the assembly.</p>
<p>I tested with several assemblies that were being used on the page, but were not in the bin folder. Even though these assemblies were not shadow copied, I did not have a problem with them being locked (i.e. an attempt to delete or rename the file works). I could compile/debug etc. with no problem. I suppose it&#8217;s only a matter of time before I encounter this issue. Is this one of those <cite>VS.Net</cite> quirks? </p>
<p>Bottom line, there is no quick fix. The &#8220;iisreset&#8221; command will take care of the locked DLL problem, but then it re-creates the problem that keeping the assemblies in the folder was trying to solve in the first place (i.e. app restart delay). If it does not happen too often, then keeping a command window open and typing iisreset may be the simplest fix (for now).</p>
<p>Working through this problem, I had a thought. What if <cite>DNN</cite> were to manage the assembly loading and unloading for modules? This would not only allow assemblies to be placed in their respective module folders, but would also solve the problem of <cite>DNN</cite> DLL-Hell. During development, it would also solve the problem of assemblies being locked as the assembly shadow copying could be enabled when the assembly is loaded on-the-fly.</p>
<p>I don&#8217;t know the answer, but it&#8217;s an experiment I&#8217;ll add to my To-Do list.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2006/09/locked-assemblies-when-using-probing-privatepath/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speeding-up DNN Module Development</title>
		<link>http://www.kalyani.com/2006/08/speeding-up-dnn-module-development/</link>
		<comments>http://www.kalyani.com/2006/08/speeding-up-dnn-module-development/#comments</comments>
		<pubDate>Wed, 16 Aug 2006 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/143/Speeding-up-DNN-Module-Development.aspx</guid>
		<description><![CDATA[On the DotNetNuke forums today, jstemper posed a question about how to speed up DNN development, specifically, the delay caused by app re-start when a module is recompiled. I have invested a considerable amount of time researching the intricacies of Fusion probing to faciliate the co-existence of third-party assemblies with different versions in the same <a href='http://www.kalyani.com/2006/08/speeding-up-dnn-module-development/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>On the <cite>DotNetNuke</cite> forums today, <em>jstemper</em> <a href="http://dotnetnuke.com/Community/ForumsDotNetNuke/tabid/795/mid/2108/forumid/110/threadid/62660/scope/posts/Default.aspx#62781" target=_blank>posed a question</a> about how to speed up <cite>DNN</cite> development, specifically, the delay caused by app re-start when a module is recompiled.</p>
<p>I have invested a considerable amount of time researching the intricacies of Fusion probing to faciliate the co-existence of third-party assemblies with different versions in the same bin folder. In an earlier post on <a href="http://www.devtao.com/2005/06/13/Managing+Assembly+Versions+In+ASPNet.aspx" target=_blank>Managing assembly versions in ASP.Net</a> I had provided tips on doing this. Reading this post got me thinking about applying the same technique for DNN development. I did a quick test and everything seems to work. Here is how you can speed-up <cite>DNN</cite> module development by skipping the app restart that occurs when assemblies in the &#8220;bin&#8221; folder are updated.</p>
<p>1) Create a &#8220;bin&#8221; folder under ~/DesktopModules (i.e. ~/DesktopModules/bin)</p>
<p>2) Modify your <cite>DNN</cite> web.config as follows:</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<style type=text/css>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}</p>
<p>.csharpcode pre { margin: 0em; }</p>
<p>.csharpcode .rem { color: #008000; }</p>
<p>.csharpcode .kwrd { color: #0000ff; }</p>
<p>.csharpcode .str { color: #006080; }</p>
<p>.csharpcode .op { color: #0000c0; }</p>
<p>.csharpcode .preproc { color: #cc6633; }</p>
<p>.csharpcode .asp { background-color: #ffff00; }</p>
<p>.csharpcode .<cite>html</cite> { color: #800000; }</p>
<p>.csharpcode .attr { color: #ff0000; }</p>
<p>.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}</p>
<p>.csharpcode .lnum { color: #606060; }
</style>
<pre class=csharpcode>            <span class=kwrd><</span><span class=html>runtime</span><span class=kwrd>></span>
              <span class=kwrd><</span><span class=html>assemblyBinding</span> <span class=attr>xmlns</span><span class=kwrd>="urn:schemas-microsoft-com:asm.v1"</span><span class=kwrd>></span>
                   <span class=kwrd><</span><span class=html>probing</span> <span class=attr>privatePath</span><span class=kwrd>="bin;DesktopModules\bin"</span> <span class=kwrd>/></span>
              <span class=kwrd></</span><span class=html>assemblyBinding</span><span class=kwrd>></span>
           <span class=kwrd></</span><span class=html>runtime</span><span class=kwrd>></span></pre>
<p>If you have a <runtime><assemblyBinding> section already present, just add the
<probing ... > element, otherwise, you can just add this whole block right before </configuration>.</p>
<p>The &#8220;privatePath&#8221; attribute tells Fusion where to search for assemblies referenced by an application.</p>
<p>3) Change your module&#8217;s script (ascx) file so the &#8220;Inherits&#8221; attribute includes the assembly name like this:</p>
<p><strong>Inherits=&#8221;Speerio.DNN.Modules.SkinStudio.Editor, Speerio.DNN.Modules.SkinStudio&#8221;</strong></p>
<p>This corresponds to a typename of &#8220;Speerio.DNN.Modules.SkinStudio.Editor&#8221; and an assembly file &#8220;Speerio.DNN.Modules.SkinStudio.dll&#8221; (note: the extension should not be included in the &#8220;Inherits&#8221; attribute value).</p>
<p>4) Change your module’s <cite>VS.Net</cite> project build folder to ~/DesktopModules/bin</p>
<p>That&#8217;s it. Now, when you recompile your module, there will be no application restart and the only assemblies that are converted from bytecode to native code are your module assemblies.</p>
<p>Please post a comment if you encounter any problems so I can modify the procedure if necessary.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2006/08/speeding-up-dnn-module-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SSO with DotNetNuke 4.x</title>
		<link>http://www.kalyani.com/2006/08/sso-with-dotnetnuke-4-x/</link>
		<comments>http://www.kalyani.com/2006/08/sso-with-dotnetnuke-4-x/#comments</comments>
		<pubDate>Wed, 09 Aug 2006 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/139/SSO-with-DotNetNuke-4-x.aspx</guid>
		<description><![CDATA[Starting with DotNetNuke v3.3/4.3, all dependencies on the Microsoft MemberRole assembly were removed. DotNetNuke includes a Role Provider, a Profile Provider and a Member Provider that works directly with ASP.Net membership. When the MemberRole dependency was introduced in DotNetNuke v3.x, many portal administrators who used the multi-portal Single Sign-On capability in DotNetNuke v2.x had to <a href='http://www.kalyani.com/2006/08/sso-with-dotnetnuke-4-x/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Starting with DotNetNuke v3.3/4.3, all dependencies on the <cite>Microsoft</cite> MemberRole assembly were removed. DotNetNuke includes a Role Provider, a Profile Provider and a Member Provider that works directly with <cite>ASP.Net</cite> membership. When the MemberRole dependency was introduced in DotNetNuke v3.x, many portal administrators who used the multi-<cite>portal</cite> Single Sign-On capability in <cite>DotNetNuke</cite> v2.x had to resort to third-party solutions to make SSO work across portals. With <cite>DNN</cite> v4.3 (possibly v3.3 also; I have not tested), it looks like SSO, or at least the potential for SSO is back.</p>
<p>If you add a row for a user in the UserPortals table, the user will effectively be able to authenticate seamlessly to every portal for which her/his user ID has a portal ID assigned. It’s that simple. Everything works as you would expect — roles are portal-specific; the user’s profile is portal-independent and authentication works regardless of which <cite>portal</cite> a user initially logs into.</p>
<p>Implementing a UI for administering SSO looks to be as simple as having a module where you can link/unlink users to/from portals. Nice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2006/08/sso-with-dotnetnuke-4-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;My Modules&#8221; for DNN4?</title>
		<link>http://www.kalyani.com/2006/07/my-modules-for-dnn4/</link>
		<comments>http://www.kalyani.com/2006/07/my-modules-for-dnn4/#comments</comments>
		<pubDate>Sat, 22 Jul 2006 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/136/-My-Modules-for-DNN4.aspx</guid>
		<description><![CDATA[I have had several emails from people inquiring whether I would be releasing a My Modules version for DNN4. The answer is &#8220;Yes.&#8221; I&#8217;m trying to decide if I should base it on VS.Net WAP or WSP models. If you are not familiar with these models you can learn more about them on Scott Guthrie&#8217;s <a href='http://www.kalyani.com/2006/07/my-modules-for-dnn4/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>I have had several emails from people inquiring whether I would be releasing a <a href="http://www.devtao.com/2005/02/25/Speerio+My+Modules+VSNet+Solution+For+DotNetNuke.aspx">My Modules</a> version for DNN4. The answer is &#8220;Yes.&#8221; I&#8217;m trying to decide if I should base it on <cite>VS.Net</cite> WAP or WSP models. If you are not familiar with these models you can learn more about them on <a href="http://weblogs.asp.net/scottgu/archive/2006/05/08/445742.aspx">Scott Guthrie&#8217;s blog</a>. </p>
<p>I am trying hard to be objective, but I have a strong bias for the WAP model. Granted, it makes total sense for the DNN project to follow WSP since it allows <cite>DNN</cite> to be usable with the Express series of <cite>Microsoft</cite> developer products. However this is not an important consideration for most professional developers. Also, there is a significant cost to change all my existing projects to support the WSP model and it will take quite a bit of time to migrate and test hundreds of VS.Net 2003 projects and migrate them to the WSP model. I am sure there is some ROI there, but it&#8217;s just not something that makes you sit up and take notice.</p>
<p>I have allocated some time this weekend to study the <cite>DNN</cite> Starter Kit in greater detail and make a decision on which model to follow for &#8220;My Modules.&#8221; If you have any preference on the matter, please leave a comment or contact me using the link at right.</p>
<p>   </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2006/07/my-modules-for-dnn4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tagging API for ASP.Net</title>
		<link>http://www.kalyani.com/2005/12/tagging-api-for-asp-net/</link>
		<comments>http://www.kalyani.com/2005/12/tagging-api-for-asp-net/#comments</comments>
		<pubDate>Thu, 29 Dec 2005 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/120/Tagging-API-for-ASP-Net.aspx</guid>
		<description><![CDATA[After coming up blank on a robust tagging API for ASP.Net apps, and wanting to incorporate this functionality into new versions of most Speerio products, I decided to create one. Along the way, I took a good, hard look at many websites to see how they implemented the UI for tagging. In most cases, everyone <a href='http://www.kalyani.com/2005/12/tagging-api-for-asp-net/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>After coming up blank on a robust tagging <cite>API</cite> for <cite>ASP.Net</cite> apps, and wanting to incorporate this functionality into new versions of most <cite>Speerio</cite> products, I decided to create one. Along the way, I took a good, hard look at many websites to see how they implemented the UI for tagging. In most cases, everyone ripped Flickr’s UI. This is fine, but in the process they also copied some of limitations of the Flickr UI.</p>
<p>I took a clean-slate approach and decided I wanted to communicate more than just popularity through the tag cloud. The relative age of an item is just as relevant as how often an item is tagged with a certain tag, therefore I decided to introduce the concept of “age” into my tagging API. At a glance, the tag cloud not only tells you which items are more popular, but also which ones have newer/older information.</p>
<p>This ability to convey both popularity and age through a single UI is going to be an important feature of the (clean-slate) discussion forum I am creating. Imagine if you will, a discussion forum that is devoid of categorized groups of sub-forums, with only a tag cloud for navigation. If you’re looking for a solution or an answer to a question, you can instantly find all posts relevant to a keyword of interest to you simply by clicking on it. And then, you can explore clusters of related information to find the handful of posts that are most applicable to your situation. No paging through hundreds of posts only to find content that has no bearing on your situation. And if you want to browse, just click on “age” and you’ll see the topics that have been most recently posted.</p>
<p>Getting back to the API, here’s a screen grab of the cloud which can be added to any <cite>ASP.Net</cite> page or control with one line of code. The entire UI is customizable with <cite>CSS</cite> and works identically on <cite>IE</cite> and <cite>FireFox</cite> (should work on other browsers too, but I haven’t tested).</p>
<p><img alt="Cloud1" src="/assets/cloud1.gif" border="0" /></p>
<p>I also wanted to automate the detection of clusters between tags and users. I didn’t think this was information that was relevant on the main cloud UI, so I created a context-menu which allows a user to display a cross-browser, modal dialog containing more information about the tag.</p>
<p><img alt="Cloud2" src="/assets/cloud2.gif" border="0" /></p>
<p>I’ll have more details about the tagging <cite>API</cite> soon and an online demo in the next few days.</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2005/12/tagging-api-for-asp-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Innovation and forum software</title>
		<link>http://www.kalyani.com/2005/12/innovation-and-forum-software/</link>
		<comments>http://www.kalyani.com/2005/12/innovation-and-forum-software/#comments</comments>
		<pubDate>Thu, 08 Dec 2005 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/116/Innovation-and-forum-software.aspx</guid>
		<description><![CDATA[Umair could not have made a more timely post about Yahoo’s lack of innovation. He discusses Yahoo’s “hyperimitation” and how it never really improves anything in any meaningful way. I say timely because I have now spent some time engineering a better “forums” application because I have given up on forum software available today. Many of us use web-based discussion forums everyday, <a href='http://www.kalyani.com/2005/12/innovation-and-forum-software/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bubblegeneration.com/" target="_blank">Umair</a> could not have made a more timely post about <a href="http://www.bubblegeneration.com/2005/12/imitation-is-not-strategy-or-why-yahoo.cfm" target="_blank">Yahoo’s lack of innovation</a>. He discusses Yahoo’s “hyperimitation” and how it never really improves anything in any meaningful way.</p>
<p>I say timely because I have now spent some time engineering a better “forums” application because I have given up on forum software available today. Many of us use web-based discussion forums everyday, and they are <em>all</em> the same. From the common seed of BBS many years ago, there evolved a design for web discussions — forum groups, forums, threads and posts. It all worked quite well until <em>everybody</em> had a computer, a browser, an Internet connection and an opinion. This has resulted in three major problems:</p>
<p>– It’s hard to keep up with the volume of information. With hundreds and sometimes thousands of posts in different forums, across different sites, how does one track information of interest and more importantly relevance. Email digests and email subscriptions don’t cut it. They just move the information to different client software. If you track even 3–5 busy forums, you will be innundated with information.</p>
<p>– It’s hard to find relevant information. Forums are notoriously hard to search because there is no meaningful way to perform contextual searches. Users freely post anything (even in moderated forums) and there is no guarantee that threads will stay focused on a topic. Keyword searches yield tons of results and out of frustration, users will often just post a question which has already been answered umpteen times.</p>
<p>– It’s hard to tell which user’s posts are worth reading. Just because a particular user has a high post count does not make them interesting, relevant or for that matter, credible. For instance, there are many users on the <cite>ASP.Net</cite> forums with huge post counts that have very little substance in their posts.</p>
<p>As some of you may have noticed, I have not been very active blogging or on the forums lately. And yes, I am also behind on releasing updates to some of <cite>Speerio</cite> products. This is because I have been hard at work doing a fair amount of re-architechting of existing products, while also working on a <cite>Speerio</cite> product suite called “Community Studio” (more on that next week). One of the apps in the suite is a discussion application. In working out the design for this app, I was tempted to take the interaction metaphor used by most most forums today and implement it, perhaps with some U.I. goodies to make things interesting. But the more I thought about it, the more I disliked this idea. There is no point in replicating a bad concept with a good U.I. — all it does is give you more of the same problems, albeit with better user interaction. A good example of this is the recent upgrades made to the <cite>ASP.net</cite> forums. Many client-side U.I. enhancements, but none that substantially help with usability and easily finding relevant information.</p>
<p>I decided that I would take a fresh approach to designing a web-based discussion application (I’m not going to call it a forum any more). Starting with a clean slate, I prioritized some key requirements —</p>
<p>1) The application should enable a user to instantly know what topics are discussed the most.</p>
<p>2) The application should enable a user to instantly find all discussions on a topic, prioritized by relevance, chronology or amount of participation for all time or a user-specified period of time.</p>
<p>3) The application should enable the user to be notified when more discussions about topics of interest to her/him emerge.</p>
<p>4) The application should provide the user with hints about contextually relevant topics that have been discussed when he/she searches for a topic.</p>
<p>5) The application should be incredibly easy to use, very responsive and should be optimized to take advantage of the one trait that is common to all web-based discussions — 99.99% of the time all content is write-once/read-many.</p>
<p>Looking at those requirements, it should be obvious that the group – forum – thread metaphor isn’t going to cut it. The more I thought about it, the more I became convinced that web-discussion applications have been over-engineered and the solution is not to add, but to subtract. Doing just that, I arrived at a design that is quite different from today’s discussion software, but which I think meets all the above requirements. I’ll go into detail in a later blog post, but let me share some high-level ideas here:</p>
<p>1) Information navigation is done using a folksonomy-generated tag cloud.</p>
<p>2) There are no groups or sub-groups or forums…only a flat collection of discussions (100 or 1,000,000…doesn’t matter)</p>
<p>3) Each discussion is natively stored as an RSS feed. A discussion is the originating post and all responses to that post. There is no hierarchical thread, just a linear series of responses.</p>
<p>4) Each user who posts a response, must tag her/his response with tags that are relevant to the content of her/his post. This is key because contextual relevancy is best determined by humans and not computers (at least given today’s technology).</p>
<p>5) Tag clusters are automatically created for contextual relevancy.</p>
<p>This, in a nutshell, is a design that meets all the requirements. Of course, there is a lot of detail in the implementation and the U.I., but from a 20,000–foot perspective, the design is very, very simple. While technical gurus are busy arguing the merits of a folksonomy over structured taxonomies, ordinary people are enjoying their ease of use, both for content creation and retrieval. This makes me confident that even though my folksonomy-based discussion app will take some getting used to, once users see how it makes web-based discussions easier to track, digest and retrieve, they will love it.</p>
<p>More design details and information on Community Studio to follow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2005/12/innovation-and-forum-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XCopy deployment&#8230;but what about XCopy installation</title>
		<link>http://www.kalyani.com/2005/11/xcopy-deployment-but-what-about-xcopy-installation/</link>
		<comments>http://www.kalyani.com/2005/11/xcopy-deployment-but-what-about-xcopy-installation/#comments</comments>
		<pubDate>Tue, 01 Nov 2005 08:00:00 +0000</pubDate>
		<dc:creator>nik</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://www.techbubble.net/Blog/tabid/57/EntryId/109/XCopy-deployment-but-what-about-XCopy-installation.aspx</guid>
		<description><![CDATA[Like many other ASP.Net developers, I couldn’t wait to get my hands on the final VS.Net 2005, SQL 2005 and ASP.Net 2 bits off the MSDN site. This past weekend, after what seemed like an eternity, I managed to get the 4GB+ DVD images downloaded. Knowing that the installation programs would want a clean slate, I <a href='http://www.kalyani.com/2005/11/xcopy-deployment-but-what-about-xcopy-installation/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Like many other ASP.Net developers, I couldn’t wait to get my hands on the final <cite>VS.Net</cite> 2005, SQL 2005 and <cite>ASP.Net</cite> 2 bits off the <cite>MSDN</cite> site. This past weekend, after what seemed like an eternity, I managed to get the 4GB+ DVD images downloaded. Knowing that the installation programs would want a clean slate, I first uninstalled everything, including .Net 2 beta.</p>
<p>I then proceeded to install the release version of .Net 2 (small download) just to test some apps that I have sitting around. Everything worked as expected. Great!</p>
<p>When my downloads were finally completed, I proceeded to install <cite>VS.Net</cite> 2005. The install program complained right away that the old bits need to be uninstalled. And it was right…I had missed the Document Explorer. Click – click – click…it’s uninstalled. Nope…that didn’t do it. Still complaining about something.</p>
<p>I couldn’t figure it out and finally decided to take a shot in the dark and uninstall .Net 2 Release version. That did it!</p>
<p>Now, I may be exaggerating, but that is just INSANE. To require uninstallation of the .Net framework (release version) to get <cite>VS.Net</cite> 2005 installed is just plain stupid.</p>
<p>Microsoft needs to fix this, and while they are at it, can we dispense with installation programs altogether. With all the talented engineers on Microsoft’s payroll, isn’t there a small team that can replicate what has been available on the Mac for two decades now…just copy (or XCopy in Winspeak) files and you are done. <cite>Microsoft</cite> should stop trying to impress us with spiffy U.I.’s and focus on getting the basics right first. </p>
<p><strong>I want to be able to copy a folder containing an app’s files from a CD or DVD onto my computer and have the application work without sitting through five minutes of progress bar hell. (And don’t even get me started on app restarts and system reboots.)</strong></p>
<p>So Scoble and whoever else at <cite>Microsoft</cite> is listening…for the love of God…fix this!!! Free us from installation and progress bar hell. </p>
<p>Maybe we should add up all the time people worldwide have spent staring at progress bars for the last decade and send <cite>Microsoft</cite> a bill. Let’s see, if 50 million people each spent two hours waiting on app installations in the past decade and the average hourly rate is $25/hour, that’s a cool $2.5 billion. Spend even 1/1000th of that and the problem can be solved. </p>
<p>If Microsoft’s engineers were forced to evaluate features in terms of productivity dollars, Windows would be a very different beast. Too bad for us that user productivity is only a marketing mantra at Microsoft. </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kalyani.com/2005/11/xcopy-deployment-but-what-about-xcopy-installation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

