<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel xmlns:blog="http://www.dotnetnuke.com/blog/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
    <title>Crafty Code</title>
    <description>The craft of writing code.  The outcomes from being crafty with code.  Crafty Code is tales from the coding bench.</description>
    <link>http://www.ifinity.com.au/Blog/Crafty_Code</link>
    <language>en-US</language>
    <webMaster>http://www.ifinity.com.au/Contact_Us</webMaster>
    <pubDate>Thu, 17 May 2012 02:37:06 GMT</pubDate>
    <lastBuildDate>Thu, 17 May 2012 02:37:06 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 4.1.0.0</generator>
    <item>
      <title>Forge, Codeplex and Friendly Urls</title>
      <link>http://www.ifinity.com.au/2012/04/30/Forge__Codeplex_and_Friendly_Urls</link>
      <description>&lt;p&gt;Somehow I got a rumor mill going.   As most things with unexpected consequences, this caught me a bit by surprise.&lt;/p&gt;  &lt;p&gt;Let’s get the back story : last year, while at the DotNetNuke Conference in Orlando, Scott Wilhite and I had a little chat about the DotNetNuke Forge.  As the chief of the DotNetNuke community, it’s his job to make sure the community has the best tools at it’s disposal.   One of those is the DotNetNuke Forge.  And it’s where any open source extension for DotNetNuke should live.&lt;/p&gt;  &lt;p&gt;I’ve written a lot of bits and pieces for DotNetNuke in the last half-decade or so since I started doing this – some are trash-can fodder, some are ‘for my eyes only’, some are good enough to give to the community, and some are commercial products that keep my family fed and housed.&lt;/p&gt;  &lt;p&gt;Most of the stuff in the third category was sitting on my website as downloadable zip files.   It really wasn’t the right place for it.  Scott asked me when I was going to start putting stuff on the DotNetNuke Forge.  It was a good question, and I don’t remember what my answer was, but I mentally lodged myself a background task of ‘put stuff on Forge’.  This gives back to the community and also simplifies management of these projects for me – everybody wins.&lt;/p&gt;  &lt;p&gt;So, whenever there is a spare bit of time and I feel like doing something a bit different, I take one of my free downloadable apps, package it up properly, and create a DotNetNuke Forge project.  &lt;/p&gt;  &lt;p&gt;I’ve already done this for two other projects:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.dotnetnuke.com/Community/Extensions-Forge/view/ProjectDetail/project/cachemaster.aspx"&gt;iFinity Cache Master for DotNetNuke&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.dotnetnuke.com/Community/Extensions-Forge/view/ProjectDetail/id/928.aspx"&gt;DotNetNuke SkinObjectsEx&lt;/a&gt;      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Coming up to last week, I decided it was time to do this for the iFinity Friendly Url Provider.   This piece of code was what got me noticed in the DotNetNuke chattering classes (ie, the Forums) and what directly led to the launch of the Url Master product (which was a fork of this code – now drastically different, though).    It still is used very widely by many different people.  Though basic, it has got enough improvements over the standard DotNetNuke Url Rewriter that it is still quite popular.   And from time to time people find bugs in the source code and send me fixes, which I try and incorporate in and release a new version.   It’s always been open source and free to download.&lt;/p&gt;  &lt;p&gt;So last week I finally ticked this one off my list.  I took a couple of the contributions from people, merged them in, and then created a new DotNetNuke Forge project &lt;a href="http://www.dotnetnuke.com/Community/Extensions-Forge/view/ProjectDetail/project/friendlyurlprovider.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I think that’s when some misunderstandings got going.   I think some people got the idea that I had decided to open source the Url Master module, then head off to the hills and herd goats.&lt;/p&gt;  &lt;p&gt;Well, as they say in the classics, reports of my demise are greatly exaggerated.  I’m still working madly on the Url Master module code to add features and fix bugs.   I’m coming up with some exciting new modules.   I’m still feeding and housing the family.&lt;/p&gt;  &lt;p&gt;I’ve just moved the original iFinity Friendly Url Provider code from my server to the codeplex server, so more DotNetNuke community members can find it, and where other community members can get involved in reporting issues and fixing bugs.  It was always open source – half of the code was derived from DNN, which is under BSD, so it’s under a BSD licence.  It’s just a got new home, that’s all.&lt;/p&gt;  &lt;p&gt;There’s more to come, as well.  I’ll keep looking through the code basement to find some interesting things to polish up and put on display.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2012/04/30/Forge__Codeplex_and_Friendly_Urls&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2012/04/30/Forge__Codeplex_and_Friendly_Urls#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2012/04/30/Forge__Codeplex_and_Friendly_Urls</guid>
      <pubDate>Mon, 30 Apr 2012 02:39:46 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=148</trackback:ping>
    </item>
    <item>
      <title>You are going to use a CMS for that startup, aren't you?</title>
      <link>http://www.ifinity.com.au/2012/04/17/You_are_going_to_use_a_CMS_for_that_startup__arent_you</link>
      <description>&lt;p&gt;My blogging has been a bit patchy in this first quarter of 2012, as has my open-source output.  The reason for this is that I have been involved and working on a new startup project that should hopefully launch soon and prove to be a big success.&lt;/p&gt;  &lt;p&gt;The investors behind the project hadn’t done a web startup before, so they obtained the advice of the first person they found. I don’t really know the history behind this choice, and it scarcely matters now anyway. By the time I arrived, technology choices were in granite and the runway end was fast approaching. &lt;/p&gt;  &lt;p&gt;Upon arrival I was disappointed to find out that this was what I call a ‘scratch build’.  The first person on the project literally went into Visual Studio and said ‘New Project…’.&lt;/p&gt;  &lt;p&gt;The first question I asked was ‘did the original person who chose this technology consider using a CMS of any type?’.  The answer was ‘Yes, but it was ruled out’.  &lt;/p&gt;  &lt;p&gt;Again, there is little value in turning over old rocks when there is a project to finish and the answers make no difference to the outcome of that project.  So I have left it at that.&lt;/p&gt;  &lt;p&gt;But I wanted to do a little analysis of this in case the topic ever comes up again with anyone else.&lt;/p&gt;  &lt;h2&gt;The true cost of scratch building&lt;/h2&gt;  &lt;p&gt;When you get to see the invoices for time that get paid to developers for building the different components of a fully functional subscription-based website, you get a good insight into how much ‘scratch building’ costs.&lt;/p&gt;  &lt;p&gt;What I have done is go through and develop estimates of how much time has been spent developing different subsystems.  Note that none of these subsystems are the actual bulk of the work.  They are just the peripheral bits and pieces that go into the bulk of sites of this type.&lt;/p&gt;  &lt;p&gt;As my personal CMS of choice is DotNetNuke, I’ll consider some of these features alongside their DotNetNuke equivalent:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="10" width="600"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="223"&gt;&lt;strong&gt;Built Feature&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="261"&gt;&lt;strong&gt;DotNetNuke &lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="242"&gt;&lt;strong&gt;Difference / Notes&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="223"&gt;&lt;strong&gt;&lt;u&gt;Membership System*&lt;/u&gt;&lt;/strong&gt;(login,register,forgotten email, etc)          &lt;br /&gt;          &lt;br /&gt;Approx Time Taken:          &lt;br /&gt;60 hours of development time, email templates, custom mail sending code, skinning&lt;/td&gt;        &lt;td valign="top" width="261"&gt;         &lt;br /&gt;Built-in.           &lt;br /&gt;Skinnable.          &lt;br /&gt;Templated Emails.          &lt;br /&gt;          &lt;br /&gt;Approx Time needed:          &lt;br /&gt;8 hours of installing and editing emails&lt;/td&gt;        &lt;td valign="top" width="242"&gt;Additionally, DotNetNuke has option of custom login modules.         &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;52 hours longer          &lt;br /&gt;Probably still more bugs to find.  May yet require Facebook login integration or similar.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="223"&gt;&lt;strong&gt;&lt;u&gt;Scheduling System&lt;/u&gt;&lt;/strong&gt;          &lt;br /&gt;          &lt;br /&gt;Service to run scheduled tasks in the application.          &lt;br /&gt;          &lt;br /&gt;Approx Time Taken:          &lt;br /&gt;15 hours of development for a Windows scheduled service, configuration to make scheduled payments, send emails, etc&lt;/td&gt;        &lt;td valign="top" width="261"&gt;         &lt;br /&gt;          &lt;br /&gt;Built-in.          &lt;br /&gt;          &lt;br /&gt;Includes reporting and control.          &lt;br /&gt;          &lt;br /&gt;Approx time needed:           &lt;br /&gt;0 hours&lt;/td&gt;        &lt;td valign="top" width="242"&gt;The DotNetNuke scheduler doesn’t require any extra software to be installed on the webserver.         &lt;br /&gt;          &lt;br /&gt;15 hours longer&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="223"&gt;&lt;u&gt;&lt;strong&gt;Event Log&lt;/strong&gt;&lt;/u&gt;          &lt;br /&gt;          &lt;br /&gt;Implementation of text-based server log using open-source component.          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;Approx Time Taken:          &lt;br /&gt;10 hours of implementation&lt;/td&gt;        &lt;td valign="top" width="261"&gt;         &lt;br /&gt;          &lt;br /&gt;Built-in.  &lt;br /&gt;          &lt;br /&gt;Easily extended for custom applications through creating new event types.          &lt;br /&gt;          &lt;br /&gt;Nothing to build, all exceptions captured and logged, custom logging done in one line.&lt;/td&gt;        &lt;td valign="top" width="242"&gt;The DotNetNuke event log includes the ability to view remotely through the admin pages of the site, and can be filtered for different types of events.         &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;10 hours longer          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="223"&gt;&lt;u&gt;&lt;strong&gt;Design&lt;/strong&gt;&lt;/u&gt;          &lt;br /&gt;          &lt;br /&gt;Implementation of MasterPages design.  Conversion of designer-specified Html into .aspx pages.          &lt;br /&gt;          &lt;br /&gt;Approx Time Taken           &lt;br /&gt;(excluding designer)          &lt;br /&gt;40 hours.&lt;/td&gt;        &lt;td valign="top" width="261"&gt;         &lt;br /&gt;          &lt;br /&gt;Install skin through menu and apply to pages as needed.  Completely separate from code.          &lt;br /&gt;          &lt;br /&gt;Approx time needed          &lt;br /&gt;8 hours (to refine and apply to different pages)&lt;/td&gt;        &lt;td valign="top" width="242"&gt;DotNetNuke skins can be developed by a designer in Html and then converted by the platform itself into a DNN Specific skin.         &lt;br /&gt;          &lt;br /&gt;32 hours longer.          &lt;br /&gt;          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="223"&gt;&lt;strong&gt;&lt;u&gt;Menu System&lt;/u&gt;&lt;/strong&gt;          &lt;br /&gt;          &lt;br /&gt;Design and implementation of a 4-level menu system and breadcrumbs for all pages.          &lt;br /&gt;Static and requires config changes to add/remove pages.          &lt;br /&gt;          &lt;br /&gt;Approx Time Taken          &lt;br /&gt;40 hours&lt;/td&gt;        &lt;td valign="top" width="261"&gt;         &lt;br /&gt;          &lt;br /&gt;Built-in.  New choices in providers such as Mega-menu.          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;Approx time needed          &lt;br /&gt;1 hour&lt;/td&gt;        &lt;td valign="top" width="242"&gt;There are many different menu styles to choose from.  Menu designers can quickly and easily setup the styles.  From then on, you just choose which pages go into the menu, and where they go.         &lt;br /&gt;          &lt;br /&gt;Easily adjusted by the owner of the site.          &lt;br /&gt;          &lt;br /&gt;39 hours longer&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="223"&gt;&lt;strong&gt;&lt;u&gt;Content Display&lt;/u&gt;&lt;/strong&gt;          &lt;br /&gt;          &lt;br /&gt;Creation of a way to allow authorised end users to edit site content.          &lt;br /&gt;          &lt;br /&gt;Requires separate WYSIWYG Html editor and FTP program.          &lt;br /&gt;          &lt;br /&gt;Approx Time Taken          &lt;br /&gt; (excluding authoring content)          &lt;br /&gt;35 hours&lt;/td&gt;        &lt;td valign="top" width="261"&gt;         &lt;br /&gt;          &lt;br /&gt;Built-in, including different content for different authentication levels.          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;Approx time needed:          &lt;br /&gt;0 hours&lt;/td&gt;        &lt;td valign="top" width="242"&gt;DotNetNuke Professional versions include a content staging solution for approving content for live sites.         &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;          &lt;br /&gt;35 hours longer&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;*note: the system is using the same asp.net Authentication provider that DotNetNuke uses.  This saves a significant amount of time, but there is still a lot of work in plugging all the ASP.NET components into an overall site, and refining the plainly-awful default ASP.NET designs.&lt;/p&gt;  &lt;p&gt;There is more I could list.  Search engine sitemaps.  Analytics integration.  Caching for performance. Administrator control panels.  User administration – if you want it, it all has to be built while the CMS packages it all up for you, tested, debugged and ready to use.&lt;/p&gt;  &lt;p&gt;To save you adding up, the calculated extra time taken is &lt;u&gt;183 hours&lt;/u&gt;.  Even to me, this sounds very conservative, as I’m just extracting the information in a rough manner from management reports.&lt;/p&gt;  &lt;p&gt;But let’s turn that into dollars and time, the two singularly most crucial data points for any startup.   Let’s assume you can average a developer hour at $100/hr – that is an extra $18,300, and close enough to 5 weeks of extra time.&lt;/p&gt;  &lt;p&gt;Some people in large organisations might laugh at that- $18k is probably their stationery bill – but in a scrappy small startup watching the pennies it is an enormous amount.  More crucially, every week the product isn’t launched is every week revenue doesn’t come in, and gets closer to the time when the runway end appears and the investors get nervous.&lt;/p&gt;  &lt;h2&gt;Where does the platform really end?&lt;/h2&gt;  &lt;p&gt;When building a project like this, it’s amazing how cheaply a site like this can be put together.  A similar startup ten years ago would have needed a 7 figure bankroll to get the same amount of functionality in the same amount of time.  Open source libraries, Microsoft helper code – it all helps to put something together quickly.  We’ve leveraged jQuery and jQuery UI, used Knockout.js to give great UI interactions, leveraged email and payment provider libraries to speed up things immeasurably.  &lt;/p&gt;  &lt;p&gt;The point here is that when you’re already using open-source libraries to speed up development and improve quality, then it’s bizarre to draw the line at the actual project itself.  Everything on the web runs on a huge stack of layers, so, in my view, it isn’t productive to dip down and build one more layer when a suitable candidate is there.  Nobody actually contemplates writing their own version of jQuery now, so why the actual Web Application?&lt;/p&gt;  &lt;h2&gt;But - It’s more than the cost&lt;/h2&gt;  &lt;p&gt;At this point, someone who was sceptical of implementing a CMS as a base for a startup might reasonably come back with ‘yes, but how much time would adapting the design to the CMS have cost’.  This is a fair point and one that needs expanding.  If you start with CMS-inexperienced developers, you may find that this time difference is soaked up in the developers trying to get their head around building an application on top of a CMS, instead of just creating a new codefile every time they need a new feature. &lt;/p&gt;  &lt;p&gt;It doesn’t need to be like that, though.  The pool of developers skilled in a platform like DotNetNuke is pretty vast, and pretty deep.  And even if you’re a bit green, there are endless online forums, Q&amp;A and other resources to tap into.   Code is code, no matter where it is written, so adapting to a different way of display is very low cost.&lt;/p&gt;  &lt;p&gt;My hypothetical sceptic might come back and say ‘but yes, now you’re tied into the project’.  This is true.  Your future and that of your donor CMS are now one and the same.  But that is why you would choose and open source solution like DotNetNuke.  Even if the entire project disappeared off the face of the Earth tomorrow, you’d still have all of the source code, all of the things required to build it, and you could continue to move forwards.   But I’ll throw it back the other way, without a major platform, you don’t get any new features for free.  You don’t get lots of people finding security problems and patching them for you.  You don’t get a vibrant developer community trying to push things forwards continually.&lt;/p&gt;  &lt;p&gt;A scratch-built solution has a talent-pool of a handful of developers deep.  When one of them walks out the door and onto other pastures, a ton of knowledge leaves with them.  This type of hidden reef is impossible to calculate in terms of cost, but it can be quite significant.&lt;/p&gt;  &lt;h2&gt;It’s also about the future&lt;/h2&gt;  &lt;p&gt;Already, the project is thinking about the future past launch day.  If all goes well, there will be plenty of site members and plenty of activity.  It’s about then that new ideas for site features will start popping up.   What about a company blog?  How about some social features to let users of the system compare notes, talk to each other, build a community?    With a scratch-built site, it’s back to square one.  With the authentication system built in, trying to tie in a stand-alone forum system would come across as clunky and poor.   Creating single-sign-on between different codebases is difficult.  Harmonising design is troublesome.  &lt;/p&gt;  &lt;p&gt;And that’s when a CMS like DotNetNuke really pulls out into clean air.  In the next couple of months, the platform will release the long-awaited Social Features and a new Services layer.   There is no way an individual team can possibly compete with a team of fulltime developers working on a single feature like this alone.  The startup site could really use some of those social features like the new Journal module.  But there is no way it is ever going to happen, save maybe for a buyout by Facebook like some others.&lt;/p&gt;  &lt;h2&gt;A Virtual Comparison&lt;/h2&gt;  &lt;p&gt;Perhaps the best way I can put it is this: if two teams funded by two different investors worked on this same project, and one decided to use DotNetNuke as the base, and the other decided upon a scratch build, the one based on DotNetNuke would be to market by now, with more features and less bugs.  And they’d have extra cash saved over for promotion.  They’d even have a ready-built community to show their new site off to for feedback and perhaps the first customers!&lt;/p&gt;  &lt;p&gt;It’s pretty obvious to me which one would be the eventual winner.  The ‘Not Invented Here’ syndrome is a costly one to acquire.&lt;/p&gt;  &lt;p&gt;So I’ll ask the question again, in case you’re just starting out and chewing over this question : You are going to use a CMS for that startup, &lt;strong&gt;&lt;em&gt;aren’t you!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2012/04/17/You_are_going_to_use_a_CMS_for_that_startup__arent_you&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2012/04/17/You_are_going_to_use_a_CMS_for_that_startup__arent_you#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2012/04/17/You_are_going_to_use_a_CMS_for_that_startup__arent_you</guid>
      <pubDate>Tue, 17 Apr 2012 10:55:42 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=147</trackback:ping>
    </item>
    <item>
      <title>What&amp;rsquo;s new in DotNetNuke 6.2&amp;ndash;Presentation to SEQDUG</title>
      <link>http://www.ifinity.com.au/2012/03/30/Whatrsquo_s_new_in_DotNetNuke_62ndash_Presentation_to_SEQDUG</link>
      <description>&lt;p&gt;Just last week I did a presentation to the South East Queensland DotNetNuke User Group, on the topic of ‘What’s new in DotNetNuke 6.2’.&lt;/p&gt;  &lt;p&gt;The slides from this presentation are shown below:&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_12220780"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="What’s new in DotNetNuke 6.2" href="http://www.slideshare.net/brchapman/whats-new-in-dotnetnuke-62"&gt;What’s new in DotNetNuke 6.2&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse12220780" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=whatsnewindotnetnuke62-120330045740-phpapp02&amp;stripped_title=whats-new-in-dotnetnuke-62&amp;userName=brchapman" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;embed name="__sse12220780" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=whatsnewindotnetnuke62-120330045740-phpapp02&amp;stripped_title=whats-new-in-dotnetnuke-62&amp;userName=brchapman" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/brchapman"&gt;brchapman&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;h2&gt;About the User Group Meeting&lt;/h2&gt;  &lt;p&gt;This was a very fun event – generously sponsored by &lt;a href="http://www.powerdnn.com.au/"&gt;Power DNN Australia&lt;/a&gt; and held in South Brisbane.  Unfortunately we were in the grip of one of the worst rain events in recent history – while I was presenting, over 370mm of rain fell on my house – that’s 14 inches of rain - in the space of a few hours, which caused widespread flooding.  It wasn’t as bad in Brisbane where I was giving the presentation, but the weather was foul enough to keep a few people away. &lt;/p&gt;  &lt;p&gt;The next SEQDUG meeting is already in planning – make sure you join the &lt;a href="http://www.linkedin.com/groups?gid=2200940&amp;home="&gt;Linked In Group&lt;/a&gt; to be a part of the DotNetNuke scene in my part of the world!&lt;/p&gt;  &lt;h2&gt;About the Presentation&lt;/h2&gt;  &lt;p&gt;The two main areas that my presentation covered were the changes in DotNetNuke 6.2 that people are most interested in – these being the Social Networking features and the Services Layer that powers them (and will be available to all developers to utilise).&lt;/p&gt;  &lt;p&gt;Earlier this week, &lt;a href="http://www.dotnetnuke.com/Resources/Blogs/BlogID/245.aspx"&gt;Scott Schlesier&lt;/a&gt; posted a timely blog entry entitled &lt;a href="http://www.dotnetnuke.com/Resources/Blogs/EntryId/3331/Services-Framework-a-little-context.aspx"&gt;DotNetNuke Services Framework - a little context&lt;/a&gt;.  This expands further on the brief introduction to the services layer that is in the linked presentation above.  I highly suggest any DotNetNuke developer reads it to get more information on what will be one of the biggest revolutions in DotNetNuke history.&lt;/p&gt;  &lt;p&gt;I’ll be having a lot more to say about 6.2 in the coming months, so stay tuned for updates!&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2012/03/30/Whatrsquo_s_new_in_DotNetNuke_62ndash_Presentation_to_SEQDUG&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2012/03/30/Whatrsquo_s_new_in_DotNetNuke_62ndash_Presentation_to_SEQDUG#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2012/03/30/Whatrsquo_s_new_in_DotNetNuke_62ndash_Presentation_to_SEQDUG</guid>
      <pubDate>Fri, 30 Mar 2012 10:23:21 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=146</trackback:ping>
    </item>
    <item>
      <title>Different robots files for different DotNetNuke Portals</title>
      <link>http://www.ifinity.com.au/2012/03/21/Different_robots_files_for_different_DotNetNuke_Portals</link>
      <description>&lt;p&gt;One of the greatest strengths of the DotNetNuke framework is the ability to create many different websites with the one installation.   This means you only set up one IIS website, and then serve up as many individual sites from that as you like.  Personally I’ve seen DNN installs with thousands of sites, which is a bit of an eye opener if you’re used to running 2 or 3.&lt;/p&gt;  &lt;p&gt;However, this power has a few small drawbacks, and one of the ones I’ve been mulling over for years has been the ability to serve up separate robots.txt files for separate sites in a DotNetNuke installation.&lt;/p&gt;  &lt;p&gt;The robots.txt file is a pretty old protocol, and dates back as far as I can remember.  The basic idea behind the robots.txt file is that it tells ‘robots’ – such as search engine crawling bots – which parts of the site they can index, and which they should ignore.   While it’s a bit of a relic in that it’s a voluntary standard (those writing malicious bots for stealing content don’t exactly pay attention), all of the major search engines still read the robots.txt files, and some people still swear by their use.&lt;/p&gt;  &lt;p&gt;What’s more, with the introduction of search engine sitemaps a few years back the use of the robots.txt file has jumped into the frame again, principally because you can list any of your search engine sitemaps within the robots.txt file.  By listing a search engine sitemap, search engines pick up the reference and will read and follow the urls laid out in the sitemap.  For more information on this, see the sitemaps.org site here : &lt;a title="http://www.sitemaps.org/protocol.html#informing" href="http://www.sitemaps.org/protocol.html#informing"&gt;Informing search engine crawlers of search engine sitemaps.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In that linked reference, you’ll find that you should list the sitemap in the robots.txt file, like this:&lt;/p&gt;  &lt;p&gt;Sitemap: &lt;a href="http://www.example.com/sitemap.xml"&gt;http://www.example.com/sitemap.xml&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(note: the sitemap entry is independent of the user-agent, so you can’t tell some user-agents to read it, and others not to)&lt;/p&gt;  &lt;p&gt;So far, so good.  For DotNetNuke we drop a robots.txt file into the site root, and enter the default sitemap location, like this:&lt;/p&gt;  &lt;p&gt;Sitemap: &lt;a href="http://www.example.com/sitemap.aspx"&gt;http://www.example.com/sitemap.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;But wait!  Those who have been nodding along will realise we have much more than just one domain in our site if we are running multiple sites (DNN Term: &lt;em&gt;Portals&lt;/em&gt;) in our DotNetNuke installation.   &lt;/p&gt;  &lt;p&gt;That’s where it starts to go wrong.  We can’t have a site (portal) specific sitemap, because there is only one site root.&lt;/p&gt;  &lt;p&gt;Of course, it is technically allowed to do &lt;em&gt;cross submits&lt;/em&gt; through the sitemaps protocol (see &lt;a title="http://www.sitemaps.org/protocol.html#sitemaps_cross_submits" href="http://www.sitemaps.org/protocol.html#sitemaps_cross_submits"&gt;http://www.sitemaps.org/protocol.html#sitemaps_cross_submits&lt;/a&gt;) because you implicitly own all of the various domains.  But it’s messy and rather shatters the illusion that a DotNetNuke portal is a separate site, rather than just a data partition in an overall DotNetNuke installation.  In my experience, website owners don’t like seeing references to other sites within their own.  But this still doesn’t solve the problem of wanting to ‘lock off’ parts of a site through the robots.txt file, because that’s a site-specific action which doesn’t fit with a one-size-fits-all robots.txt file.&lt;/p&gt;  &lt;p&gt;And that’s the problem I’ve been mulling over ever since the sitemaps protocol was updated to include the robots.txt reference.   My original thinking was to incorporate it into the Google Sitemap Provider code that I’ve had for years.  But while it was possible to do so, it required people to modify their IIS configuration to associate the .txt file extension with ASP.NET.  From my experience with helping people redirect .html, .asp and .php Urls to DotNetNuke sites with the Url Master module, I knew this would result in a lot of people asking for a lot of help in navigating the waters of modifying their IIS configuration.  When you add in multiple IIS versions, multiple .NET versions, 32 bit and 64 bit, it becomes quite complicated.&lt;/p&gt;  &lt;p&gt;So that’s the official reason why it was always on the ‘TODO:’ shelf for me (this is quite a crowded shelf, I might add).&lt;/p&gt;  &lt;p&gt;Recently, Tom Kraak of R2i was asking me again why I hadn’t done this, and I gave him the standard response (which is a version of the paragraph above) and he wasn’t buying it anymore.  So I decided to re-think it, and then I realised that IIS7 had delivered all the tools needed with the IIS 7 Url Rewrite tool.  This is a rewriting/redirecting tool that now comes bundled with IIS as standard, and is available as an install for any IIS7 version that doesn’t have it.  You can get it at the &lt;a href="http://www.iis.net/download/urlrewrite"&gt;IIS 7 Url Rewrite&lt;/a&gt; page.&lt;/p&gt;  &lt;p&gt;How to serve individual robots.txt files for individual DotNetNuke portals using IIS7 Rewrite&lt;/p&gt;  &lt;p&gt;The basic idea I had was that the IIS7 Rewrite tool could be used to rewrite any example.com/robots.txt Url into a domain-specific robots.txt file.&lt;/p&gt;  &lt;p&gt;So, instead of placing a single robots.txt file into the root of your multi-portal DotNetNuke installation, instead, what you do is create a specific robots.txt file for each portal.&lt;/p&gt;  &lt;p&gt;As an example, say we have a DotNetNuke installation with 3 portal on it, which are example1.com, example2.com and example3.com&lt;/p&gt;  &lt;p&gt;In this case, we would create 3 robots.txt files:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;example1.com.robots.txt &lt;/li&gt;    &lt;li&gt;example2.com.robots.txt &lt;/li&gt;    &lt;li&gt;example3.com.robots.txt &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Each of these files is a robots.txt file specific for the specific domain.  This means you can list any paths you don’t want indexed, as well as a specific sitemap location for the relevant domain.&lt;/p&gt;  &lt;p&gt;So far, so good.  But a search engine looks for domainname/robots.txt, not domainname/domainname.robots.txt.  How can we serve up the correct robots.txt file to the search engine robots that come visiting?&lt;/p&gt;  &lt;p&gt;The answer is in an IIS7 Rewrite Rule.   Here’s the steps how to do it:&lt;/p&gt;  &lt;p&gt;1. Ensure that you have IIS7 Url Rewrite installed on your server.  You may have to confirm this with whomever administers your hosting server&lt;/p&gt;  &lt;p&gt;2. Open up the web.config file, and in the &lt;system.webserver&gt; section, add the following rule:&lt;/p&gt;  &lt;pre style="font-family: courier-new"&gt;&lt;br /&gt;&lt;rewrite&gt;
