<?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/"
	>

<channel>
	<title>Thoughts, Code, Other</title>
	<atom:link href="http://www.niksmit.com/wp/index.php" rel="self" type="application/rss+xml" />
	<link>http://www.niksmit.com/wp</link>
	<description>Technical blog of Nik Smit</description>
	<pubDate>Fri, 08 May 2009 10:17:31 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>The Death of Sub-Identities</title>
		<link>http://www.niksmit.com/wp/?p=27</link>
		<comments>http://www.niksmit.com/wp/?p=27#comments</comments>
		<pubDate>Thu, 07 May 2009 21:09:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.niksmit.com/?p=27</guid>
		<description><![CDATA[  A very brief look into forces that are merging our previously distinct internet lives, and where it might take us.This article was originally written for 77agency
Sub-Identities
Being the savvy netizen you are, you have several accounts on the ‘net.  Flickr, twitter, Facebook, Dopplr, Last.fm and endless other words that meant nothing to you [...]]]></description>
			<content:encoded><![CDATA[<p> <em> A very brief look into forces that are merging our previously distinct internet lives, and where it might take us.This article was originally written for <a href="http://lab.77agency.com/social-marketing/the-death-of-sub-identities-2242/">77agency</a></em></p>
<p><strong>Sub-Identities</strong></p>
<p>Being the savvy netizen you are, you have several accounts on the ‘net.  <a class="alinks_links" title="Flickr" onclick="return alinks_click(this);" rel="external" href="http://www.flickr.com/">Flickr</a>, twitter, <a class="alinks_links" title="Facebook" onclick="return alinks_click(this);" rel="external" href="http://www.facebook.com/">Facebook</a>, Dopplr, Last.fm and endless other words that meant nothing to you 10 years ago, and continue to annoy those keen on correct spelling.  You may use these accounts daily - engaging with others and contributing to a community, or treat them as a utility. But within each sphere there is data about you. Some you willingly provide through your profile information, the rest is populated based on the actions you perform.</p>
<p>Each of these accounts is nicely cordoned off from each other.  Your colleagues at the bank may know that you tweet about financial stocks as “MrMoneyBrainz”, but they have no idea that you are the star contributor to Flickr’s kinkiest pictures group. That group in turn has no knowledge of your passion for early Abba on Last.fm (you oddball).</p>
<p>Your life on each of these separate planets form <strong>sub-identities</strong>, each expressing a part of your personality or interests in a narrow realm such as music or travel. We’re comfortable with this model as it’s exactly how we are used to managing our lives offline – our poker club friends don’t mix with our philosophy club friends. It’s simple to understand and there’s nothing to manage, except for a list of usernames and passwords longer than your arm (I recommend <a title="Roboform" href="http://www.roboform.com/php/land.php?affid=rbofr&amp;frm=frame15" target="_blank">Roboform</a>).</p>
<p><strong>Life-Streaming</strong></p>
<p>A few folks looked at this and decided we could do better. What if you wanted to show the world an integrated view of your sub-identities? <a title="Lifestream.fm" href="http://lifestream.fm/" target="_blank">Lifestream.fm</a>, <a title="Friendfeed" href="http://friendfeed.com/" target="_blank">Friendfeed </a>and <a title="Retaggr" href="http://www.retaggr.com/" target="_blank">Retaggr</a> all provide for this.  Enter all your usernames, and your activities are collated into a single stream of your life. Others can come to this place to get to know you, and connect where appropriate.</p>
<p>Interesting to watch here is the reaction to these ideas.  Some leap at the opportunity to present a more holistic view on their life – they’re typically quite open to begin with, and happy to share more.  The other contingent call it “Stalker 2.0″, and recoil in horror at the idea of becoming an open book.  More and more are falling into the first camp however - the hundreds of thousands of accounts added to Facebook and twitter every day are testament to this.  They notice that the sky hasn’t fallen, tell their friends, and the meme spreads.</p>
<p>Aggregating information like this is very useful, but still somewhat limited – I have to know both that such facilities exist, and that you are using one. The cordon between services is still somewhat in effect, and relegated to those in the know.</p>
<p><strong>Collision</strong></p>
<p>There are ways to overcome this.  You can add your Flickr account to your Facebook stream, bringing the two worlds together for your Facebook friends.  The latest Tweetdeck (a popular twitter client) integrates well with video blog 12 seconds, and ping.fm can push your status updates to almost any service you like, so your mood at any moment is known in all the communities you belong to. Your latest earworm you are listening to (again) in blip.fm can be pushed to twitter automatically. The list goes on, forming a massive matrix of connections between services.</p>
<p>Any modern web app knows that integrating with existing services is a lot easier than trying to operate as an island, and can make their service instantly more useful.  It makes sense to give their users a chance to link their accounts in some way.</p>
<p>Every time someone does so, their sub-identities become less distinct, and we become more comfortable with the idea.</p>
<p><strong>Laziness makes walls fall</strong></p>
<p>So clearly the trend is for the walls between your sub-identities to come down.  It’s still voluntary of course - you have to opt-in to connect your sub-identities, and you have to know that such facilities exist.  But we’ve not accounted for a key catalyst in human progress yet: laziness (or to be more generously, “convenience”).</p>
<p>I simply don’t have time to upload photos to both Flickr and Facebook.  And my common friends on both systems don’t have time to be notified twice about the same new photos from me.  I don’t want to add the same (real) person on 10 different platforms as a “friend” - once should be enough. I don’t want to have to log into 10 different systems in addition to email to answer messages. My hunch is that most feel the same.</p>
<p>Wouldn’t it be great if the cornucopia of platforms could continue to proliferate, but differentiate purely on their own innovations? Trying to convince users they need another messaging system, another list of distinct “friends”, and yet another username seems like an unnecessary hurdle.  Web developers would prefer to focus on creating interesting functionality.</p>
<p><strong>Integration</strong></p>
<p>Enter <a title="Facebook Connect" href="http://developers.facebook.com/connect.php" target="_blank">Facebook Connect</a>. A system for both single-signon (no more usernames and passwords for every service) <strong>and </strong>a mechanism to push your activities to a central place (Facebook).  This is really important.  In one fell swoop it touches our laziness nerve, and brings a form of integrated life-streaming to the non-geeky masses. Facebook’s user momentum is currently so significant that achieving critical mass (becoming the de-facto login on any site) is not unthinkable. Instead of holding a smorgasbord of accounts, you hold one, and use it everywhere to interact.</p>
<p><strong>Monopoly 2.0?</strong></p>
<p>A closed, proprietary system like this is the antithesis of what the internet was founded on.  Your online life becomes controlled by one entity, which doesn’t even bother with a warm fuzzy motto like “don’t be evil”.  It’s therefore conceivable, and preferable, that we end up with two or three similar systems of this nature. They can compete on minor points, but must be largely interoperable. Anything is game for use as competitive advantage, but history shows us that interoperability is usually unavoidable eventually. Web developers for one will scream bloody murder at having to facilitate logging in via too many disparate systems.</p>
<p><strong>One Identity to rule them all</strong></p>
<p>Whether the mechanics of all this revolve around a monopoly, oligopoly, or a completely federated system, the norm will become to forgo distinct sub-identities.  (For privacy reasons, you might retain one or two sub-identities that are unconnected to your main profile, but they will be the exception). What effects might this have?</p>
<ul>
<li>Your social graph is more tightly integrated with your communities.  You may love or hate this.  You’ll like the serendipitous crossing of lives (a school-friend you added on Bebo years ago notices your Dopplr update about being in town, you meet for coffee and decide to form a company), and greater opportunities (an associate didn’t realize you were such an expert in goose mating rituals until you tweeted about it, and recommends you for that job at the zoo you’ve always wanted).  You might dislike potential mates knowing about your obsession with stamps.</li>
<li>You’ll appreciate the integrated view of the people in your life, from business associates to family, all managed through the same portal.  The software we use to view this integrated life will have to raise its game significantly. With all this data, we’ll need much better ways of categorizing people (some of it done automatically), more intelligent news feeds, and vastly improved methods of alerting us appropriately about activities.</li>
<li> Other “utility” upsides become easier to implement. For example, events and contact details are exchanged, synced, and kept up to date with no effort. Later this allows computers to be told “schedule a beer with Dave sometime next week when we both have time”, and it can handle the whole process, even though “Dave” is an entity on a completely different platform.</li>
<li>A unified identity, against your real name, alters the atmosphere on the internet.  Again, this is spurred on by convenience.  If a blog implements Facebook Connect, you can sign up and comment on an article in seconds. If not, you might have to do the whole “pick a username and password and check it’s all ok and then confirm your email address” song and dance.  A hassle, with the only upside being the <strong>option </strong>for anonymity, by using fake credentials.  Most will opt for the former, and we go from defaulting to potential anonymity, to defaulting to accountability.  Almost accidentally, we might get more engagement and contributions to online communities (currently less than 10% <a title="Jacob Nielsen's alertbox" href="http://www.useit.com/alertbox/participation_inequality.html" target="_blank">contribute</a>).  Less lurking, and less <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Internet_troll" target="_blank">trolling</a> - a great thing.</li>
<li>The subtly different faces you maintain for different groups of people in your life will erode. Everyone from your place of worship will know that you listen to hardcore death metal. Despite being a powerful business-person, your childish penchant for<a title="Lolcats" href="http://en.wikipedia.org/wiki/Lolcat" target="_blank"> lolcats </a>will be common knowledge.  Your grandmother could be revered for her extensive knowledge about dark <a title="Dubstep" href="http://en.wikipedia.org/wiki/Dubstep" target="_blank">dubstep</a>. Our stereotypes may be forced to bend or break to accommodate all this.</li>
</ul>
<p><strong>But what about privacy?</strong></p>
<p>This is where things get interesting.  With all our interests and activities collated, we’ll be faced with new challenges on how to decide who gets to see all this data. We’ll be rightly concerned with stalking, ID theft, and having information used against you later - <span class="alinks_links">Google</span> never forgets.  We’ll face a choice:</p>
<ul>
<li>Demand micro control privacy knobs on everything. We set exactly what is seen, by whom, when, at what level of detail. Technically somewhat feasible, but wildly impractical.  Having complex rule systems (or choosing privacy settings on every action) is too much hassle and too complex for everyday use. The use of groups may prove too inflexible.</li>
<li>Evolve our ideas about what privacy really means. This is a complex issue, but a quick comment is justified. Our society seems to tolerate a gap between what is acceptable to portray in public, and what is acceptable behind closed doors (unless you’re a celebrity).  Perhaps we’ll find that this gap actually doesn’t make sense, and some of our basic ideas about what privacy is, are founded on a gap that does us no good to begin with.  A meritocracy, less obsessed with personal preferences, might flourish.  See <a title="David Brin Amazon" href="http://www.amazon.com/dp/0738201448?tag=davidbrinsoff-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0738201448&amp;adid=00P9X45J4R2AY3SD1BQS&amp;" target="_blank">David Brin’s</a> work for ideas about a more transparent society.</li>
<li>Drop off the grid entirely. “Facebook suicide” already happens, and faced with a new world of confusing choices, some will pick the blue pill in desperation. If current peer pressure is anything to go by, this option will become increasingly difficult.  Once we start to organize our diaries automatically, it will amount to becoming a hermit.</li>
</ul>
<p>A rough hybrid of the first two options – if you’re not my “friend” you see basic info, otherwise you see everything – seems likely to be taken up by most.  Remember that by the time today’s toddlers start using online social systems, the sub-identity concept may seem genuinely archaic, anti-social, or even just unknown.</p>
<p><strong>To boldly go</strong></p>
<p>We’ll have to wait and see exactly how this pans out, but I’m optimistic. I see some interesting positive social effects potentially emerging (that might spill over to the offline realm) and great personal benefits and opportunities. New challenges, and a requirement to adapt to the unfamiliar also await, and will test us in unforeseen ways.</p>
<p>I’ve only lightly touched on some very big issues here, but the identity genie is out of the bottle. It’s up to us to adapt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=27</wfw:commentRss>
		</item>
		<item>
		<title>Quick Tip - Visual Studio Tracking Active Item Bug</title>
		<link>http://www.niksmit.com/wp/?p=22</link>
		<comments>http://www.niksmit.com/wp/?p=22#comments</comments>
		<pubDate>Thu, 16 Apr 2009 14:04:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<guid isPermaLink="false">http://www.niksmit.com/?p=22</guid>
		<description><![CDATA[Something that bugs me at least once a week is Visual Studio spontaneously "forgetting" that you'd like to track the active item (when you change files with cntrl-tab, your solution explorer updates accordingly).
I've always dug into Tools -&#62; Options-&#62; Projects and Solutions to fix this (usually with a small yelp of annoyance).  Turns out [...]]]></description>
			<content:encoded><![CDATA[<p>Something that bugs me at least once a week is Visual Studio spontaneously "forgetting" that you'd like to track the active item (when you change files with cntrl-tab, your solution explorer updates accordingly).</p>
<p>I've always dug into Tools -&gt; Options-&gt; Projects and Solutions to fix this (usually with a small yelp of annoyance).  Turns out you can now bind a keyboard command directly to it, without having to write a macro as other <a href="http://dvanderboom.wordpress.com/2008/03/21/visual-studio-macro-track-item-in-solution-explorer-on-demand/">have had to resort to</a>. Tools -&gt; Environment -&gt; Keyboard. Look for View.TrackActivityinSolutionExplorer and bind it to something useful, and toggle at will.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=22</wfw:commentRss>
		</item>
		<item>
		<title>Developing with ASP.Net MVC Preview 2 and MVC RTM, side by side.</title>
		<link>http://www.niksmit.com/wp/?p=21</link>
		<comments>http://www.niksmit.com/wp/?p=21#comments</comments>
		<pubDate>Mon, 30 Mar 2009 10:24:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<guid isPermaLink="false">http://www.niksmit.com/?p=21</guid>
		<description><![CDATA[Retaggr is built on ASP.Net MVC Preview 2.  We've been delighted with how well it's stood up, being an effectively alpha technology.  Actually this is not that surprising - the MS MVC implementation is really just a few thin layers on top of regular ASP.Net.  Those layers are awesome though, and Phil [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.retaggr.com">Retaggr</a> is built on ASP.Net MVC Preview 2.  We've been delighted with how well it's stood up, being an effectively alpha technology.  Actually this is not that surprising - the MS MVC implementation is really just a few thin layers on top of regular ASP.Net.  Those layers are awesome though, and Phil Haack and co. deserve heaps of praise.</p>
<p>So we've had no real problems, the only issue is upgrading alpha tech as they become beta, and ultimately, the final product. Retaggr got stuck on Preview 2, the rest of the world <a href="http://haacked.com/archive/2009/03/18/aspnet-mvc-rtw.aspx">is now on RTM</a>. There's a not insignificant jump from Preview 2 to 3 that a simple search and replace won't solve, so it's put off until a rainy day. I do however now need to do development on the same machine, using MVC RTM.</p>
<p>If you're in the same situation,  these steps may help you.</p>
<p>You may want to create a restore point, and backup of your registry at each step, just in case something goes catastrophically wrong.  The usual <a href="http://www.codinghorror.com/blog/archives/000818.html">works on my machine</a> disclaimer applies, and the machine in question is Vista.</p>
<p><img style="float:right;margin:10px 0px 10px 10px" src="http://www.niksmit.com/wp/wp-content/uploads/2009/03/mymachine.png" alt="" /></p>
<ul>
<li> Step 0: Copy the Preview 2 dlls (System.Web.MVC, System.Web.Abstractions, System.Web.Routing) to a known location - you'll reference them later.</li>
<li> Step 1:  Uninstall MVC Preview 2 from Programs/Features.</li>
<li> Step 2: Install .Net 3.5 Sp1. Reboot.</li>
<li> Step 3 : Install MVC RTM.  You now have a MVC RTM machine, but no Preview 2 support.</li>
<li> Step 4 : Open regedit to<br />
hkey_classes_root\installer\assemblies\global, and delete the references to System.Web.MVC, System.Web.Abstractions and System.Web.Routing.  The MVC RTM installer creates a dependency on these items which we have to manually remove, otherwise the next step would fail.</li>
<li> Step 5 : Using gacutil (or windows explorer to c:\windows\assemblies), uninstall the 3.5 versions of System.Web.MVC, System.Web.Abstractions, System.Web.Routing. (In explorer, you can just hit delete).</li>
</ul>
<p>The key issue we just got around was that the runtime looks to the GAC first to resolve the mvc dlls.  With them removed, we can now bin deploy which ever MVC version we need.</p>
<p>Open up your preview 2 project, and remove the references to the 3 dlls mentioned before.  Replace them with references to the dlls you copied in the first step.  Your project should now compile fine, and you can xcopy deploy.</p>
<p>To test RTM is working correctly, create a new ASP.Net MVC Web Application in Visual Studio.  If you look at the references for the 3 key dlls, they're to c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\, which suits us just fine. Because they're gone from the GAC, set those 3 "Copy Local" to true, so they'll come along for the ride when you build and deploy.</p>
<p>You should now be able to enjoy the new goodies in RTM, while supporting your Preview 2 apps.</p>
<p>Note that the Visual Studio new item templates (for creating controllers, views, and such) will not compile on preview 2, but are trivial to implement yourself (replacing "ActionResult" for "void", and similar).   You can actually modify these templates (they're built using <a href="http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx">t4</a>) and create your own preview 2 versions - find theme in C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC\CodeTemplates</p>
<p><strong>Notes</strong></p>
<ul>
<li> If your Visual Studio now crashes when opening a view, it's not related to what we've done here. See <a href="http://haacked.com/archive/2009/03/06/hotfix-for-installing-aspnetmvc.aspx">this blog post</a> for the resolution - just need to install a patch.
</li>
<li> If you're used to specifying the View's model in the codebehind as a strongly typed class, you may be wondering what to do with RTM's new view template, which does not give you a code-behind. (I presume this change is to further "encourage" us to stick to the model-view-controller seperation of concerns paradigm).
<p>Option 1 : Create a codebehind .cs class manually, specify it in your aspx (<code>CodeBehind="MyView.aspx.cs"</code>), and then just include it in your project.</p>
<p>Option 2: You may be tempted to try this in the .aspx :<br />
<code>System.Web.Mvc.ViewPage&lt;Models.MyModel&gt;</code></p>
<p>It won't work for Preview 2 projects (it does in RTM).  <a href="http://www.squaredroot.com/post/2008/01/07/MVC-Strongly-Type-ViewPages-Without-A-Code-Behind.aspx"> This post</a> gives a workaround which you may find useful, just make sure the rest of your team understand the somewhat cryptic CLR syntax!</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=21</wfw:commentRss>
		</item>
		<item>
		<title>Subversion and changing password</title>
		<link>http://www.niksmit.com/wp/?p=20</link>
		<comments>http://www.niksmit.com/wp/?p=20#comments</comments>
		<pubDate>Sat, 14 Mar 2009 23:09:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<guid isPermaLink="false">http://www.niksmit.com/?p=20</guid>
		<description><![CDATA[For source control on my projects, I use a hosted SVN repository, tortoise, and to tie it all together in Visual Studio,  the excellent VisualSVN.   Coming from a VisualSource(Un)Safe background, it's a huge breath of fresh air.  Uncoupling your IDE from your source control has a lot of positives.  Actually [...]]]></description>
			<content:encoded><![CDATA[<p>For source control on my projects, I use a hosted SVN repository, <a href="http://tortoisesvn.tigris.org/">tortoise</a>, and to tie it all together in Visual Studio,  the excellent <a href="http://www.visualsvn.com/">VisualSVN</a>.   Coming from a VisualSource(Un)Safe background, it's a huge breath of fresh air.  Uncoupling your IDE from your source control has a lot of positives.  Actually working correctly is probably number 1.</p>
<p>Today was the first time I'd needed to change my password on the repository. Getting the client side was surprisingly obtuse. Couldn't find a "set password" anywhere, in the VisualSVN or tortoise UI.</p>
<p>SVN gives you this error :</p>
<blockquote><p>Could not open the requested SVN filesystem</p></blockquote>
<p>Turns out that tortoise caches your passwords on disk (encrypted thankfully), in the following location</p>
<p><code class="filename">~/.subversion/auth/</code> (linux), or  <code class="filename">%APPDATA%/Subversion/auth/ (windows). </code></p>
<p>To get it to prompt you to enter your new password, view each of the files in the svn.simple subdirectory, until you find the relevant one (look at the svn:realmstring line), and just delete it.</p>
<p><a href="http://www.open.collab.net/community/subversion/svnbook/svn.serverconfig.netmodel.html">More info from the Subversion book</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=20</wfw:commentRss>
		</item>
		<item>
		<title>A universal icon for language switching</title>
		<link>http://www.niksmit.com/wp/?p=18</link>
		<comments>http://www.niksmit.com/wp/?p=18#comments</comments>
		<pubDate>Tue, 10 Jun 2008 21:10:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<guid isPermaLink="false">http://www.niksmit.com/?p=18</guid>
		<description><![CDATA[Over at retaggr , we've been blown away by the interest from non-native-english speaking countries.  It really is a global village, and its fantastic to be part of that. Naturally the first thing you have to consider is regional differences, particularly in language.  You'll find a lot of resources out there about how [...]]]></description>
			<content:encoded><![CDATA[<p>Over at <a href="http://www.retaggr.com">retaggr</a> , we've been blown away by the interest from non-native-english speaking countries.  It really is a global village, and its fantastic to be part of that. Naturally the first thing you have to consider is regional differences, particularly in language.  You'll find a lot of resources out there about how to localize your web application, but what about the seemingly mundane question of what icon to use to represent the concept of "language" in  your UI?</p>
<p>This is no trivial point.  If your visitor reads only Japanese, the word "lang" will mean nothing to her, and so all your efforts to translate your page will be lost.  Guessing the presentation language based on the browser's settings is an option, but not always the best one (not in retaggr's case for example).</p>
<p>Flags don't cut it for various reasons.  You'd think that in this village of ours, we'd have a universally understood icon for this purpose.  The folks at  <a href="http://languageicons.omcomc.com/">http://languageicons.omcomc.com</a> have done exactly that.  I've inserted it below - read their site if you're interested in the motivation behind the design.</p>
<p>I think it's a great icon, and will be supporting it.  If you do to, just maybe it will become de facto.</p>
<p><a href="http://www.niksmit.com/wp/wp-content/uploads/2008/06/languageicons_r9_c9.png"><img class="alignnone size-medium wp-image-19" title="languageicons_r9_c9" src="http://www.niksmit.com/wp/wp-content/uploads/2008/06/languageicons_r9_c9.png" alt="" width="114" height="114" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=18</wfw:commentRss>
		</item>
		<item>
		<title>How to get normal 404 (Page not found) error pages using ASP.Net MVC</title>
		<link>http://www.niksmit.com/wp/?p=17</link>
		<comments>http://www.niksmit.com/wp/?p=17#comments</comments>
		<pubDate>Sat, 24 May 2008 17:55:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.niksmit.com/?p=17</guid>
		<description><![CDATA[Currently there is no built-in mechanism to achieve regular 404 error pages from an MVC app. If a user tries to access /Products/Foo, or even /Foo, and Foo is not an action, you'll get an error message, similar to this:
The controller for path '/Foo' could not be found or it does not implement the IController [...]]]></description>
			<content:encoded><![CDATA[<p>Currently there is no built-in mechanism to achieve regular 404 error pages from an MVC app. If a user tries to access /Products/Foo, or even /Foo, and Foo is not an action, you'll get an error message, similar to this:</p>
<blockquote><p><em>The controller for path '/Foo' could not be found or it does not implement the IController interface</em></p></blockquote>
<p>What we really want is to have a 404 error message generated. You can then optionally (ideally) redirect the user to a friendly error page appropriately styled for your site.</p>
<p>Fortunately the last bit we get for free with ASP.Net. Modifying your web.config to something similar to below would normally achieve this.</p>
<p><code>&lt;customErrors mode="On" defaultRedirect="/Error"&gt;<br />
&lt;error statusCode="404" redirect="My404.html" /&gt;<br />
&lt;/customErrors&gt;</code></p>
<p>But out of the box MVC (preview 2) never generates the 404 error, so this functionality never kicks in. No doubt the MVC team will rectify this in a future release, but for now let's see if we can improve things.</p>
<p>Two modifications are needed :</p>
<p>a) To handle the unknown action (/Products/Foo)<br />
b) To handle the unknown controller (/Foo)</p>
<p>a) This is the easier bit. Ensure your Controllers subclass your own common controller base class :</p>
<pre class="csharp">&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> HomeController : ControllerBase
<span style="color: #000000;">&#123;</span>
<span style="color: #008080; font-style: italic;">//..</span>
<span style="color: #000000;">&#125;</span></pre>
<p>This base class is a convenient place to put all sorts of common functionality - if you didn't need it to accomplish this particular task, you'll probably need to do it for something else, so it's good practice to have one.</p>
<pre class="csharp">&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> ControllerBase : <span style="color: #000000;">System</span>.<span style="color: #0000FF;">Web</span>.<span style="color: #0000FF;">Mvc</span>.<span style="color: #0000FF;">Controller</span>
<span style="color: #000000;">&#123;</span>
&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> HandleUnknownAction<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> actionName<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #0600FF;">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> HttpException<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">404</span>, <span style="color: #808080;">&quot;&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//...</span>
<span style="color: #000000;">&#125;</span>
&nbsp;</pre>
<p>As you can see, we override the default behaviour of Mvc.Controller, when an unknown action is specified. By throwing the 404 ourselves, we induce the default ASP.Net behaviour specified in the web.config, which is what we want - redirection to our custom error page.</p>
<p>b) Handling the unknown controller is done by changing the Current ControllerBuilder's default Controller Factory. We create our own factory that does nothing more than throw that same HttpException, in the case that the controller could not be found.</p>
<pre class="csharp">&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> IntelligentControllerFactory : <span style="color: #000000;">System</span>.<span style="color: #0000FF;">Web</span>.<span style="color: #0000FF;">Mvc</span>.<span style="color: #0000FF;">DefaultControllerFactory</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> IController CreateController<span style="color: #000000;">&#40;</span>RequestContext requestContext, <span style="color: #FF0000;">string</span> controllerName<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
IController controller = <span style="color: #0600FF;">null</span>;
<span style="color: #0600FF;">try</span>
<span style="color: #000000;">&#123;</span>
controller = <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">CreateController</span><span style="color: #000000;">&#40;</span>requestContext, controllerName<span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
<span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>ArgumentNullException ex<span style="color: #000000;">&#41;</span> <span style="color: #008080; font-style: italic;">//Note : this exception type may change with future releases</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #0600FF;">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> HttpException<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">404</span>, <span style="color: #808080;">&quot;&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">return</span> controller;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #000000;">&#125;</span>
&nbsp;</pre>
<p>Now we need to set up this factory to be used instead of the default, which is done in your global.asax.cs :</p>
<pre class="csharp">&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">void</span> Application_Start<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
&nbsp;
ControllerBuilder.<span style="color: #0000FF;">Current</span>.<span style="color: #0000FF;">SetControllerFactory</span><span style="color: #000000;">&#40;</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> IntelligentControllerFactory<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
RegisterRoutes<span style="color: #000000;">&#40;</span>RouteTable.<span style="color: #0000FF;">Routes</span><span style="color: #000000;">&#41;</span>;
<span style="color: #008080; font-style: italic;">//....</span>
<span style="color: #000000;">&#125;</span>
&nbsp;</pre>
<p>You should now be in 404 bliss.</p>
<p>If you have found a better way to achieve this, drop me a line.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=17</wfw:commentRss>
		</item>
		<item>
		<title>Essential reading for all startups</title>
		<link>http://www.niksmit.com/wp/?p=15</link>
		<comments>http://www.niksmit.com/wp/?p=15#comments</comments>
		<pubDate>Mon, 05 May 2008 22:19:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<guid isPermaLink="false">http://www.niksmit.com/?p=15</guid>
		<description><![CDATA[Software development is a very strange animal indeed.  Despite decades and decades of practice, by incredibly smart people, and with very strong incentives, we are not necessarily any closer to delivering product on time, and within budget, (oh yeah, and on-feature).  Entire forests of books have surely been sacrificed to argue one methodology [...]]]></description>
			<content:encoded><![CDATA[<p>Software development is a very strange animal indeed.  Despite decades and decades of practice, by incredibly smart people, and with very strong incentives, we are not necessarily any closer to delivering product on time, and within budget, (oh yeah, and on-feature).  Entire forests of books have surely been sacrificed to argue one methodology over another, but a truth that I believe is becoming clear is that every situation is different.  There is no String Theory here. Agile is a good example - fantastic in many scenarios, but not necessarily for every project.</p>
<p>If you're in the start-up space like we are, there is one "book" be sure to check out - <a href="http://gettingreal.37signals.com" target="_blank">"Getting Real"</a> by the folks at 37signals. If you're working for a large corporation, read it anyway  - it may not be 100% relevant, but might just convince you to leave (or stay!) <img src='http://www.niksmit.com/wp/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>I say "book" in inverted commas because it really is more a collection of thoughts (free to read online, hard copy for a price).  Their ideologies strongly centre on how to succeed within contraints, and offer great wisdom on the benefits of staying focussed on core value. Development methodology follows from their business methodology - start with the critical features, iterate quickly, and prioritise developer productivity.  <a href="http://www.joelonsoftware.com/articles/FieldGuidetoDevelopers.html" target="_blank">Joel</a> will be pleased <img src='http://www.niksmit.com/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   Other chapters offer their insights on a bunch of other issues we all face whilst in Start-Up land- thoroughly recommended.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=15</wfw:commentRss>
		</item>
		<item>
		<title>Some quick tips to speed up Visual Studio and help you develop faster</title>
		<link>http://www.niksmit.com/wp/?p=14</link>
		<comments>http://www.niksmit.com/wp/?p=14#comments</comments>
		<pubDate>Mon, 05 May 2008 19:11:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.niksmit.com/?p=14</guid>
		<description><![CDATA[If you work with Visual Studio all day long, at some point you've just wanted it to go just that little bit faster. Don't get me wrong, it's certainly not a slow tool by any means, but if you're working with the same tool all day long, even minor improvements can add up to a [...]]]></description>
			<content:encoded><![CDATA[<p>If you work with Visual Studio all day long, at some point you've just wanted it to go just that little bit <strong>faster. </strong>Don't get me wrong, it's certainly not a slow tool by any means, but if you're working with the same tool all day long, even minor improvements can add up to a significant amount over time.</p>
<p>Adding as much RAM as you can afford, using 10000 RPM drives, and using a dual core processor are the best things you can do hardware wise (in that order).  Turning off anti-virus software (if you dare), and physically separating your data and OS also goes a long way.  These things are all very well documented elsewhere.</p>
<p>But there are others ways to get you out of the office earlier, that don't require pulling out your credit card.</p>
<p>Have a look at your habits and processes while developing - particularly the ones you repeat a million times a day. Investing a bit of time to improve these can yield some good ROI in terms of efficiency.</p>
<p><strong>Keyboard shortcuts = Speed<br />
</strong></p>
<p>Every function in visual studio is exposed as a command that you can bind to (right click any toolbar, customize, keyboard....).  Take note of what you do most often, and ensure those commands are bound.  Of course, obvious tasks like building your project should be mapped to something comfortable on your keyboard (I use Alt-1).</p>
<p>But you'll probably find that navigating your way around your mega-solution keeps requiring some mouse action. The more you keep your hands on the keyboard, the faster you go, so ensure you are aware of at least the following commands :</p>
<ul>
<li>Edit.GoToDefinition (F12).</li>
<li>View.NavigateBackward ( cntrl -).  Great for returning to where you were working before navigating to that definition</li>
<li>Drop Bookmark (cntrl-k, cntrl-k)</li>
<li>Go to next bookmark (cntrl-k, cntrl-n)</li>
<li>Open window list (alt-w, w).  With many windows open, this dialogue is a lot quicker than cntrl-tabbing around, as you can jump to the correct file by using its first letter).</li>
<li>Go to code behind : F7</li>
<li>Go to visual designer from ode behind : Shift-F7 (Unless you actually use the visual html designer, dont use this - the rendering is too slow).</li>
<li>Go to html source view from visual designer (cntrl-pg dn)</li>
</ul>
<p><strong>Cntl-F can be sped up</strong></p>
<p>Often you know exactly where you need to be in your file.  There's a specific piece of text (probably a function name) that'll get you there quickly if you search for it with cntrl-F.  I do this a million times a day.  But with VS 2008 (and I think with 2005) bringing up that search dialogue takes about a second for no good reason.  It really should be instant - if you do 300 searches in a day, that amounts to time for another cup of coffee.  I would hope this is fixed in a service pack, but until it is, dock that dialogue somewhere.  I dock it with my solution explorer (bring it back to the fore with cntrl-alt-l).   With it docked, its never destroyed, and hitting cntrl-f just brings it to the foreground quickly.</p>
<p><strong>Use aliases in the command window</strong></p>
<p>I'd forgotten about this powerful feature until recently.  All those commands above can be accessed from the command window. Call it up with cntrl-alt-a.  If you've ever used the console in Quake, this is the same concept.   All the commands are exposed for you to play with (use the intellisense!), so typing</p>
<p><em>File.OpenFile MyProject\Web.config</em></p>
<p>will unsurprisingly open web.config for you to edit  (Intellisense is there for the filename too).  While that may seem like a step backward in terms of speed, if you know the exact file you're trying to open, it can be a lot quicker to type that than navigating through a bunch of projects and folders.  Plus, it gets better.</p>
<p>Any command can be <em>aliased</em>.  So executing</p>
<p><em>alias o File.OpenFile</em></p>
<p>means we can now type</p>
<p><em>o MyProject\Web.config</em></p>
<p>to open that same file!  We can go further though.  Perhaps you have a bunch of files you need to access all the time.  For me these include web.configs, the main css file, the main javascript file and so on.</p>
<p>Try something like this :</p>
<p><em>alias css File.OpenFile MyProject\content\style\main.css</em></p>
<p>(To delete that alias execute <em>alias css /delete</em>)</p>
<p>One could go wild here - I'm not trying to say alias everything.  Just optimize those you're doing often (especially those that currently involve the mouse). Which brings me to....</p>
<p><strong>Web developers!  Bind a macro for attaching to the w3p process</strong></p>
<p>Some web developers test their pages by hitting F5 and launching Visual Studio's built in Casini web server.  I've never liked this approach:</p>
<p>a) I prefer to navigate around my site and then decide I need to do some debugging at that point (its taken a bunch of steps to get to this point)</p>
<p>b) I like the warm fuzzy feeling of knowing there are no surprises at deploy time, so would rather use IIS7 proper.</p>
<p>So the process is easy - just call up Visual Studio's "attach to process" dialog, find w3p.exe, attach, and you're in business.  I think you can guess where I'm going with this - that just takes too long.  Sometimes enumerating all those processes seems to take forever in the dialogue, which is kinda silly when you know the one you want.</p>
<p>The solution is to use a macro for this purpose, and bind it to a keyboard shortcut.  You're attached in a second or two - lovely!   Hit Alt-F11 to bring up your macro editor, and drop this into a new module.</p>
<pre class="vb">&nbsp;
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.<span style="color: #66cc66;">IO</span>
<span style="color: #b1b100;">Public</span> Module Misc
 <span style="color: #b1b100;">Public</span> <span style="color: #b1b100;">Sub</span> AttachToFirstDevWebServer<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #b1b100;">Dim</span> process <span style="color: #b1b100;">As</span> EnvDTE.<span style="color: #66cc66;">Process</span>
<span style="color: #b1b100;">For</span> Each process In DTE.<span style="color: #66cc66;">Debugger</span>.<span style="color: #66cc66;">LocalProcesses</span>
 System.<span style="color: #66cc66;">Diagnostics</span>.<span style="color: #66cc66;">Debug</span>.<span style="color: #b1b100;">Print</span><span style="color: #66cc66;">&#40;</span>process.<span style="color: #b1b100;">Name</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #b1b100;">If</span> <span style="color: #66cc66;">&#40;</span>Path.<span style="color: #66cc66;">GetFileName</span><span style="color: #66cc66;">&#40;</span>process.<span style="color: #b1b100;">Name</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #66cc66;">ToLower</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #ff0000;">&quot;w3wp.exe&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">Then</span>
 process.<span style="color: #66cc66;">Attach</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #b1b100;">Exit</span> <span style="color: #b1b100;">Sub</span>
 <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">If</span>
 <span style="color: #b1b100;">Next</span>
<span style="color: #b1b100;">MsgBox</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Could not find web server&quot;</span><span style="color: #66cc66;">&#41;</span>
 <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">Sub</span>
<span style="color: #b1b100;">End</span> Module
&nbsp;</pre>
<p>Note : if you are<strong> </strong>using the built-in server, you can still get the benefits of this, by swapping  out "w3p.exe" for "WebDev.WebServer.exe" in the macro.</p>
<p>I'll be posting more on this topic in future. Until then, drop me a line if you have any cunning efficiency tips <img src='http://www.niksmit.com/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=14</wfw:commentRss>
		</item>
		<item>
		<title>IIS Redirect with Query String</title>
		<link>http://www.niksmit.com/wp/?p=8</link>
		<comments>http://www.niksmit.com/wp/?p=8#comments</comments>
		<pubDate>Wed, 16 Apr 2008 22:11:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<guid isPermaLink="false">http://www.niksmit.com/wp/?p=8</guid>
		<description><![CDATA[Wow, a very long time since my last post.  The vagaries of being heavily involved in a project!  The upside is that one picks up loads of new knowledge with each different application you write.
Quick IIS tip
One can set up a website in IIS to redirect to another quite easily.  This is [...]]]></description>
			<content:encoded><![CDATA[<p>Wow, a very long time since my last post.  The vagaries of being heavily involved in a project!  The upside is that one picks up loads of new knowledge with each different application you write.</p>
<p><strong>Quick IIS tip</strong></p>
<p>One can set up a website in IIS to redirect to another quite easily.  This is useful in a variety of scenarios.  However, the UI doesn't give you a way to include the path and querystring.</p>
<p>So if your original url was :</p>
<p><a href="../../dasblog/ct.ashx?id=15575f1f-3ce0-4aa3-af16-46275a75aa21&amp;url=http%3a%2f%2folddomain.com%2fExample%3fid%3d2134">http://olddomain.com/Example?id=2134</a></p>
<p>the best you'll get after is :</p>
<p><a href="../../dasblog/ct.ashx?id=15575f1f-3ce0-4aa3-af16-46275a75aa21&amp;url=http%3a%2f%2fnewdomain.com%2fMyExplicitRedirectLocation">http://newdomain.com/MyExplicitRedirectLocation</a></p>
<p>Which is only useful in a fraction of scenarios.</p>
<p>To get the path and querystring, append  "<strong>$S$Q</strong>"  (no quotes) to your target URL, and check the box "redirect all requests to exact location".</p>
<p>This will translate your incoming url to :</p>
<p><a href="../../dasblog/ct.ashx?id=15575f1f-3ce0-4aa3-af16-46275a75aa21&amp;url=http%3a%2f%2fnewdomain.com%2fExample%3fid%3d2134">http://newdomain.com/Example?id=2134</a></p>
<p>which is probably what you want.</p>
<p><a href="http://www.niksmit.com/wp/wp-content/uploads/2008/04/iis.jpg"><img class="alignleft size-full wp-image-10" title="iis" src="http://www.niksmit.com/wp/wp-content/uploads/2008/04/iis.jpg" alt="" width="500" height="283" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=8</wfw:commentRss>
		</item>
		<item>
		<title>IE8 passes ACID 2 test - HTML settles in for the long haul</title>
		<link>http://www.niksmit.com/wp/?p=7</link>
		<comments>http://www.niksmit.com/wp/?p=7#comments</comments>
		<pubDate>Sun, 13 Jan 2008 22:55:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<guid isPermaLink="false">http://www.niksmit.com/wp/?p=7</guid>
		<description><![CDATA[News from the Internet Explorer team - latest builds of IE8 are passing the ACID 2 test. See General Manager Dean Hachamovitch's post about this important milestone for IE8. 
Developers everywhere love these kinds of announcements - interoperability makes everyone’s lives (even those of users!) better.  The browser wars are definitely back on, just [...]]]></description>
			<content:encoded><![CDATA[<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">News from the Internet Explorer team - latest builds of IE8 are passing the <a href="../../dasblog/ct.ashx?id=155d6f06-4ce7-45b3-b28f-f14ab1d242ca&amp;url=http%3a%2f%2fwww.webstandards.org%2faction%2facid2%2f">ACID 2 test</a>. See General Manager Dean Hachamovitch's <a href="../../dasblog/ct.ashx?id=155d6f06-4ce7-45b3-b28f-f14ab1d242ca&amp;url=http%3a%2f%2fblogs.msdn.com%2fie%2farchive%2f2007%2f12%2f19%2finternet-explorer-8-and-acid2-a-milestone.aspx">post </a>about this important milestone for IE8. </span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">Developers everywhere love these kinds of announcements - interoperability makes everyone’s lives (even those of users!) better.  The browser wars are definitely back on, just when we all thought the web was dead, or had at least hit its innovation peaked.<span> </span></span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">I was entering angle brackets, tags, and javascript code into text editors more than 10 years ago in order to create web sites.<span> </span>Today we call them “web applications” – the lexical adjustment necessary to reflect how their capabilities have moved on.<span> </span>The server side has changed immeasurably to make this happen (remember CGI anyone?). </span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">But from a presentation layer perspective, things aren’t all that different today- HTML and Javascript themselves are essentially the same as they were back then. </span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">Sure, today we can drag and drop controls onto a design surface and get great template support for those server controls, but there’s a backlash of sorts to that.<span> </span>Check out the <a href="../../dasblog/ct.ashx?id=155d6f06-4ce7-45b3-b28f-f14ab1d242ca&amp;url=http%3a%2f%2fweblogs.asp.net%2fscottgu%2farchive%2f2007%2f10%2f14%2fasp-net-mvc-framework.aspx">MVC framework</a> for a model that (amongst other things) allows the developer to stick to old school HTML coding, while retaining the modern facilities that ASP.Net brings.</span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">So, much to my surprise, I find myself writing HTML and Javascript today more than ever. <span> </span>Yet the experience is entirely different, mostly because of improvements in <em>tools</em>.<span> </span></span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">The difference between Visual Studio 2008 and notepad is obvious of course, but I would argue that the biggest impact on the experience of coding web UIs has been improvements in coding libraries.<span> </span>Sites bristling with swish interactivity and great functionality have become infinitely easier with the arrival of libraries like prototype, <span> </span>mootools, ASP.Net Ajax, and my personal favourite <a href="../../dasblog/ct.ashx?id=155d6f06-4ce7-45b3-b28f-f14ab1d242ca&amp;url=http%3a%2f%2fwww.jquery.com%2f"><span style="color: #0000ff;">jQuery</span></a>. </span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">If you’ve never tried jQuery, make sure you do – you’ll never go back, and wonder how you managed without it.<span> </span>Productivity soars and your creativity is let loose, simply by making things easier.<span> </span>They do this by simplifying things like animation and so on, but critically they do this by normalizing the differences between browsers.<span> </span>They standardize the event object, allow cross browser event attaching in a consistent manner, and present a browser agnostic interface to UI elements.</span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">Suddenly the arduous task of supporting multiple browsers is almost ameliorated -<em>just at the time when browsers are becoming standards compliant! </em>Of course the happy day when everyone uses a perfectly standards-compliant browser is years off (if ever) so we’ll still need such libraries until then.<span> </span>But the further irony is that I know of no reason why these libraries <em>could not have been developed years ago</em>.<span> </span>I can only imagine how many hairs I would still possess if I hadn’t pulled them out over some arcane difference between IE x.5 and IE y.1 and Netscape z.0!</span></span></p>
<p><span style=" color: #003300; font-family: 'Verdana','sans-serif';"><span style="color: #808080;">HTML continues to hold its own, and with continued improvements in the ecosystem like ACID compliance, there’s no reason why it shouldn’t continue to do so.<span> </span>The semantic web is the Next Big Thing, and concepts like <a href="../../dasblog/ct.ashx?id=155d6f06-4ce7-45b3-b28f-f14ab1d242ca&amp;url=http%3a%2f%2fwww.w3.org%2fTR%2fgrddl-scenarios%2f%23wiki_use_case"><span style="color: #0000ff;">GRDDL</span></a> and microformats will serve to underpin (X)HTML’s existence for the foreseeable future, even with the emergence of amazingly capable platforms like Silverlight.</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.niksmit.com/wp/?feed=rss2&amp;p=7</wfw:commentRss>
		</item>
	</channel>
</rss>