&lt;br /&gt;  &lt;rules&gt;
&lt;br /&gt;   &lt;rule name="multi-portal robots files" stopProcessing="true"&gt;
&lt;br /&gt;    &lt;match url=".+" /&gt;
&lt;br /&gt;    &lt;conditions&gt;
&lt;br /&gt;     &lt;add input="{REQUEST_FILENAME}" pattern="robots.txt" /&gt;
&lt;br /&gt;    &lt;/conditions&gt;
&lt;br /&gt;    &lt;action type="Rewrite" url="{HTTP_HOST}.{C:0}" logRewrittenUrl="true" /&gt;
&lt;br /&gt;   &lt;/rule&gt;
&lt;br /&gt;  &lt;/rules&gt;
&lt;br /&gt;&lt;/rewrite&gt;&lt;/pre&gt;

&lt;p&gt;Note: if you already have existing rewrite rules in the &lt;rewrite&gt;&lt;rules&gt; section, just add the block between the opening and closing &lt;rule&gt;&lt;/rule&gt; from above.&lt;/p&gt;

&lt;p&gt;That's it. What this rule does is match an incoming request for the robots.txt file. It then rewrites that request so that it appends the domain name to the front of the robots.txt path, and changes it so that it looks for the domainname.robots.txt file, instead of the robots.txt file. Because you create separate domainname.robots.txt files in your site root, then each separate file gets served for each separate request. Problem solved!&lt;/p&gt;

&lt;p&gt;Now, I’ve given this a test on my local development environment and it was working a-OK.  If you find a shortcoming in the approach, or it’s not working, please let me know via the comments.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2012/03/21/Different_robots_files_for_different_DotNetNuke_Portals&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2012/03/21/Different_robots_files_for_different_DotNetNuke_Portals#Comments</comments>
      <slash:comments>6</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2012/03/21/Different_robots_files_for_different_DotNetNuke_Portals</guid>
      <pubDate>Wed, 21 Mar 2012 02:27:33 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=145</trackback:ping>
    </item>
    <item>
      <title>Updating your Vendor Google Analytics for the new DotNetNuke Store</title>
      <link>http://www.ifinity.com.au/2012/02/20/Updating_your_Vendor_Google_Analytics_for_the_new_DotNetNuke_Store</link>
      <description>&lt;p&gt;The new DotNetNuke store arrived last week – and what a momentous day for vendors like myself who use the platform extensively.    The old Snowcovered store had remained quite stagnant for a long time, and while it had many strengths, there were a lot of weaknesses that needed to be fixed.  This  has been done, and everything is good!&lt;/p&gt;  &lt;p&gt;Well, almost everything.  One feature that vendors use extensively is the ability to track visitors to both their product page and their vendor page.  While a vendor like myself has no idea overall what sort of traffic the site gets, we have the ability to create a Google Analytics account and see traffic to ‘our’ specific pages in the site.&lt;/p&gt;  &lt;p&gt;One of the big changes with Snowcovered to DotNetNuke store was, of course, the domain name.  And anyone who knows anything about Google Analytics should know that it works on a combination of your tracking ID and the domain name.  &lt;/p&gt;  &lt;p&gt;So it should be no surprised that many people will see analytics graphs that look something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/Blog/Files/2/144/Windows-Live-Writer-Updating-your-Vendor-Google-Analytics-fo_12D39-image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/Blog/Files/2/144/Windows-Live-Writer-Updating-your-Vendor-Google-Analytics-fo_12D39-image_thumb.png" width="644" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Oh dear-  all my customers disappeared about the 13th of February!&lt;/p&gt;  &lt;p&gt;To fix this, it’s quite simple, you just need to change the tracked domain name so that it looks at the new store Url.&lt;/p&gt;  &lt;p&gt;To do so, just follow this guide:&lt;/p&gt;  &lt;p&gt;1) Click on the little ‘cog’ icon on the top right of the page&lt;/p&gt;  &lt;p&gt;2) You will get to the profile page.  Click on the ‘Profile Settings’ tab:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/Blog/Files/2/144/Windows-Live-Writer-Updating-your-Vendor-Google-Analytics-fo_12D39-image_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/Blog/Files/2/144/Windows-Live-Writer-Updating-your-Vendor-Google-Analytics-fo_12D39-image_thumb_1.png" width="644" height="420" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Where you see ‘www.snowcovered.com’, change it to ‘store.dotnetnuke.com’.&lt;/p&gt;  &lt;p&gt;Click the ‘Apply’ button at the bottom of the page.&lt;/p&gt;  &lt;p&gt;That’s fixed that.  But the profile is still named ‘snowcovered’.  We’re all going to be using the term ‘DotNetNuke Store’ from here on in, so better get that fixed.&lt;/p&gt;  &lt;p&gt;3) Click on the ‘Property Settings’ tab:&lt;/p&gt;  &lt;p&gt;Where it says ‘snowcovered.com’ change it to ‘store.dotnetnuke.com’.  Of course, you can put anything in the ‘Property Name’ field – you don’t need to stick to the domain name.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/Blog/Files/2/144/Windows-Live-Writer-Updating-your-Vendor-Google-Analytics-fo_12D39-image_8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/Blog/Files/2/144/Windows-Live-Writer-Updating-your-Vendor-Google-Analytics-fo_12D39-image_thumb_3.png" width="607" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Click on ‘Apply’, then refresh the page, and you’ve fixed it all up!&lt;/p&gt;  &lt;p&gt;The changes will take up to 24 hours before traffic starts appearing again.  &lt;/p&gt;  &lt;p&gt;Bonus : Better Tracking&lt;/p&gt;  &lt;p&gt;In the old Snowcovered store, the &lt;em&gt;plethora &lt;/em&gt;of Urls each page could be found under meant that tracking a canonical page was a bit of a dark art when it came to Google Analytics.  However, this could easily be done by viewing pages by title – no matter what the Url, the title was always the same.&lt;/p&gt;  &lt;p&gt;Alas, when the new Google Analytics came out, the old ‘content by title’ report disappeared (or was buried further than I was inclined to look).   This was most frustrating.&lt;/p&gt;  &lt;p&gt;However, salvation is at hand – the new and improved store uses the Url Master module with a custom Url Provider to deliver the store Urls.  No more messy, duplicate Urls, now each product listing has a canonical Url that all traffic will use.&lt;/p&gt;  &lt;p&gt;You can see the difference in this pageview excerpt.  The duplicate Urls are highlighted in yellow, and the canonical, friendly Urls are shown in Green.  The old Urls were driven by the Product ID, while the new Urls are driven by the product name.  This makes it easier to track what they are for, are nicer to look at, and rank better in search engines to boot.  Chalk up another great use of &lt;a href="http://www.ifinity.com.au/2011/10/26/Build_your_own_Custom_DotNetNuke_Module_Provider_and_start_creating_the_Friendly_Urls_you_need_for_your_SEO_strategy"&gt;custom module providers and Url Master&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/Blog/Files/2/144/Windows-Live-Writer-Updating-your-Vendor-Google-Analytics-fo_12D39-image_10.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/Blog/Files/2/144/Windows-Live-Writer-Updating-your-Vendor-Google-Analytics-fo_12D39-image_thumb_4.png" width="444" height="493" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;By next months reporting period, the old snowcovered Urls will gradually dissappear into history.  But, because we can re-use our same Analytics account, we can still look at multi-year trends in pageviews, referrals, and all the other deeply interesting data you can slice and dice with Google Analytics.  &lt;/p&gt;  &lt;p&gt;So if you’re a store vendor, and you haven’t yet fixed your Analytics, get clicking!&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2012/02/20/Updating_your_Vendor_Google_Analytics_for_the_new_DotNetNuke_Store&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2012/02/20/Updating_your_Vendor_Google_Analytics_for_the_new_DotNetNuke_Store#Comments</comments>
      <slash:comments>1</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2012/02/20/Updating_your_Vendor_Google_Analytics_for_the_new_DotNetNuke_Store</guid>
      <pubDate>Mon, 20 Feb 2012 12:00:03 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=144</trackback:ping>
    </item>
    <item>
      <title>Happy 10th Birthday .NET Framework&amp;ndash;the little platform that could</title>
      <link>http://www.ifinity.com.au/2012/02/12/Happy_10th_Birthday_NET_Frameworkndash_the_little_platform_that_could</link>
      <description>&lt;p&gt;The 13th February, 2012, marks 10 years since the .NET Framework 1.0 was released, well, &lt;a href="http://en.wikipedia.org/wiki/.NET_Framework#History"&gt;according to Wikipedia&lt;/a&gt;, anyway.  I don’t recall the specific date, but I remember the general period vividly.&lt;/p&gt;  &lt;p&gt;This little point of achievement will probably pass most people by as they spend another day creating new software based on this platform, or use one of millions of websites that the platform provides, or any number ways of interacting what has become an incredibly successful framework by any standard to measure.  But I thought it might be fun to just pause for a minute and reflect back on the last decade.&lt;/p&gt;  &lt;p&gt;Is ten years such a long time?  Realistically, in computer industry years, it’s an absolute eternity.  The internet has really only been around for most people since the late ‘90s. The Windows 95 platform only lasted for 5 or so years before being dropped.  Visual Basic (the original version) went from 1.0 to 6.0 in 7 years, before being shelved to make way for .NET.  Many programming languages have come and gone in less time than a decade. &lt;/p&gt;  &lt;h2&gt;The way we were&lt;/h2&gt;  &lt;p&gt;It’s all too easy to take for granted the powerful tools we software developers have at our disposal.   It’s very easy to forget the kind of world Microsoft-technology developers had 10 years ago.   But let’s just cast our minds back to the late 1990’s and early 2000’s.    If you wanted to build a website using Microsoft kit, you’d probably have been using:&lt;/p&gt;  &lt;p&gt;- Either C++ or VB6 to build back end components.&lt;/p&gt;  &lt;p&gt;- SQL Server 6.5, or, if you were lucky, SQL Server 2000.&lt;/p&gt;  &lt;p&gt;- Windows NT 4.0 server, or, if you were lucky, Windows 2000 Server&lt;/p&gt;  &lt;p&gt;- Microsoft IIS 4.0 or IIS 5.0 running ASP pages.&lt;/p&gt;  &lt;p&gt;In reality, in any fair comparison with alternative web development tools at the time, it wasn’t ideal.  In fact, many frustrating times, frankly, it was painful to get things done.  You’d spend half you day producing something, peppered with thoughts like ‘there has to be a better way’.&lt;/p&gt;  &lt;h2&gt;The Genesis of .NET&lt;/h2&gt;  &lt;p&gt;I was working on a large development project for a financial services company at the time.   It was a sophisticated setup, where VB6 components plugged into a business layer which was all based on DCOM, written in C++ and somehow connected it all up and made sure it scaled.  I say somehow, because it really was an obscure black box of dark arts, and there was only one guy on the floor who really knew what was going on.  He was brilliant in the way an older developer with a bushy beard can be.  But he wasn’t good at explaining what was going on in that layer.  You just had to take it on faith that it all worked, which it did, most of the time.  &lt;/p&gt;  &lt;p&gt;The problem was in deploying to production.  In those days, IIS had a tendency to eat up a pile of memory and then freeze up.  The notion of automatically dropping an application pool on a periodic basis hadn’t happened yet.  And all those COM/DCOM components had to be installed on the server.  I don’t mean sent via FTP to the \bin directory, I mean, create an installer package, log onto the server, and run the installer.  And hope over all hopes that someone didn’t include a bad reference and send the entire team to “DLL Hell”, as it was known.&lt;/p&gt;  &lt;p&gt;And that’s just the deployment part.  I was employed as a VB6 programmer, which I knew well, having come up through the VB ranks from 16bit Visual Basic 3.  While you’d never find me defending VB in an online forum, it wasn’t a bad way to quickly build software. But the not-quite-OO patterns in VB6 really made a developer do some unsavoury things.  And if you had a friend who was programming on the hot-new-language ‘Java’ they’d always guffaw, and talk about the language purity of Java.  Yes, never sit around with a bunch of developers discussing programming languages.&lt;/p&gt;  &lt;p&gt;As the company I was working at was quite a large one with a substantial IT budget and a pure Microsoft technology platform, it got very good treatment from the Redmond HQ.  And one of those things was an early look at what was called ‘Next Generation Windows Services’.&lt;/p&gt;  &lt;p&gt;This sounded like the answer to the frustrated VB/IIS developers requests.  This was going to be an entirely new programming platform, one that you could get enthusiastic about.   Gone would be COM/DCOM – although you could still use it if you wanted to (I didn’t ever want to, again).   Gone would be the VB6 platform, gone would be the VB IDE.   In would be an entirely new programming language called C# as well as a total rewrite of VB to make it a proper language.  This was going to be a proper object oriented language in either the less-verbose C style, or in the more verbose VB style.  Funnily enough, on first inspection C# looked exactly like Java.  Hardly a coincidence, one would suspect.   All new was a event-driven web page programming style, which smelled a lot like VB forms.  There was to be ‘xcopy deployment’ so you could just copy the program up to the server.  DLL Hell was to be banished forever by keeping the component metadata in the component itself, rather than in the operating system registry.&lt;/p&gt;  &lt;p&gt;Funny thing – in true Microsoft style – they had a melange of names for it.   When I first heard of it,  the new version of ASP was going to be called ASP+.  And that’s why it has the .aspx extension – you couldn’t have a + in a Url, so they rotated it 45 degrees, and you had an ‘x’ on the end of the old .asp extension.    And C# itself, was basically C++,+ – with another ‘+’ thrown in for good measure.  Arrange 4 + in a square and you get #.  And thus C# was named.&lt;/p&gt;  &lt;p&gt;I don’t remember when I officially heard the name .NET – it was probably closer to the launch – by that time I no longer worked at that company, and so lost access to the stream of new announcements from Microsoft.  It’s hard to believe today, but back then Microsoft didn’t do a lot of public BETA testing.    But at some point it was announced, then released.   And the .NET world was born.&lt;/p&gt;  &lt;h2&gt;.NET Leads the Microsoft Developers out of the Wilderness&lt;/h2&gt;  &lt;p&gt;It’s hard to understate the difference this change made in my life and career.  At the time, a lot of developers (and companies) I knew were jumping ship, and moving across to Java.  This generally meant a change in web server, programming tools and probably database platform for good measure.  And none of those were provided by Microsoft.  I’m sure the board reports at Redmond had some metric for measuring this.   One of the biggest secrets of success for Microsoft has always been the support of developers.  Having an operating system without third-party developer buy-in means failure.    The original success of Visual Basic was the ease in which people could build ‘GUI’ apps quickly, in an era when DOS based programs and mainframe terminals were still the norm in companies.  Users would have fits of delight when they could use drop-down boxes and update buttons instead of command line driven programs.&lt;/p&gt;  &lt;p&gt;But the sea change from Windows GUI to Web was fast, and the tide was running away from Microsoft.   The challenge was on – how to take all those experienced and Microsoft-trained VB developers and turn them into web developers?&lt;/p&gt;  &lt;p&gt;The answer was ASP.NET Webforms.  Now, to some web purists, the way in which this was solved still makes them go cross-eyed with indignation, but the simple matter was that it not only worked, but it did so in which it didn’t take a massive retraining for an efficient VB developer (or even a C++ developer, for that matter) to start being productive.&lt;/p&gt;  &lt;p&gt;Of course, some of the bloated buggy and run-at-a-crawl sites that resulted are probably not excusable, as too many desktop developers didn’t really take the time to learn that programming for the web really did require a new mindset.  But, for Microsoft, it worked.  Within a short time, websites with the now-familiar .aspx extension were popping up all over the web.   The flow of companies and developers to Java was stemmed.   People like myself stayed on board.  It wasn’t necessarily that someone like myself couldn’t see the faults in Microsoft – clearly I could – but it’s crazy to pretend that no platform or environment is free of shortcomings.   As always, it’s about getting something that works, to market, in the quickest possible time.  By 2005/6, it was very common to find jobs looking for ‘3 years C# experience’ – which meant you had to be on board from the get-go.  Having conducted interviews around this time myself, I found that many people were being quite liberal with the truth on their experience, but .NET was here to stay, and anyone looking for a future in Microsoft platforms had to start collecting experience, fast.   &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;.NET grows and grows&lt;/h2&gt;  &lt;p&gt;Despite the busting of the ‘internet bubble’, in reality, web developers were about to enter a golden age.  The truth of it was that the cost of building websites and launching them was falling quickly.  Part of that was cheaper hardware, and part of that was the growing stack of frameworks that added layer upon layer, each abstracting away a previously difficult and troublesome task, and making it a simple job.  Open source was, and remains, a huge part of this.   Of course, the leading web server, Apache, has always been an open source product.  But little by little, Open Source made it’s way into Microsoft as well.  But even without Open Source, there were plenty of free things that were getting added to the .NET family.    &lt;/p&gt;  &lt;p&gt;Of course here is the appropriate point to mention DotNetNuke.  This is not to belittle other open source .NET projects, but it’s the one I work on and know most about.   Given that ‘.NET’ is part of the name, it should be obvious to all how intertwined these two things are.  DotNetNuke was (and remains) an open source framework which allowed you to quickly create websites, without having to build all the associated messy bits like authentication, logging, not to mention the killer app of DotNetNuke which was the ability to easily install third-party modules to infinitely expand the site with new functionality.&lt;/p&gt;  &lt;p&gt;It sounds so simple and expected now, but this was such a massive jump in productivity it is hard to believe the old way of working.  In the heady days of the ‘internet bubble’, if you did find someone building an ASP based site, they would have had a team of developers working for 6 months to produce an approximation of what you could get from a DNN install in 6 minutes.  And it probably would crash too frequently, especially at dreaded upgrade time when it was time to release new code and find out if a trip to DLL Hell had been unwittingly scheduled.&lt;/p&gt;  &lt;p&gt;I worked on one project that was building a social network site.  This was just before Facebook exploded out of it’s college niche and out to the greater public.  This was a sophisticated site that had blogs, forums, chat, video and photo uploads, and all the social features you’d expect including friends, groups and all the rest.   I’ve never know the exact figure, but my guess is that a 7 figure sum was spent in an 18 month period with developers to create this site, myself being one of them.   And without a shadow of doubt, I could build that same site today in DotNetNuke with a few third-party modules for more like $7000 and 18 days, and most of the money would probably go to a talented designer.&lt;/p&gt;  &lt;p&gt;It’s easy to nod your head and say ‘yeah, that’s true’, but in few industries does this type of productivity leap occur.  Of course, this is nothing special with regards to a Microsoft platform – indeed many open source advocates would argue that anything built on a Microsoft platform is not truly open source.  But for a person who is tasked with producing a website that matters little.  But what shouldn’t be skipped over is that DotNetNuke wouldn’t exist without the .NET platform.  And I don’t mean that obviously because of the inclusion of the name, but more that the old VB6/IIS 5/ASP era was just not a good enough design to produce a modular masterpiece like DotNetNuke.  It just wouldn’t have been possible.&lt;/p&gt;  &lt;h2&gt;.NET Did it Right&lt;/h2&gt;  &lt;p&gt;The reason that great solutions like DotNetNuke can be built is because of the inherent correctness of the .NET platform.  It’s a true object-oriented platform.  The way the programming languages were designed dumped out all the nasty workarounds and hangabouts caused by trying to maintain backwards compatibility.   This was a true masterstroke of Microsoft, and one which they copped a lot of criticism for.  To build a good .NET application, you had to build it from scratch, you couldn’t upgrade your old code (well, you could, but the results were usually awful).  But by forcing people to start from scratch, everyone could start with a clean sheet of paper.  And, as anyone who has accidentally deleted a first draft will know, the second draft is not only better, it’s written faster as well.&lt;/p&gt;  &lt;p&gt;From the in-built memory management to the well-executed ability of .NET code to ‘reflect’ upon itself, .NET was a really good platform to build with.  It’s like the difference between a toolbox full of half-broken, unsuitable tools, and a toolbox full of shiny tools designed exactly for purpose.   Having the ability to select the right tool for each little job, no matter how trivial, means that the finished product always comes out better, with fewer rough edges, and always with a more elegant feel.&lt;/p&gt;  &lt;p&gt;And we can tell .NET has been a success.  Not because Microsoft tells us so, but because they’ve never changed the name (well, not since it was released, project names and working titles notwithstanding).    The easiest way to detect a floundering Microsoft product is to look for frequent name changes.    We all can rattle off several products that go through a series of names before quietly being shelved (the various old versions of Microsoft phone operating systems being a prime example).   But .NET is still there, still being used, not being tinkered with.  Visual Studio is still Visual Studio, C# is still C#, with most people being blissfully unaware of how the name came about.  The true measure of developer stickiness, however, is a quick peruse of a jobs site.  And there are still plenty of jobs to be had working in .NET.  Sure, there are newer, ‘hotter’ platforms out there, I’m not a one-eyed Microsoft supporter in the least.  But can I still deliver a cost effective solution to someone who has chosen to use Microsoft based operating systems?  I sure can.  Are there still plenty of people choosing Microsoft Operating systems?  There sure is.  IIS is still the second-highest Web serving platform on the internet, and the best way to deliver websites through IIS is by building an ASP.NET website.&lt;/p&gt;  &lt;h2&gt;The next 10 years&lt;/h2&gt;  &lt;p&gt;10 years ago a lot of people I knew were either moving, or seriously considering moving from Microsoft products into Java as a platform.   I haven’t heard someone say that in years.  In fact a couple of the Java people I know are starting to dabble in other platforms and languages, and they tell me that they feel Java has lost its way.  I couldn’t say myself – I’ve been deep into the .NET stack for a decade and haven’t spent much time exploring outside of that.  There has never been a shortage of opportunities for me, there has never been a point where I’ve felt that the platform was going nowhere.   In fact, every time I look up, I find lots of new and interesting stuff coming down the road.&lt;/p&gt;  &lt;p&gt;There’s an entirely new Windows version coming along which is destined to bust out of the traditional desktop and onto other devices, there’s lots of new ways of building traditional ASP.NET websites,  there’s Azure cloud services to build, as well as plenty of traditional desktop applications.   The next 10 years is going to see the explosion of web-enabled mobile platforms, either through on-device apps or mobile-optimised website apps.   There’s still a long ways to go in terms of building websites on platforms like DotNetNuke.   Yes, it’s fair to say I still feel the same level of optimism about the future as I did 10 years ago.   I guess I’ll see you in a decade!&lt;/p&gt;  &lt;p&gt;What do you think?  Did .NET get it right 10 years ago?  Will it still be around in 10 years time?  What’s your experiences in the last 10 years – please feel free to share in the comments.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2012/02/12/Happy_10th_Birthday_NET_Frameworkndash_the_little_platform_that_could&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2012/02/12/Happy_10th_Birthday_NET_Frameworkndash_the_little_platform_that_could#Comments</comments>
      <slash:comments>2</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2012/02/12/Happy_10th_Birthday_NET_Frameworkndash_the_little_platform_that_could</guid>
      <pubDate>Sun, 12 Feb 2012 22:35:00 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=143</trackback:ping>
    </item>
    <item>
      <title>New Skin Objects for including jQuery, Javascript and CSS Stylesheets in DotNetNuke Skins</title>
      <link>http://www.ifinity.com.au/2012/01/05/New_Skin_Objects_for_including_jQuery__Javascript_and_CSS_Stylesheets_in_DotNetNuke_Skins</link>
      <description>&lt;p&gt;This blog post brings together two threads of thought that I have been thinking about.   The first is related to my recent blog post &lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions" target="_blank"&gt;Implementing jQuery and Javascript Libraries across DotNetNuke versions&lt;/a&gt;, and the second was a conversation with &lt;a href="http://www.dotnetnuke.com/Resources/Blogs/BlogId/18.aspx" target="_blank"&gt;Scott Willhite&lt;/a&gt; at DotNetNuke World, who asked me why I hadn’t actually ever published anything in the &lt;a href="http://www.dotnetnuke.com/Community/Extensions-Forge.aspx" target="_blank"&gt;DotNetNuke Forge&lt;/a&gt; despite writing lots of stuff.  I didn’t really have a satisfactory answer that didn’t involve using an excuse of inertia or procrastination.&lt;/p&gt;  &lt;p&gt;My prior post on jQuery and Javascript implementation has been pretty widely read, and one of the comments on twitter was thus:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://twitter.com/#!/nokiko/status/148879339834970112"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; border-top: 0px; border-right: 0px; padding-top: 0px" border="0" src="/portals/0/images/skin-js-include.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So as two things lead to one, I decided to create a set of skin objects that would incorporate the work on jQuery and Javascript libraries into re-usable skin objects and create that as a DotNetNuke forge project.&lt;/p&gt;  &lt;p&gt;I already had an older freebie project called iFinity SkinObjects but most of the innovations in that have now been adopted in the DotNetNuke core (nofollow on privacy/terms links, correct home page Url on the Logo, etc).  The SkinObjects project was also written in VB which was now out-of-step with the DotNetNuke core.&lt;/p&gt;  &lt;p&gt;So what I did was create an entirely new project, which I called DotNetNuke.SkinObjectsEx, or ‘Extra Skin Objects’ if you want the friendly name.&lt;/p&gt;  &lt;p&gt;This has been created as a &lt;a href="http://www.dotnetnuke.com/Community/Extensions-Forge/view/ProjectDetail/id/928.aspx"&gt;DotNetNuke Forge project&lt;/a&gt;, which has it’s associated &lt;a href="http://dnnskinobjectsex.codeplex.com/"&gt;Codeplex Project page&lt;/a&gt;.  You can download the install package, example skin and Source code from these locations.&lt;/p&gt;  &lt;h2&gt;What’s in the box?&lt;/h2&gt;  &lt;p&gt;The SkinObjectsEx project contains 4 separate skin objects to use within your DotNetNuke skins.  It comes in an installable DotNetNuke Extension Zip package which is installed as normal.&lt;/p&gt;  &lt;h3&gt;Script &lt;/h3&gt;  &lt;p&gt;The script object allows you to link a javascript file into your skin in a way that is safe for all DotNetNuke versions, and in a way that will leverage the increasing client-site functionality that has been gradually appearing since DotNetNuke 5.0 came out.&lt;/p&gt;  &lt;p&gt;The Script object is also a simple way to ensure that both jQuery and jQuery UI are registered on the page in a DotNetNuke-safe way.  I have seen many, many errors created on sites due to hard-coded jQuery or jQuery UI references into a skin, which then cause problems when new modules or DotNetNuke upgrades are introduced.  This saves the skin author having to devolve into code-behind code, when they can just include a simple reference and be certain the correct version of jQuery is going to be registered on the site.&lt;/p&gt;  &lt;h3&gt;Stylesheet&lt;/h3&gt;  &lt;p&gt;The Stylesheet object is modelled on the standard DNN Styles object, but again brings in the compatibility with the DotNetNuke Client Resource Management framework in order to combine stylesheets for faster performance – in a way that works with all DotNetNuke versions.   In addition, the Stylesheet skin object introduces the ability to link CSS files only for specific DNN versions.  This is done in a from/to pattern, so that you can have one CSS File included up until, say, version 5.6, and another CSS File included from, say, 6.0.   This power allows a skin author to tailor different approaches to different DNN versions, which is very important with the introduction of jQuery UI in DNN 6, which brought a lot of standard CSS definitions with it.&lt;/p&gt;  &lt;h3&gt;PageLink&lt;/h3&gt;  &lt;p&gt;The PageLink skin object provides a simple way to create a link to a specific page in your DotNetNuke site.  While this sounds very simple, in reality skins are often developed away from the intended site, and hard-coding a Url into the skin creates a brittle implementation that is easy to break, and is usually done in a way that doesn’t leverage the proper DotNetNuke Friendly Url API accessed through the NavigateUrl() call.&lt;/p&gt;  &lt;h3&gt;Portal Date&lt;/h3&gt;  &lt;p&gt;This is an old one from the original Skin Objects project, and provides a simple way to add the current date or time to every page in the site.  The most important part of this is that it loads up the localised portal date/time, rather than the date/time of the server which it is running on.  For people who have their site hosted in a different timezone to their intended hosting locality, it’s a neat little way to make things look right.&lt;/p&gt;  &lt;p&gt;In addition to the above objects, the CodePlex downloads include a variation of the DotNetNuke 6 ‘DarkKnight’ skin, which includes implementation of all of the above skin objects in an example.&lt;/p&gt;  &lt;p&gt;This blog post will focus on the Script and Stylesheet skin objects from this point on.  &lt;/p&gt;  &lt;h2&gt;Using the Script Object&lt;/h2&gt;  &lt;p&gt;Adding the Skin Object to a DNN Skin is done like this:&lt;/p&gt;  &lt;p&gt;First, you register the skin object in the skin:&lt;/p&gt;  &lt;p&gt;&lt;%@ Register TagPrefix="dnn" TagName="SCRIPT" Src="~/DesktopModules/SkinObjectsEx/Script.ascx" %&gt;&lt;/p&gt;  &lt;p&gt;Then, for each Script library you want referenced on the generated page, you add a new Skin object:&lt;/p&gt;  &lt;p&gt;&lt;dnn:SCRIPT id="jquery" ScriptType="jQuery" runat="server" /&gt;   &lt;br /&gt;&lt;dnn:SCRIPT id="jqueryUI" ScriptType="jQueryUI" runat="server" /&gt;    &lt;br /&gt;&lt;dnn:SCRIPT id="cycle" ScriptType="other" Path="skin" Location="jquery.cycle.min.js" name="jquery_cycle" InHeader="false" Order="e_Default"  runat="server"/&gt;    &lt;br /&gt;&lt;dnn:SCRIPT id="hoverintent" ScriptType="other" Path="relative" location="~/Resources/Shared/Scripts/jquery/jquery.hoverIntent.min.js" name="hoverintent" Order="e_Default" runat="server" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;The above example shows 4 different Scripts to be included on the output page.  The first is a request for the jQuery library.  The second is a request for the jQuery UI library.  The last two are references to the ‘jquery.cycle.min.js’ and ‘jquery.hoverintent.min.js’ libraries which are referenced in the ‘DarkKnight’ skin.  &lt;/p&gt;  &lt;p&gt;The final two references replace this in the standard DNN 6 DarkKnight skin:&lt;/p&gt;  &lt;p&gt;&lt;script type="text/javascript" src="&lt;%=SkinPath %&gt;jquery.cycle.min.js"&gt;&lt;/script&gt;   &lt;br /&gt;&lt;script runat="server"&gt;    &lt;br /&gt;  'for mega menu we need to register hoverIntent plugin, but avoid duplicate registrations    &lt;br /&gt;  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load    &lt;br /&gt;    Page.ClientScript.RegisterClientScriptInclude("hoverintent", ResolveUrl("~/Resources/Shared/Scripts/jquery/jquery.hoverIntent.min.js"))    &lt;br /&gt;  End Sub    &lt;br /&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;There are 6 different properties in the Script object, all of which combine to control the behaviour of the way the final script is linked on the output page.&lt;/p&gt;  &lt;p&gt;The properties are:&lt;/p&gt;  &lt;h3&gt;ScriptType &lt;/h3&gt;  &lt;p&gt;ScriptType controls the type of script the skin object uses.  There are three choices: ‘jQuery’, ‘jQueryUI’,’other’.  The first two should be obvious – they just include a reference to the jQuery and jQueryUI libraries accordingly.  The ‘other’ is anything else, apart from jQuery.  You don’t need to include this value for ‘other’ types, as ‘other’  is the default.&lt;/p&gt;  &lt;p&gt;Looking back at the prior example, you can see how the ScriptType is used in the 4 different examples.&lt;/p&gt;  &lt;p&gt;Path&lt;/p&gt;  &lt;p&gt;Path is also a value with set values.  These are ‘Skin’, ‘Absolute’ and ‘Relative’.  When using a path type of ‘Skin’, the library is referenced from the installed skin path.  When using a path type of ‘Absolute’, the library is reference from the absolute location specified.  When using ‘Relative’, the location is specified with a tilde (~) and is passed into the ‘ResolveUrl’ function to create a fully qualified path.   In the above examples, you can see how the ‘hoverintent.js’ skin object replaces the included ‘code behind’ in the skin files.&lt;/p&gt;  &lt;h3&gt;Location&lt;/h3&gt;  &lt;p&gt;Location is the component that combines with the ‘Path’ value to create the fully reference Url.   For Path=”Skin” location is just the relative path in the Skin directory (ie, where the skin is installed).   For Path=”Absolute”, Location is the fully qualified Url to the file.  For ‘Relative’, location is the relative Url that ASP.NET will resolve at runtime.&lt;/p&gt;  &lt;h3&gt;Name&lt;/h3&gt;  &lt;p&gt;Name is just a unique identifier that ensures that the script is not added twice in the one page.&lt;/p&gt;  &lt;h3&gt;Order&lt;/h3&gt;  &lt;p&gt;Order is used for DNN 6.1+ installations, and determines where in the list of resources the item is inserted.  These values come from the earlier work done in the &lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions"&gt;jQuery and Javascript Libraries in DotNetNuke&lt;/a&gt; post already referenced.  &lt;/p&gt;  &lt;p&gt;The values for Order are:&lt;/p&gt;  &lt;p&gt;a_BeforejQuery, b_BeforeDnnXml, c_BeforeDomPositioning, d_BeforeDnnControls, e_Default&lt;/p&gt;  &lt;p&gt;The alphabetic prefix just helps with understanding the overall order of things.  This allows you to control where in the hierarchy of scripts your linked script will appear.&lt;/p&gt;  &lt;h3&gt;InHeader&lt;/h3&gt;  &lt;p&gt;This is a boolean value which controls whether or not to include the header within the &lt;head&gt; section of the Html, or whether to include it in the &lt;body&gt; section.  In some cases, this will be overridden by the logic contained within the code, to prevent quirks for individual DNN Versions from breaking your javascript.  These are always moving from &lt;head&gt; to &lt;body&gt;, and only apply to the jQuery and jQuery UI usage.&lt;/p&gt;  &lt;h2&gt;StyleSheet&lt;/h2&gt;  &lt;p&gt;The StyleSheet skin object uses a similar approach to the Script object in that it uses the same logic to seamlessly integrate regardless of the installed DotNetNuke version.&lt;/p&gt;  &lt;p&gt;Here’s a reference as shown in the example DarkKnight skin:&lt;/p&gt;  &lt;p&gt;&lt;%@ Register TagPrefix="dnn" TagName="STYLESHEET" Src="~/DesktopModules/SkinObjectsEx/StyleSheet.ascx" %&gt;&lt;/p&gt;  &lt;p&gt;and the skin object usage:&lt;/p&gt;  &lt;p&gt;&lt;dnn:STYLESHEET runat="server" id="StylesIE7Ex" Name="IE7MinusEx" path="skin" location="ie7skin.css" Condition="LT IE 8" Order="c_BeforeSkin" InHeader="true" /&gt;&lt;/p&gt;    &lt;p&gt;Note that this replaces the DNN STYLES reference in the DNN 6 DarkKnight skin:&lt;/p&gt;  &lt;p&gt;&lt;dnn:STYLES runat="server" ID="StylesIE7" Name="IE7Minus" StyleSheet="ie7skin.css" Condition="LT IE 8" UseSkinPath="true"/&gt;&lt;/p&gt;  &lt;p&gt;On first glance these would appear to be the same, and they largely are (the STYLESHEET object is a fork of the STYLES code).   However, the StyleSheet skin object has some big advantages:   &lt;br /&gt;- it will utilise the DotNetNuke Client Resource Management (aka &lt;em&gt;imbibe&lt;/em&gt;) framework to combine all stylesheets into a single downloadable file, if it is available&lt;/p&gt;  &lt;p&gt;- it allows you to specify &lt;em&gt;FromVersion&lt;/em&gt; and &lt;em&gt;ToVersion&lt;/em&gt; properties which controls whether or not to include the stylesheet with a particular version or range of DNN versions.  This allows the skin author to have a single installable skin that has a different stylesheet for, say, DNN 6 and DNN 5.&lt;/p&gt;  &lt;p&gt;Here are the properties for the StyleSheet object:   &lt;br /&gt;Condition&lt;/p&gt;  &lt;p&gt;Carried over from the Styles object, the condition allows you to add a CSS Condition which helps to determine usage for particular browsers&lt;/p&gt;  &lt;h3&gt;Media &lt;/h3&gt;  &lt;p&gt;This property is carried over from the Styles object, and allows you to specify the media attribute for the stylesheet.&lt;/p&gt;  &lt;h3&gt;Name&lt;/h3&gt;  &lt;p&gt;The Name property uniquely identifies a stylesheet so that a single version is implemented per page&lt;/p&gt;  &lt;p&gt;Path&lt;/p&gt;  &lt;p&gt;The Path location works the same as the Script object, in that it has a choice of Absolute/Relative and Skin.  This controls the references of the Location property.&lt;/p&gt;  &lt;h3&gt;Location&lt;/h3&gt;  &lt;p&gt;As with the Script object, the Location is used to combine with the Path value, and determine the actual Url of the stylesheet.  See the Script definition for ‘Location’ above for more information.&lt;/p&gt;  &lt;h3&gt;Order&lt;/h3&gt;  &lt;p&gt;As with the Script object, the Order path allows you to specify a particular insertion order for a stylesheet.  Note this value only works for DNN 6.1+ versions, and is ignored in prior DNN versions (in these cases, order is determined by the execution order, ie, the location on the skin file).   The values for order are:&lt;/p&gt;  &lt;p&gt;a_BeforeDefault, b_BeforeModule, c_BeforeSkin, d_BeforeContainer, e_BeforePortal, f_Last&lt;/p&gt;  &lt;p&gt;These are entered as a string property value, which then converts them to a numeric value.&lt;/p&gt;  &lt;h3&gt;FromVersion / ToVersion&lt;/h3&gt;  &lt;p&gt;These two properties allow you to specify from and to DNN Versions.  If the currently executing DNN version falls greater than or equal to the FromVersion value, and less than or equal to the ToVersion value, the file will be included.   You do not need both, but can specify both.  So you can have a ‘FromVersion=”6.0"’ to always include the CSS File from Version 6, or you can have ‘FromVersion=”5.5” ToVersion=”5.7” to only use the file in versions 5.5, 5.6 and 5.7 (although 5.7 doesn’t exist).  And you can have a single version like ‘ToVersion=”5.4”’ to include the file up to the 5.4 version.&lt;/p&gt;  &lt;p&gt;The format allows you to specify any level of detail, so you can say ‘FromVersion=”6”’ which is just the major build version, or you can qualify to the minor version (“6.1”) or down to the revision value (“6.1.1”).  The system will automatically take the value down to the lowest value for any part of the version that isn’t supplied.  So “6” is represented as “6.0.0” and “6.1” is represented as “6.1.0”.&lt;/p&gt;  &lt;p&gt;That’s all there is to it!  As the entire component is built without the usual iFinity branding I include, and is distributed under the same free licence as DotNetNuke, any skin developers can integrate these features into not only custom skins for particular clients, or into distributable skins they sell on Snowcovered or elsewhere.&lt;/p&gt;  &lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;  &lt;p&gt;I’m guessing at some questions here as I haven’t really spoken to anyone about this, but here goes:&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Why wouldn’t I just use the &lt;em&gt;DnnJsInclude&lt;/em&gt; and &lt;em&gt;DnnCssInclude&lt;/em&gt; skin objects in DNN 6.1?&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;These are the future path for everyone targeting 6.1+ DNN releases, and work well and are fully integrated into the &lt;em&gt;Imbibe&lt;/em&gt; framework.  However, in the messy real world of DNN installs, not everyone is up to date on the latest release, and building a skin to suit both current installs and future DNN 6 upgrades is tricky.  The approach in this project gives the best of both worlds : simple JS and CSS inclusion now, and a seamless future upgrade path for when the client finally brings their install up to date in DNN 6.&lt;/p&gt;  &lt;p&gt;It also suits those who want to sell/distribute a DNN 6.1 compatible skin now, but not close themselves off to those who are still running DNN 5.  &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Why would you include a Script object of ScriptType=”jQuery” – even in DNN 5, this was included?&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;It’s true that DNN5 shipped with jQuery, however, it’s possible that a specific page doesn’t have the jQuery library referenced.  This is because the DNN code – somewhere in the page execution – has to call the jQuery registration code.   The Script skin object with ‘ScriptType=”jQuery”’ will guarantee to the skin developer that jQuery is reference on the output page, &lt;em&gt;no matter what the installed DNN version is&lt;/em&gt;.  That way no skin developer should ever have to include the jQuery library themselves.   &lt;/p&gt;  &lt;p&gt;The same goes for the jQuery UI library – which is included in DNN 6 but not DNN 5.  By including a ‘ScriptType=”jQueryUI”’ Script skin object, you can be sure of a reference to jQuery UI being included on your output page, no matter if it is DNN5 or DNN6, and you can be guaranteed not to have a duplicate jQuery UI reference in DNN 6.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;What about DNN 4?  Is this compatible?&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;The project is compiled against DNN 5.1.2 so can’t be used on earlier versions.  You shouldn’t be doing DNN 4 stuff, really, it’s way out of date.  However, if the powers-that-be control your DNN life and DNN 4 is it, you can probably change the reference and recompile to a DNN 4 version. It should still work OK.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Why would I want different CSS references for different DNN Versions&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;The inclusion of jQuery UI and the extensive use (and redefinition) of jQuery UI components (like the &lt;em&gt;jQuery UI Tabs&lt;/em&gt; CSS classes) means that, for example, a CSS Class built for a DNN 5 skin might not layout properly when installed on a DNN 6 install.  A skin designer wishing to make a cross-version compatible skin can use this component to run slightly different CSS files for 5 and 6, and their clients won’t know the difference – and perhaps most importantly – won’t ring them in the middle of the night after upgrading their DNN install and finding their layout all broken (or is it just me that doesn’t share a timezone with &lt;em&gt;anyone else in the world&lt;/em&gt;)&lt;/p&gt;  &lt;p&gt;&lt;u&gt;What’s with this ‘Imbibe’ stuff?&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;This is my little personal crusade towards better project naming.  I mean ‘DotNetNuke Client Resource Management Framework’ – that’s a mouthful of syllables, and distinctly Acronym-challenged (DCRMF?).  So I called it Imbibe and hope it catches on.  It won’t, of course, but if anyone ever comes up to me one day and goes ‘I’ve got a question about &lt;em&gt;Imbibe&lt;/em&gt; for you’ I will give them a little &lt;em&gt;high-five&lt;/em&gt;!&lt;/p&gt;  &lt;p&gt;Of course, with all those FAQ’s answered, please feel free to hit me up with more questions in the comments below, or in the CodePlex project.  This is my first Forge project released into the wild, so please give valuable feedback to get it up and running and living an independent life in the DNN ecosystem.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2012/01/05/New_Skin_Objects_for_including_jQuery__Javascript_and_CSS_Stylesheets_in_DotNetNuke_Skins&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2012/01/05/New_Skin_Objects_for_including_jQuery__Javascript_and_CSS_Stylesheets_in_DotNetNuke_Skins#Comments</comments>
      <slash:comments>3</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2012/01/05/New_Skin_Objects_for_including_jQuery__Javascript_and_CSS_Stylesheets_in_DotNetNuke_Skins</guid>
      <pubDate>Thu, 05 Jan 2012 02:33:23 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=141</trackback:ping>
    </item>
    <item>
      <title>Improve Urls for the Ventrian News Article Module with the News Articles Friendly Url Provider</title>
      <link>http://www.ifinity.com.au/2011/12/15/Improve_Urls_for_the_Ventrian_News_Article_Module_with_the_News_Articles_Friendly_Url_Provider</link>
      <description>&lt;p&gt;The big change for &lt;a href="http://www.ifinity.com.au/2011/10/26/Announcing_Url_Master_25_The_Next_Generation_in_DotNetNuke_Urls" target="_blank"&gt;Url Master 2.5&lt;/a&gt; was the inclusion of the ability to build custom module providers for &lt;a href="http://www.ifinity.com.au/2011/10/26/Build_your_own_Custom_DotNetNuke_Module_Provider_and_start_creating_the_Friendly_Urls_you_need_for_your_SEO_strategy" target="_blank"&gt;generating module-specific Friendly Urls&lt;/a&gt;.  Part of this strategy was to develop a set of module providers for popular third-party modules.  This kicked off with the &lt;a href="http://www.ifinity.com.au/2011/10/26/New_Custom_Url_Provider_creates_Friendly_Urls_for_the_DotNetNuke_Blog_Module" target="_blank"&gt;DotNetNuke Blog module provider&lt;/a&gt;.   &lt;/p&gt;  &lt;p&gt;The next module provider to be developed is the News Articles Friendly Url Provider, which transforms the Urls generated and used by the &lt;a href="http://www.ventrian.com/Products/Modules/NewsArticles.aspx" target="_blank"&gt;Ventrian News Articles module&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The new provider is a plug-in for the Url Master module, and provides seamless and easy-to-use features that completely change the way News Articles Urls look.&lt;/p&gt;  &lt;h2&gt;Improvements to Article Urls&lt;/h2&gt;  &lt;p&gt;Consider this Url which is generated by installing the News Articles module on a fresh DotNetNuke 6 installation:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/newsarticles/tabid/135/articleType/ArticleView/23/The-Title-of-the-Article.aspx"&gt;http://example.com/newsarticles/tabid/135/articleType/ArticleView/23/The-Title-of-the-Article.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;By implementing the Url Master module, plus the News Articles Friendly Url Provider, and setting a few options*, the above Url can be changed to this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/the-title-of-the-article"&gt;http://example.com/the-title-of-the-article&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Yes&lt;/em&gt;, you read that right, that’s how short you can get the Url.&lt;/p&gt;  &lt;p&gt;But maybe you use the News Articles module as a blog, and you want some Urls that make it clearly identifiable as a blog.  Change the options **,  and you can have your Url look like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/2011/12/15/the-title-of-the-article"&gt;http://example.com/2011/12/15/the-title-of-the-article&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(incidentally, this matches the style of Url this blog now uses)&lt;/p&gt;  &lt;p&gt;*options used in first Url : Url Master – spaces replaced with hyphens, converted to lower case, no page extensions.  News Articles Friendly Url Provider – ‘Article Style’ Urls, Don’t show DNN Page path in Url.&lt;/p&gt;  &lt;p&gt;** options used in second Url : as per first Url, but using ‘Blog Style’ Urls instead of ‘Article Style’&lt;/p&gt;  &lt;h2&gt;Other News Articles Urls&lt;/h2&gt;  &lt;p&gt;Of course, the articles Urls aren’t the only ones.  There are Author Urls, Archive Urls and Page Urls.&lt;/p&gt;  &lt;h3&gt;Page Urls&lt;/h3&gt;  &lt;p&gt;Page urls are for when you have more than one page in your Article.  You have a choice here – either go with the unique title of the page, like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/the-second-page-of-the-article"&gt;http://example.com/the-second-page-of-the-article&lt;/a&gt; , or go with a page numbering scheme, like this : &lt;a href="http://example.com/the-title-of-the-article/p/2"&gt;http://example.com/the-title-of-the-article/p/2&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The choice is yours – either go for a simple page numbering scheme, or create specific unique page Urls to optimise for the content on each page.&lt;/p&gt;  &lt;h3&gt;Author Urls&lt;/h3&gt;  &lt;p&gt;With the Author Urls (which list all articles written by a specific author) you change change between using the Author DotNetNuke username or the DotNetNuke displayname.&lt;/p&gt;  &lt;p&gt;So you can go from:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/newsarticles/tabid/135/articleType/AuthorView/AuthorId/13/bjones.aspx"&gt;http://example.com/newsarticles/tabid/135/articleType/AuthorView/AuthorId/13/bjones.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;to &lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/news-articles/bob-jones"&gt;http://example.com/news-articles/bob-jones&lt;/a&gt;  or &lt;a href="http://example.com/news-articles/bjones"&gt;http://example.com/news-articles/bjones&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Archive Urls&lt;/h3&gt;  &lt;p&gt;Archive Urls show the articles by their creation date.  Normally, you’d expect to see something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/newsarticles/tabid/135/articleType/ArchiveView/dateType/Month/year/2011/month/12/default.aspx"&gt;http://example.com/newsarticles/tabid/135/articleType/ArchiveView/dateType/Month/year/2011/month/12/default.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Too long!  How about:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://example.com/2011/12"&gt;http://example.com/2011/12&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now that’s short and sweet!&lt;/p&gt;  &lt;h2&gt;How does it work?&lt;/h2&gt;  &lt;p&gt;Well, it’s simple really.  Assuming you’ve already got the Url Master module installed and configured, you just install the News Aricles Friendly Url Provider via the DotNetNuke extensions.   Activate the provider using the Admin-&gt;Portal Urls page, and then choose your options using the built-in provider Settings page:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/portals/0/images/news-articles-provider-sett.jpg" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="" border="0" alt="News Articles Friendly Url Provider Settings Page" src="http://www.ifinity.com.au/portals/0/images/news-articles-provider-sett.jpg" width="640" height="440" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Using this page, you just choose the different Url options for each page in your portal that has a News Articles module on it, apply the changes, and the Urls are instantly transformed.&lt;/p&gt;  &lt;h2&gt;What about my existing Articles?&lt;/h2&gt;  &lt;p&gt;The News Articles module has been around for a while, and there are many thousands of articles out there on the web already written.  Some have been around for a &lt;em&gt;long time&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;The last thing you want to do is break the Urls for these old articles, some of which have good search engine rankings.&lt;/p&gt;  &lt;p&gt;Of course, implementing this provider doesn’t stop those old articles from working.  They’ll still work as intended.  But you’ve got some options.&lt;/p&gt;  &lt;p&gt;Firstly : you can activate the ‘Redirect ‘old’ style Urls to newer Urls.  So if you implement the provider, all your ‘old’ Urls will be redirected across.&lt;/p&gt;  &lt;p&gt;Secondly : you can choose which article the new Urls will start from.  By default, this is id 0 – as in, all articles will use the new Ids.  But you can enter your last article created (say, 145) and then any article from 146 onwards will use the new format, and earlier articles will keep using the standard format.   This prevents having changes to existing articles and large-scale 301 redirects implemented and leaves articles ranking well in search engines as they are.  Naturally, the redirect functionality works with the starting Article ID.&lt;/p&gt;  &lt;h2&gt;Where to get the News Articles Friendly Url Provider&lt;/h2&gt;  &lt;p&gt;The News Articles Friendly Url provider is available from the &lt;a href="http://www.ifinity.com.au/Products/Ventrian_News_Articles_SEO_Url_Provider" target="_blank"&gt;News Articles Friendly Url Provider product page&lt;/a&gt;.  This is a licensed module, prices start from $30, but you can get a free Trial Licence by going to the &lt;a href="http://www.ifinity.com.au/Licensing/Product/iFinity.NewsArticlesFriendlyUrlProvider" target="_blank"&gt;licensing page&lt;/a&gt;.   That will give you the ability to install the provider, try it out and decide whether you like the new Urls.&lt;/p&gt;  &lt;p&gt;Online help for the module is provided through the &lt;a href="http://www.ifinity.com.au/Products/Knowledge_Base/News_Articles_Friendly_Url_Provider" target="_blank"&gt;News Articles Friendly Url Provider Knowledge Base&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The News Articles Friendly Url Provider is shown at the &lt;a href="http://url-master.com/News-Articles" target="_blank"&gt;Url Master demonstration site&lt;/a&gt;.  &lt;/p&gt;  &lt;h2&gt;Comments, Questions&lt;/h2&gt;  &lt;p&gt;This is a brand-new module hot off the coding bench, so if you have any comments or questions, please feel free to leave a comment below.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/12/15/Improve_Urls_for_the_Ventrian_News_Article_Module_with_the_News_Articles_Friendly_Url_Provider&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/12/15/Improve_Urls_for_the_Ventrian_News_Article_Module_with_the_News_Articles_Friendly_Url_Provider#Comments</comments>
      <slash:comments>3</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/12/15/Improve_Urls_for_the_Ventrian_News_Article_Module_with_the_News_Articles_Friendly_Url_Provider</guid>
      <pubDate>Thu, 15 Dec 2011 00:11:55 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=140</trackback:ping>
    </item>
    <item>
      <title>Implementing jQuery, jQuery UI and Javascript libraries across DotNetNuke Versions</title>
      <link>http://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions</link>
      <description>&lt;p&gt;DotNetNuke 6.0 brought jQuery UI directly into the framework as a ‘1st class’ DotNetNuke member.   It also allowed developers to request the DotNetNuke jQuery registration code instead of each developer independently including the library, which prevents multiple versions and the subsequent page errors this will create.  I have previously blogged about this in my post &lt;a href="http://www.ifinity.com.au/Blog/EntryId/121/Using-jQuery-UI-with-DotNetNuke-5-and-6-in-the-same-module" target="_blank"&gt;Using jQuery UI with DotNetNuke 5 and 6 in the same module&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;With the release of DotNetNuke 6.1, the new Client Resource Management (aka &lt;em&gt;imbibe&lt;/em&gt;) framework has been included.   This framework not only includes jQuery and jQuery UI in DotNetNuke, but it uses a client registration framework so that other libraries and Javascript files can be included in the correct order.  The best resource for this is Ian Robinson’s blog post : &lt;a href="http://www.dotnetnuke.com/Resources/Blogs/EntryId/3226/jQuery-amp-jQuery-UI-in-DNN-6-1-0-and-6-1-1.aspx" target="_blank"&gt;jQuery &amp; jQuery UI in DotNetNuke 6.1 and 6.1.1&lt;/a&gt;.   Because all of the various scripts are then registered in a single place, the framework can then combine them into one large js file, which drastically improves client side performance.   You can read more about this in the DotNetNuke Wiki entry on the &lt;a href="http://www.dotnetnuke.com/Resources/Wiki/Page/Client-Resource-Management-API.aspx" target="_blank"&gt;Client Resource Management API&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The 6.1 changes are an exciting inclusion into the world of javascript management for DotNetNuke development, but many (if not most!) people are not yet building solutions that target the 6.1 environment exclusively.   If you’re currently building for an earlier environment which will (one day) be upgraded, or you’re building a module that may be applied against a range of DNN versions, then this blog post is for you.&lt;/p&gt;  &lt;p&gt;While my previous blog entry was about how to leverage the jQuery UI registration, I’m going to build upon this and provide a one-stop solution to all DNN / jQuery / Javascript / CSS needs.  This is simple a code file which you can include in your own project which will save you the hassle of going through and trying to write code to get jQuery to work for a specific version.  This code has the smarts to work around all of the DotNetNuke versions and register the libraries for you.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/LinkClick.aspx?link=downloads/ScriptController_01.zip&amp;tabid=69&amp;mid=381" target="_blank"&gt;Download the ScriptController Code&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;What the code does&lt;/h2&gt;  &lt;p&gt;The code hides away the different ways you must handle both jQuery and Javascript/Css File registration in your page.  It automatically chooses the best way to handle the request based on the current DNN version.  The code is backwards compatible to DotNetNuke 4.x versions, so you don’t need to reference the latest 6.1.1 DotNetNuke libraries in order to use the code (this is handled by reflection).   All this means you can compile in one version of the code and be confident it will run optimised for the DotNetNuke version it gets installed in.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="10" width="638"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="71"&gt; &lt;/td&gt;        &lt;td valign="top" width="120"&gt;DotNetNuke 4&lt;/td&gt;        &lt;td valign="top" width="118"&gt;DotNetNuke 5&lt;/td&gt;        &lt;td valign="top" width="121"&gt;DotNetNuke 6&lt;/td&gt;        &lt;td valign="top" width="129"&gt;DotNetNuke 6.1&lt;/td&gt;        &lt;td valign="top" width="77"&gt;DotNetNuke 6.1.1+&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="71"&gt;jQuery&lt;/td&gt;        &lt;td valign="top" width="120"&gt;Adds Google CDN reference&lt;/td&gt;        &lt;td valign="top" width="118"&gt;Uses Dnn jQuery Registration&lt;/td&gt;        &lt;td valign="top" width="121"&gt;Uses Dnn jQuery Registration&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Uses Dnn jQuery Registration&lt;/td&gt;        &lt;td valign="top" width="77"&gt;Uses Dnn jQuery Registration&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="71"&gt;jQuery UI&lt;/td&gt;        &lt;td valign="top" width="120"&gt;Adds Google CDN reference&lt;/td&gt;        &lt;td valign="top" width="118"&gt;Adds Google CDN reference&lt;/td&gt;        &lt;td valign="top" width="121"&gt;Uses Dnn jQuery UI Registration&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Uses Dnn jQuery UI Registration&lt;/td&gt;        &lt;td valign="top" width="77"&gt;Uses Dnn jQuery UI Registration&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="71"&gt;Javascript Libraries&lt;/td&gt;        &lt;td valign="top" width="120"&gt;Adds Head or Body Script registration&lt;/td&gt;        &lt;td valign="top" width="118"&gt;Adds Head or Body Script registration&lt;/td&gt;        &lt;td valign="top" width="121"&gt;Adds Head or Body Script registration&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Registers script for body inclusion&lt;/td&gt;        &lt;td valign="top" width="77"&gt;Registers Script for Head or Body inclusion&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="71"&gt;Css Files&lt;/td&gt;        &lt;td valign="top" width="120"&gt;Adds Head registration&lt;/td&gt;        &lt;td valign="top" width="118"&gt;Adds Head registration&lt;/td&gt;        &lt;td valign="top" width="121"&gt;Adds Head registration&lt;/td&gt;        &lt;td valign="top" width="129"&gt;Registers file for head or body inclusion&lt;/td&gt;        &lt;td valign="top" width="77"&gt;Registers file for head or body inclusion&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Above : Table of actions for code library.   To understand, look at the column as per the DNN version, then at the Row for the function you would use in your code.  Where they meet, this is the action that the code library does for you.  However, the function call (left hand side column) is the same for all versions, the complexity is hidden away for you.&lt;/p&gt;  &lt;p&gt;An Example:&lt;/p&gt;  &lt;p&gt;The following code snippet shows how, in the Page_Load of a module control, the above code library is called in order to setup the required client-side scripts and Css files.  The code library is called &lt;em&gt;&lt;strong&gt;ScriptController&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;  &lt;pre style="font-family: courier-new; font-size: 11px"&gt;
//now get the javascript in
ScriptController.InjectjQueryLibary(this.Page, true, true);
//module-specific jquery code
ScriptController.InjectJsLibrary(this.Page, "moduleEdit_js", this.ControlPath + "/js/moduleEdit.js", true, ScriptController.ScriptInjectOrder.e_Default);
//and get the css file in
ScriptController.InjectCssReference(this.Page, "moduleEdit_css", this.ControlPath + "/moduleEdit.css", true, ScriptController.CssInjectOrder.f_Last);
//and put in a pre-dnn 6 ui script plus the jquery tabs library
string preDnn6CssFile = this.ControlPath + "/ui-tabs.css";
ScriptController.InjectjQueryTabsCss(this.Page, preDnn6CssFile, null);&lt;/pre&gt;

&lt;p&gt;The above code shows the ScriptController library being used. The steps are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Inject the jQuery library reference.  This call gives you the option to include the jQuery UI library as well&lt;/li&gt;

  &lt;li&gt;Inject the moduleEdit.js Javascript library.  This call gives you the choice of whether to include the script in either the page &lt;head&gt; or &lt;body&gt;.  The ScriptController.ScriptInjectOrder is an enumerated type which gives you the choice of where in the overall page output the script should be located.  Note, however, that this only works for DNN 6.1+ versions – in earlier DNN versions this value will be ignored, and it’s pot luck which order your script comes out.&lt;/li&gt;

  &lt;li&gt;Inject the moduleEdit.css file.  This call, like the Js registration, gives you the ability to include the file in the &lt;head&gt; or &lt;body&gt;, and uses an enumerated type to give you the choice where in the page order the Css file gets registered, but again, only for DNN 6.1+.&lt;/li&gt;

  &lt;li&gt;Conditionally inject a Css File for the jQuery Tabs Css theme.  This call gives you the option of providing a pre-DNN 6 Css file which defines a custom jQuery UI Tabs style, and also a post-DNN 6 (ie, 6 and above) Css file for defining jQuery UI Tabs styles.   The reason for this is that DNN 6 has a built-in Tabs style for the various admin pages that use the jQuery UI Tabs, and this snippet is for a module edit page.  So, for pre-DNN 6 versions, it defines it’s own style (because DNN 5 doesn’t have a ‘tabs’ style), but for post-DNN 6 versions, it uses &lt;em&gt;null&lt;/em&gt;, which means just use the standard DNN 6 tabs style.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The built-in Enumerated types for ScriptInjectOrder and CssInjectOrder give the ability to conveniently broad-brush locate where in the script order you want the script to go.  This only works with DNN 6.1 because it requires the Client Resource Management API to do the work of locating the script.   The enumerated types are prefixed with a_, b_, c_ so you get an idea of the order of the libraries as they are output onto the page.&lt;/p&gt;

&lt;h2&gt;Wrapping Up&lt;/h2&gt;

&lt;p&gt;This code library is free for all to use and is licensed under the same licence as the DNN core.  So please take it and use it in your modules, projects and more.&lt;/p&gt;

&lt;p&gt;If you find any bugs or problems, please let me know so I can correct them.   If you come up with a better way of doing things, also let me know.  If there is sufficient interest it could be located on a public source solution.&lt;/p&gt;

&lt;p&gt;Using this approach will massively simplify the ability for developers to create multi-version code instead of having to try and step through all the minefields again.&lt;/p&gt;

&lt;p&gt;Questions/Comments/Brickbats and Bouquets through the comments below!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ifinity.com.auhttp://www.ifinity.com.au/LinkClick.aspx?link=downloads/ScriptController_01.zip&amp;tabid=69&amp;mid=381" target="_blank"&gt;Download the ScriptController Code&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions#Comments</comments>
      <slash:comments>7</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/12/05/Implementing_jQuery__jQuery_UI_and_Javascript_libraries_across_DotNetNuke_Versions</guid>
      <pubDate>Mon, 05 Dec 2011 23:46:46 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=139</trackback:ping>
    </item>
    <item>
      <title>Google Secure Search Impacts Keyword Analysis for SEO and gives you (not provided) in Analytics - What you can do about it</title>
      <link>http://www.ifinity.com.au/2011/12/01/Google_Secure_Search_Impacts_Keyword_Analysis_for_SEO_and_gives_you_(not_provided)_in_Analyticsndash_What_you_can_do_about_it</link>
      <description>&lt;p&gt;Something that quietly slipped past a lot of people at the start of November was the announcement from &lt;a href="http://googleblog.blogspot.com/2011/10/making-search-more-secure.html" target="_blank"&gt;Google that was rolling out SSL Search&lt;/a&gt; for all logged-in Google users.&lt;/p&gt;  &lt;p&gt;This can be broken down like this:&lt;/p&gt;  &lt;p&gt;- SSL Search means that the search session is conducted over https&lt;/p&gt;  &lt;p&gt;- logged-in Google users covers the universe of people who are logged into a google service, such as iGoogle, Google+, Gmail – plus a whole pile of others.&lt;/p&gt;  &lt;p&gt;- SSL Searches do not provide the Keyword data in the referer value for a click-through from Google&lt;/p&gt;  &lt;p&gt;This fact that SSL searches do not pass the search query data (ie, the keywords used) onto the site that is clicked on has a very large impact on Analytics packages, which collect that data and summarize it for analysis.&lt;/p&gt;  &lt;p&gt;This means that data using any Analytics package (not just Google Analytics) will &lt;a href="http://analytics.blogspot.com/2011/10/making-search-more-secure-accessing.html" target="_blank"&gt;no longer provide keyword data for some Google searches&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The justification given was that:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;As search becomes an increasingly customized experience, particularly for signed in users, we believe that protecting these personalized search results is important.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Sounds good, right?  They just want to protect user privacy.&lt;/p&gt;  &lt;p&gt;Unfortunately for them, there is this little caveat:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;You will continue to see aggregate query data with no change, including visits from users who aren’t signed in &lt;em&gt;and visits from Google “cpc”.&lt;/em&gt; (italics mine)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I would find it much easier to swallow their line on protecting user privacy, except for the fact that they don’t want to protect the privacy when it comes to websites buying ads.  Privacy for the user is only a concern for free traffic, not for paid traffic – and most google users wouldn’t really be able to tell the difference.&lt;/p&gt;  &lt;p&gt;But it’s OK, Google tells us, because:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Keep in mind that the change will affect only a minority of your traffic&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Well, that’s very heartening for them.  As I noted previously, the change affects Google Analytics, which will no longer provide keyword data for anyone who is signed in.  Instead, you will get a value that says “(not provided)”.&lt;/p&gt;  &lt;p&gt;But if we take a look at the referral data for this site, we see that in the month of November, 2011:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt; ‘not provided’ included 10% of all keyword searches used on the site&lt;/li&gt;    &lt;li&gt; ‘not provided’ is the keyword used for 71% of all new visits&lt;/li&gt;    &lt;li&gt; ‘not provided’ has a bounce rate of 69%&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So, for all these new visits to this site, I’m unable to :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt; Know what they were looking for&lt;/li&gt;    &lt;li&gt; Work out why they didn’t find what they wanted&lt;/li&gt;    &lt;li&gt; Improve the site content to make the site more valuable to these visitors.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;However, if I paid Google to run some keywords, they will happily give me all this detail.  It kind of flies in the face of the mantra given to people who want to work within Google guidelines of making sure you have relevant, quality content.&lt;/p&gt;  &lt;p&gt;For example, if I find this blog post becomes popular,  it will become very difficult to know whether this is because it contains information about Google Analytics, or because it contains information about the Google SSL Search.  So I won’t know if I should write more articles about one or the other.  Unless, of course, I go out and buy a heap of keywords to see which one works best – then I’ll know.  Imagine trying to run a retail store where you’re not allowed to ask the customer what they are looking for?  The whole idea is crazy.  A website still gets lots of detailed information about each visitor – right down to their location, device, whether they’ve visited before, what pages they read, what language they speak, but somehow it’s a violation of privacy to know what keyword they used? &lt;em&gt;Give me a break&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Now, some readers will realise this has turned into a bit of a rant, which is a bit uncharacteristic of this blog.   Let me establish up front that I respect that Google is a private company with a profit motive and, as such, are free to do whatever they want with their service.   But let me also state that this marks, to me, the official point where Google &lt;a href="http://en.wikipedia.org/wiki/Jumping_the_shark" target="_blank"&gt;jumped the shark&lt;/a&gt; and is no longer the benign, helpful, benevolent ‘don’t be evil’ web property we’ve all regarded them as for the last decade or so.   The sheer front of them saying it’s for privacy – unless you pay up, then we don’t care how much user data you get – reeks of the sort of thing you’d expect from a PR obsessed corporation or Government department.  I can take a lot of things on the chin, but treating people as non-thinking idiots with spin is one thing that doesn’t fly well for me.  Those of us from Down Under are fond of straight-talking and telling it like it is.&lt;/p&gt;  &lt;p&gt;It’s personally frustrating for me, because I have spent a lot of time over the years making DotNetNuke tools for free Google services (Analytics, Sitemaps, etc) only to find out that the key information I use for SEO on this – and any other site – is now to be gradually denied to me as an increasing amount of search comes from Google properties and signed in users.  But then I think if I’m honest I always knew that would be the case – a public company has a fiduciary duty to do it’s best to reward shareholders, and it would take a very strong-willed manager indeed to ignore the amount of cash Google has left lying on the table in the past.&lt;/p&gt;  &lt;p&gt;However, the key takeaway message here is that the ‘Don’t be evil’ motto is dead and buried, and we’re dealing with a monopolist every bit as powerful and intent on maximising it’s position as Microsoft did with it’s operating system lockout.  So everyone needs to start operating and making key decisions with that background.&lt;/p&gt;  &lt;p&gt;OK, so now what?&lt;/p&gt;  &lt;p&gt;Well, moving past the rant onto the action.    The simple fact is that a lot of us gain a large percentage of our traffic from Google web properties (and devices, too, viz Android) and so we’ve got to take what is given to us.  I’m itching to use more colorful language, but I’ll restrain myself.&lt;/p&gt;  &lt;p&gt;The rest of the post is dedicated to being pro-active about it and working out ways to ascertain the impact and think about new strategies.  After all, change implies opportunity, does it no?&lt;/p&gt;  &lt;h2&gt;Quantify the size of the problem&lt;/h2&gt;  &lt;p&gt;This means tracking the growth of ‘(not provided)’ searches over time.  If it’s at about 5% or so, and remains that way, it’s unlikely to cause too much bother over time.  The amount of signed-in searches will be highly correlated with your sources of traffic.  Basically, the more ‘tech savvy’ your audience, the more likely they’ll have a Google sign-in and be using it.  If it’s static, well, then you’ll just have to work with it.&lt;/p&gt;  &lt;p&gt;If the (not provided) keyword starts to grow, however, then you’ll need to start working out ways to try and ascertain the data.  This might mean doing your own analysis on the main keywords of a page, and then manually linking that to the page and assuming that the traffic the page is getting is from those keywords.  &lt;/p&gt;  &lt;p&gt;How to measure your (not provided) traffic.&lt;/p&gt;  &lt;p&gt;It’s easy to make the mistake of comparing apples with oranges.  First, only Google organic traffic is affected.  So you need to drill down in your reports, going into:&lt;/p&gt;  &lt;p&gt;&gt;Traffic Sources &gt;Sources &gt;Search &gt;Organic and then click on the (not provided) keyword.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/383d8d6bb459_9475/not-provided-keyword-traffic.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="not-provided-keyword-traffic" border="0" alt="not-provided-keyword-traffic" src="/Portals/0/images/383d8d6bb459_9475/not-provided-keyword-traffic_thumb.jpg" width="644" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Above: ifinity.com.au (not provided) keyword impact, Oct/Nov 2011.&lt;/p&gt;  &lt;p&gt;If you have an even spread between different search providers (Google, Bing, Yahoo, etc) then you’ll need to filter out the other search traffic to get an accurate picture.  However, if, like my site, you get a massive majority of search traffic from Google (ie, 97%) then it really isn’t that important to filter out the other search traffic because it really isn’t material.&lt;/p&gt;  &lt;p&gt;Either way – the only thing that is important is that you are consistent over time – it’s about tracking trends, and the key feature in doing that is to have a consistent methodology of collecting the data.&lt;/p&gt;  &lt;h2&gt;Quantify the impact of the (not provided) traffic&lt;/h2&gt;  &lt;p&gt;Now that the number of ‘private’ searches is known – you can check it against performance of other groups of traffic.  This means looking at the ‘not provided’ traffic as an advanced segment, and checking it against other sources.&lt;/p&gt;  &lt;p&gt;To create an advanced segment, click on the ‘Advanced Segments’ section, click ‘add’ then just select ‘Keyword’ ‘Exactly Matching’ (not provided) and click ‘save segment’.  Give it a name like ‘(not provided) keywords’.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/383d8d6bb459_9475/not-provided-keyword-segment.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="not-provided-keyword-segment" border="0" alt="not-provided-keyword-segment" src="/Portals/0/images/383d8d6bb459_9475/not-provided-keyword-segment_thumb.jpg" width="644" height="442" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Above: Create a (not provided) keyword segment.&lt;/p&gt;  &lt;p&gt;Once this segment is created, you can look at any report in Analytics then use the ‘Compare’ function to match between this segment and the ‘All Visits’ segment (or, better still, the ‘Non-paid Search Traffic’ segment.&lt;/p&gt;  &lt;p&gt;Then you can apply these two segments to important metrics in your site, and see if the (not provided) traffic has a different profile:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/images/383d8d6bb459_9475/image.png" width="417" height="115" /&gt;&lt;/p&gt;  &lt;p&gt;Above : Goal Conversion Rate Non-paid Search Traffic vs (not provided) keywords&lt;/p&gt;  &lt;p&gt;What this information tells me is that the (not provided) keywords follow a reasonably similar profile to all organic search traffic.  Which means I can reasonably deduce that the distribution of keywords I no longer get to see is somewhat similar to the distribution of keywords I do get to see.&lt;/p&gt;  &lt;p&gt;Taking this further, after reading this &lt;a href="http://www.kaushik.net/avinash/google-secure-search-keyword-data-analysis/" target="_blank"&gt;excellent blog post by Avinash Kaushik&lt;/a&gt;, who goes further into determining what is long tail and ‘head’, I decided to create two new custom segments in my analytics, one called ‘top 7 keywords’ and one called ‘long tail keywords’.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/images/383d8d6bb459_9475/image_3.png" width="398" height="204" /&gt;&lt;/p&gt;  &lt;p&gt;These segments are created by looking at a trailing 12 month history of keywords, and creating one segment that only includes traffic using those keywords (the ‘head’) and one segment that excludes all traffic using those keywords (the ‘tail’).  The ‘head’ keywords are those that the site ranks very well for, and that are a clear intention of finding something on the site.  These might also be called ‘brand’ keywords – because they are invariably a combination of ifinity + product name.&lt;/p&gt;  &lt;p&gt;By applying this to the same Goal report, we can see that the (not provided) keywords perform much closer to the ‘long tail’ set than they do to ‘head’ set.  Which leads me to my conclusion that, at present,  the (not provided) keyword set is mostly long tail keywords and not brand keywords.&lt;/p&gt;  &lt;p&gt;This is re-inforced further by checking the bounce rate for all content:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="/Portals/0/images/383d8d6bb459_9475/image_4.png" width="367" height="197" /&gt;&lt;/p&gt;  &lt;p&gt;This shows that the bounce rate almost exactly matches the long tail keyword set.&lt;/p&gt;  &lt;p&gt;Conclusion from this : it would appear that most of the redacted keyword traffic is of the same nature as the overall site profile, and performs closely to the ‘long tail’ of keyword data.&lt;/p&gt;  &lt;p&gt;Action from this : monitor this over time (say, monthly) and see if any clear trends develop where this is no longer the case.  If, for instance, the ‘(not provided)’ set started to outperform or underperform, you might rightly conclude that there is something significant in the set that is different in makeup to the rest of the keyword data.&lt;/p&gt;  &lt;h2&gt;Looking for other data sources&lt;/h2&gt;  &lt;p&gt;Of course, all the information in the previous post is just a ‘calm down’ action to work out what is inside the box of keywords we are no longer allowed to open.  It doesn’t give us important data for tracking new keywords or developing themes presented in individual pages that perform well from search traffic (ie, hit the sweet spot of a high ranking in a well searched term).  This would be vitally important if your site had relatively ‘fresh’ content (say, a news site).  So what can you use?&lt;/p&gt;  &lt;p&gt;This is where Google has thrown us a scrap of information by integrating Webmaster Tools into Google Analytics.   This is a feature in the ‘new’ Analytics which has recently been rolled out.  If you use Google Analytics and haven’t been on in a while, you should check out the new ‘Search Engine Optimisation’ feature.  (&gt; Traffic Sources &gt; Search Engine Optimisation)&lt;/p&gt;  &lt;p&gt;In order to use this function, you have to integrate your webmaster profile into your analytics profile.  The webmaster profile can only be linked with a single Analytics profile.&lt;/p&gt;  &lt;p&gt;So what does this new data give us?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ifinity.com.au/Portals/0/images/383d8d6bb459_9475/google-search-query-data.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="google-search-query-data" border="0" alt="google-search-query-data" src="/Portals/0/images/383d8d6bb459_9475/google-search-query-data_thumb.jpg" width="644" height="373" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Above : Search query data for ifinity.com.au.  &lt;/p&gt;  &lt;p&gt;Well, the cynic in me says a fat lot of pretty pictures with zero applicability to SEO.   But you have to move on with the times – this is the new way things are going to be done so you have to get smart and move forwards.&lt;/p&gt;  &lt;p&gt;There is a lot of junk data in here – I had no idea I was ranking for www.xxx.com (I’m guessing an adult site, I daren’t look) but throughout the forums on this site it’s a pattern people commonly use to redact the domain information when seeking help on Urls.  Of course it gets me no click-through traffic, which is why I’ve never noticed.  But it is noise that needs to get filtered out of the data in order to start working with the useful information.&lt;/p&gt;  &lt;p&gt;It’s important to realise that this data has been in Webmaster console for a while, but is now presented in an easy-to-access way alongside your Analytics data.  What we are looking at here is the google.com side of things  - how many impressions search terms had, how many clicks, and your sites average position for those impressions.  Finally it gives you a click-through-rate (CTR).&lt;/p&gt;  &lt;p&gt;While it’s not obvious at first glance, this is the reverse side of your keyword data on your site.  So when you have a suspicion that a particular keyword is performing well for you, you can go to this report and search on that keyword (or combinations thereof).   If, in the hypothetical case I’ve already outlined, you have a page doing well and for some reason the majority of keywords working for that page are unknown to you, then you can come to this page and search on both sets of keywords and see which is performing better from the google.com side of things.&lt;/p&gt;  &lt;p&gt;You can also do a search through the CTR rates and impressions to find which keywords you could improve and optimise for.   Combined with the Google Keyword tool, you should be able to ascertain the broad trends well enough, despite the fact that it takes a little more work.&lt;/p&gt;  &lt;h2&gt;Conclusions&lt;/h2&gt;  &lt;p&gt;There is an old saying that goes like ‘when the rules change, the future changes’.  The rules for keyword data have just changed, and so the future has now changed.  You should probably be like me, get your toddler tantrum rant out of the way and then get on with figuring out how the future is going to work.  This is all very new, so it’s definitely important to monitor this space for changes, and additions.  It’s possible that Google might recant and start providing the data again, particularly if it affects their ad-buying business.  Or it’s possible that Google+ takes off and challenge Facebook and a majority of users will be logged on by default.  It’s possible that Android devices will stop referring search data or some other type scenario.&lt;/p&gt;  &lt;p&gt;The important takeaway is to start thinking about these scenarios now and work out your strategy to find the good keywords for your site, and how to optimise for them.  That part is unlikely to change at all.&lt;/p&gt;  &lt;p&gt;What do you think about it?  What percent of your traffic is now (not provided)?  Please let me know via the comments below.&lt;/p&gt;&lt;br /&gt;&lt;a href=http://www.ifinity.com.au/2011/12/01/Google_Secure_Search_Impacts_Keyword_Analysis_for_SEO_and_gives_you_(not_provided)_in_Analyticsndash_What_you_can_do_about_it&gt;More ...&lt;/a&gt;</description>
      <author>http://www.ifinity.com.au/Contact_Us</author>
      <comments>http://www.ifinity.com.au/2011/12/01/Google_Secure_Search_Impacts_Keyword_Analysis_for_SEO_and_gives_you_(not_provided)_in_Analyticsndash_What_you_can_do_about_it#Comments</comments>
      <slash:comments>0</slash:comments>
      <guid isPermaLink="true">http://www.ifinity.com.au/2011/12/01/Google_Secure_Search_Impacts_Keyword_Analysis_for_SEO_and_gives_you_(not_provided)_in_Analyticsndash_What_you_can_do_about_it</guid>
      <pubDate>Thu, 01 Dec 2011 03:01:20 GMT</pubDate>
      <trackback:ping>http://www.ifinity.com.auDesktopModules/BlogTrackback.aspx?id=138</trackback:ping>
    </item>
  </channel>
</rss>
