<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rob Chartier ~ Contemplation...</title><link>http://weblogs.asp.net/rchartier/default.aspx</link><description>.NET, C#, Work, etc.</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>The Store : Observations from the first week after the release.</title><link>http://weblogs.asp.net/rchartier/archive/2012/02/15/the-store-observations-from-the-first-week-after-the-release.aspx</link><pubDate>Wed, 15 Feb 2012 16:58:34 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8297009</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=8297009</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2012/02/15/the-store-observations-from-the-first-week-after-the-release.aspx#comments</comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In order to start this post I want to take a big step back first talk about communities. &lt;/p&gt;  &lt;p&gt;Communities, at the base level, really boil down to social interactions of organisms with each other. These organisms coexist in a society. Societies can be thought of people that are related to each other, that share common expectations and/or authority. &lt;/p&gt;  &lt;p&gt;Seems simple enough, right?&lt;/p&gt;  &lt;p&gt;If we dig a bit deeper into the social interactions of organisms we can begin to get an idea that there are a variety of &lt;em&gt;types of people&lt;/em&gt; – as defined by their behaviour. Typically there are 4 types that really stick out, at least for me.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Socializers&lt;/strong&gt;       &lt;ol&gt;       &lt;li&gt;This is the biggest group of any community. Usually about 80% of the population.&lt;/li&gt;        &lt;li&gt;They are seeking light-weight, non-confrontational easy to reciprocate social interactions with other people. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Achievers&lt;/strong&gt;       &lt;ol&gt;       &lt;li&gt;These folks go to great lengths to achieve rewards simple for the prestige of having it.&lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Explorers&lt;/strong&gt;       &lt;ol&gt;       &lt;li&gt;They are involved in the community for the social credit of having discovered something. They love to discover an unknown glitch or a hidden Easter egg. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Killers&lt;/strong&gt;       &lt;ol&gt;       &lt;li&gt;These types thrive on competition with others in the community, in order to win and their expense. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Think of each community you belong to and what type of behaviour you typically exhibit. How your actions/interactions impact the overall state of the community.&amp;#160; What is your typical tone within those communities.&amp;#160; Also, are you typically a positive person or do you “bring the hammer” with negativity?&amp;#160; Maybe your a realist?&amp;#160; &lt;/p&gt;  &lt;p&gt;No matter your behaviour type and the tone you use, you do impact the community.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So why all the preamble?&lt;/p&gt;  &lt;p&gt;Its important to understand the nature of our community - DotNetNuke and the smaller/sub community of The Store.&amp;#160; As, essentially, the “&lt;em&gt;authority&lt;/em&gt;” for The Store we must keep our eyes and ears open to all input from the community.&amp;#160; We must adapt and change with the “&lt;em&gt;expectations&lt;/em&gt;” of our community.&amp;#160; We must learn from each other.&amp;#160; The very second we stop listening to the community (to you) we all lose.&lt;/p&gt;  &lt;p&gt;While doing so we are sensitive to the fact that there will always be those people that are very &lt;em&gt;positive – &lt;/em&gt;they are looking out for the community and want to see it foster and grow; and then there are the negative types.&amp;#160; I would almost always agree that they too are looking out for the greater good of the community they just express themselves in a slightly different manner.&lt;/p&gt;  &lt;p&gt;You must develop a pretty thick skin for those that exhibit a very high level of negativity about any change (good or bad) within the community – after we all cant put our biggest smile on every day, right?&lt;/p&gt;  &lt;p&gt;Both of those types serve a huge purpose for the Community and do play an essential role to &lt;strong&gt;&lt;em&gt;our&lt;/em&gt;&lt;/strong&gt; collective success.&lt;/p&gt;  &lt;p&gt;In this past week, since we launched what we are calling version 2 (v2.0) of The Store we have directly come into contact with pretty much every type of personality out there: Socializers, Achievers, Killers, Positive types, negative types, etc..&amp;#160;&amp;#160; Everyone is coming out of the woodworks…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;This is awesome!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The most encouraging thing for us right now is that feedback.&amp;#160; Have confidence that we are tracking all items and triaging/fixing the high priority issues as soon as humanly possible.&amp;#160; Gemini (bug tracker) and TFS (source control) are very active with frequent changes.&amp;#160; We are doing our best to keep on top of the list and publishing to production as soon as it makes sense.&amp;#160; Based on twitter there are many of you out there that have directly experienced the fast turn around we strive for, we will do our best to keep that pace going.&lt;/p&gt;  &lt;p&gt;Right now, the best way for us to receive feedback is to either email us at&amp;#160; store [at] dnncorp [dot] com, or by using our &lt;a href="http://store.dotnetnuke.com/help-center/getting-started" target="_blank"&gt;Help Desk&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;We need you to communicate, no matter your style - keep it coming!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8297009" width="1" height="1"&gt;</description></item><item><title>SnowCovered.com finally gets an upgrade</title><link>http://weblogs.asp.net/rchartier/archive/2012/02/09/snowcovered-com-finally-gets-an-upgrade.aspx</link><pubDate>Thu, 09 Feb 2012 18:38:48 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8291451</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=8291451</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2012/02/09/snowcovered-com-finally-gets-an-upgrade.aspx#comments</comments><description>&lt;p&gt;When we (&lt;a href="http://www.dotnetnuke.com/" target="_blank"&gt;DNNCorp&lt;/a&gt;) originally took ownership of &lt;a href="http://www.snowcovered.com" target="_blank"&gt;SnowCovered.com&lt;/a&gt; from Brice Snow it was running on &lt;a href="http://dotnetnuke.codeplex.com/releases/view/19986" target="_blank"&gt;DotNetNuke 2.1.2&lt;/a&gt; (Release date was June 14, 2004), v1.0 of the .NET Framework and on a low-end hosting provider. Looking back, I recall that we were lucky to get 80% to 90% uptime in any given month. It was on its last legs. We knew, the community knew, we HAD to take action.&lt;/p&gt;  &lt;p&gt;Fast forward a little while, and just over a year ago we launched an internal “Upgrade” project for &lt;a href="http://www.snowcovered.com" target="_blank"&gt;SnowCovered.com&lt;/a&gt;. Here is how that story played out…&lt;/p&gt;  &lt;p&gt;Our first initiative was to upgrade from the low-end hosting to our own infrastructure which brought up our stability immediately to 99.9% uptime. This was a huge gain for us and the community as a whole. It was nice to be able to rely on solid infrastructure. All of the negativity around the amount of downtime simply fizzled. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Our first significant win!&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The next step was to tackle the DNN 2.1.2 issue. For those of you that don’t recall the history of DNN, 2.1.2 was release before the ASP.NET Team release the (then) new Personalization and Membership pieces. The team here spent hours ensuring that every single user in the SnowCovered membership database was upgraded. Countless tests and dry runs were performed, and in the end we prevailed. All users can and will be upgraded fully. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Another win for the team.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The largest task was the actual code base itself. There was a significant amount of rework and simply replacing much of the codebase (VB.NET to C#) as we transitioned it all to the 6.x family of the core framework. At that time we had just hired &lt;a href="https://twitter.com/NathanRover" target="_blank"&gt;Nathan Rover&lt;/a&gt; and put him on this challenge. He gladly accepted and took the lead. For those of you want have not yet met Nathan, he is a marathon runner – just the man suited for this marathon upgrade and release schedule.&lt;/p&gt;  &lt;p&gt;Over the year they took inventory of the feature points, upgraded code, reviewed artwork &amp;amp; designs, cried/yelled/screamed, held design meetings, drank a few gallons of redbull/monster/beaver buzz, QA, upgrade meetings, daily scrums, Unit Tests, more QA, frequent vendor reviews &amp;amp; demos. Project plans were scraped, created and scraped again. We have had churn in almost every aspect of the project.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The team kept running.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;There were a few points over the past year were we almost gave up. The stress was high; the light at the end of the tunnel was just barely visible. Nathan and the team pushed on. We persisted.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The team kept running.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Finally the light was blinding. We invited many (~100) of the vendors in for a private Beta; received well over 40 issues, all of which were addressed with great care and attention, and finally accepted the final list of bugs in for the initial RTM release. The team worked day and night nailing these issues down in order to meet our aggressive release schedule, without sacrificing the level of quality we demanded in this release.&lt;/p&gt;  &lt;p&gt;As of 3:00AM PST February 9&lt;sup&gt;th&lt;/sup&gt;, 2012 we crossed the finish line!&lt;/p&gt;  &lt;p&gt;We are proud to announce that we have released initial public release of &amp;quot;DotNetNuke, The Store&amp;quot;&lt;/p&gt;  &lt;p&gt;Congrats goes out to the entire team!&lt;/p&gt;  &lt;p&gt;Here is a before screenshot, as of July 19, 2012:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/Windows-Live-Writer/SnowCovered.com-finally-gets-an-upgrade_922C/image_2.png"&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="http://weblogs.asp.net/blogs/rchartier/Windows-Live-Writer/SnowCovered.com-finally-gets-an-upgrade_922C/image_thumb.png" width="510" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;and now…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/Windows-Live-Writer/SnowCovered.com-finally-gets-an-upgrade_922C/image_4.png"&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="http://weblogs.asp.net/blogs/rchartier/Windows-Live-Writer/SnowCovered.com-finally-gets-an-upgrade_922C/image_thumb_1.png" width="502" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;..we are just getting started…&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8291451" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category></item><item><title>Getting DotNetNuke to render correctly in IE9</title><link>http://weblogs.asp.net/rchartier/archive/2010/09/29/getting-dotnetnuke-to-render-correctly-in-ie9.aspx</link><pubDate>Wed, 29 Sep 2010 19:12:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7621783</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7621783</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/09/29/getting-dotnetnuke-to-render-correctly-in-ie9.aspx#comments</comments><description>&lt;p&gt;As we all download the &lt;a href="http://www.microsoft.com/ie/" mce_href="http://www.microsoft.com/ie/"&gt;Beta of IE9&lt;/a&gt; we are faced with the challenge of many sites having breaking changes to the UI.&amp;nbsp; This becomes more apparent when you have rich functionality provided by vendors such as Telerik, the FCK Editor, or whatever you have chosen internally.&lt;/p&gt;  &lt;p&gt;For example, here is a screen shot of DotNetNuke, using our default skin, breaking under IE9 when using the default “IE9 Standards” mode.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_2.png" mce_href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_2.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_thumb.png" style="border: 0px none; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_thumb.png" border="0" height="437" width="644"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;What you see above is the Telerik Editor Provider when editing content using the Text/HTML module.&amp;nbsp; In order to correct the above issue, you must switch IE9 to use a more compatible mode.&amp;nbsp; &lt;/p&gt;  &lt;p&gt;If you bring up the IE9 Developer tools, which are standard now as part of the browser installation, by &lt;b&gt;hitting the F12 key&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;You will see the tool shown at the bottom of the browser:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_4.png" mce_href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_4.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_thumb_1.png" style="border: 0px none; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_thumb_1.png" border="0" height="261" width="644"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Notice the “Browser Mode: IE9” and the “Document Mode: IE9 standards”.&amp;nbsp; You only need to change the “Document Mode:” drop down to “IE8 Standards”:&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_6.png" mce_href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_6.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_thumb_2.png" style="border: 0px none; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/GettingDotNetNuketorendercorrectlyinIE9_AC0C/image_thumb_2.png" border="0" height="445" width="624"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;You page will refresh with the new Document Mode, and it should now properly be showing the right UI.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7621783" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/HTML/default.aspx">HTML</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/IE/default.aspx">IE</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Internet+Explorer/default.aspx">Internet Explorer</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/IE7/default.aspx">IE7</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DNN/default.aspx">DNN</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/IE8/default.aspx">IE8</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/IE9/default.aspx">IE9</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Telerik/default.aspx">Telerik</category></item><item><title>.NET BC : A Lap around WebMatrix; With a dash of Razor</title><link>http://weblogs.asp.net/rchartier/archive/2010/08/25/net-bc-a-lap-around-webmatrix-with-a-dash-of-razor.aspx</link><pubDate>Wed, 25 Aug 2010 17:26:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7599960</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7599960</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/08/25/net-bc-a-lap-around-webmatrix-with-a-dash-of-razor.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Last night most of the DotNetnuke team and I traveled into Burnaby, to the BCIT campus where I gave a real quick (1 hour) presentation on the WebMatrix Beta, and Razor Syntax.&lt;/p&gt;  &lt;p&gt;I was happy to see that we had over 60 people attend.&amp;nbsp; It was awesome to see the turn out on a hot summer evening.&amp;nbsp; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://robchartier.ca/Default.aspx?TabID=252&amp;amp;xsfid=2&amp;amp;xsfk=1234" mce_href="http://robchartier.ca/Default.aspx?TabID=252&amp;amp;xsfid=2&amp;amp;xsfk=1234" target="_blank"&gt;Download the Slide Deck&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There were a number of questions which came up, I will try to remember them all here.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;Working with Data – the db.Query() execution, can it be parametrized?&lt;/h3&gt;  &lt;pre class="csharpcode"&gt;@{&lt;br&gt;    var db = Database.OpenFile(&lt;span class="str"&gt;"SmallBakery.sdf"&lt;/span&gt;);&lt;br&gt;    var selectQueryString = &lt;span class="str"&gt;"SELECT * FROM Products ORDER BY Name"&lt;/span&gt;;&lt;br&gt; }&lt;br&gt;@&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var row &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Query(selectQueryString)){&lt;br&gt;  &amp;lt;tr&amp;gt;&lt;br&gt;    &amp;lt;td&amp;gt;@row.Id&amp;lt;/td&amp;gt;&lt;br&gt;    &amp;lt;td&amp;gt;@row.Name&amp;lt;/td&amp;gt;&lt;br&gt;    &amp;lt;td&amp;gt;@row.Description&amp;lt;/td&amp;gt;&lt;br&gt;    &amp;lt;td&amp;gt;@row.Price&amp;lt;/td&amp;gt;&lt;br&gt;   &amp;lt;/tr&amp;gt;&lt;br&gt;}&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;Yes, you can.&amp;nbsp; Here is an example.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;@{&lt;br&gt;    var db = Database.OpenFile(&lt;span class="str"&gt;"SmallBakery.sdf"&lt;/span&gt;);&lt;br&gt;    var Name = Request[&lt;span class="str"&gt;"Name"&lt;/span&gt;];&lt;br&gt;    var Description = Request[&lt;span class="str"&gt;"Description"&lt;/span&gt;];&lt;br&gt;    var Price = Request[&lt;span class="str"&gt;"Price"&lt;/span&gt;];&lt;br&gt;    var insertQuery = &lt;span class="str"&gt;"INSERT INTO Products (Name, Description, Price) VALUES (@0, @1, @2)"&lt;/span&gt;;&lt;br&gt;    db.Execute(insertQuery, Name, Description, Price);&lt;br&gt;}&lt;br&gt;     &lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h3&gt;What and Who is WebMatrix and Razor targeted to?&lt;/h3&gt;

&lt;p&gt;Essentially the breadth developer.&amp;nbsp; Those folks that possibly come from a PHP background or even are new to the development world.&amp;nbsp; This will allow for them to onboard with a few minor tweaks to existing projects to get up and running as fast as possible.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Why is Web Matrix even needed when we have Visual Studio?&lt;/h3&gt;

&lt;p&gt;The initial thoughts are that this product is going to be free.&amp;nbsp; It will have a bare minimum feature set targeted to the scripter.&amp;nbsp; The UI is far simpler than what VS.NET Users are used to.&amp;nbsp; You could consider it as a a stepping stone into VS.NET.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;There was some discussion around Razor Syntax and MVC.&amp;nbsp; Using it as a view engine.&amp;nbsp; Here are some resources to help with this answer.&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://gurustop.net/blog/2010/07/06/thoughts-on-razor-microsofts-new-asp-net-mvc-view-engine/" title="http://gurustop.net/blog/2010/07/06/thoughts-on-razor-microsofts-new-asp-net-mvc-view-engine/" mce_href="http://gurustop.net/blog/2010/07/06/thoughts-on-razor-microsofts-new-asp-net-mvc-view-engine/"&gt;http://gurustop.net/blog/2010/07/06/thoughts-on-razor-microsofts-new-asp-net-mvc-view-engine/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and &lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.dotnetcurry.com/ShowArticle.aspx?ID=561" title="http://www.dotnetcurry.com/ShowArticle.aspx?ID=561" mce_href="http://www.dotnetcurry.com/ShowArticle.aspx?ID=561"&gt;http://www.dotnetcurry.com/ShowArticle.aspx?ID=561&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;The topic of LightSwitch came up as well.&amp;nbsp; Here is the product page&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.microsoft.com/visualstudio/en-us/lightswitch" mce_href="http://www.microsoft.com/visualstudio/en-us/lightswitch"&gt;http://www.microsoft.com/visualstudio/en-us/lightswitch&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
  &lt;h6&gt;SIMPLEST WAY TO BUILD BUSINESS APPLICATIONS FOR THE DESKTOP, WEB AND CLOUD&lt;/h6&gt;

  &lt;p&gt;Microsoft Visual Studio LightSwitch gives you a simpler and faster way to create professional-quality business applications for the desktop, the web, and the cloud. LightSwitch is a new addition to the Visual Studio family. Visit this page often to learn more about this exciting product. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;All in all I felt the talk went well.&amp;nbsp; As usual I went a mile a minute and really tried to slow things down near the end.&amp;nbsp; Luckily there were enough questions to push us for the full hour.&amp;nbsp; If you attended feel free to send me feedback and ask questions.&amp;nbsp; I will do my best to get you the answers – just keep them on topic!&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h4&gt;Resources for the discussion&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://www.asp.net/webmatrix" title="http://www.asp.net/webmatrix" mce_href="http://www.asp.net/webmatrix"&gt;http://www.asp.net/webmatrix&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://netbc.ca/DNCal/EventDetail.aspx?date=2010/08/24" title="http://netbc.ca/DNCal/EventDetail.aspx?date=2010/08/24" mce_href="http://netbc.ca/DNCal/EventDetail.aspx?date=2010/08/24"&gt;http://netbc.ca/DNCal/EventDetail.aspx?date=2010/08/24&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7599960" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET+C_2300_/default.aspx">.NET C#</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET+Visual+Studio+.NET/default.aspx">.NET Visual Studio .NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Web/default.aspx">Web</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Local+Community/default.aspx">Local Community</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Web+Development/default.aspx">Web Development</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Razor/default.aspx">Razor</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/WebMatrix/default.aspx">WebMatrix</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Web+Matrix/default.aspx">Web Matrix</category></item><item><title>Sql Scripts - Delete all Tables, Procedures, Views and Functions</title><link>http://weblogs.asp.net/rchartier/archive/2010/08/20/sql-scripts-delete-all-tables-procedures-views-and-functions.aspx</link><pubDate>Fri, 20 Aug 2010 18:41:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7596980</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7596980</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/08/20/sql-scripts-delete-all-tables-procedures-views-and-functions.aspx#comments</comments><description>&lt;p&gt;In a shared environment you typically don't have access to delete your database, and recreate it for fresh installs of your product.&amp;nbsp; &lt;/p&gt;  &lt;p&gt;I managed to find these scripts which should help you clean out your database.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;font color="#ff0000"&gt;Use at your own risk.&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h1&gt;Delete All Tables&lt;/h1&gt;  &lt;pre class="csharpcode"&gt;--&lt;span class="kwrd"&gt;Delete&lt;/span&gt; &lt;span class="kwrd"&gt;All&lt;/span&gt; Keys&lt;br&gt;&lt;br&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @&lt;span class="kwrd"&gt;Sql&lt;/span&gt; NVARCHAR(500) &lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @&lt;span class="kwrd"&gt;Cursor&lt;/span&gt; &lt;span class="kwrd"&gt;CURSOR&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;SET&lt;/span&gt; @&lt;span class="kwrd"&gt;Cursor&lt;/span&gt; = &lt;span class="kwrd"&gt;CURSOR&lt;/span&gt; FAST_FORWARD &lt;span class="kwrd"&gt;FOR&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;DISTINCT&lt;/span&gt; &lt;span class="kwrd"&gt;sql&lt;/span&gt; = &lt;span class="str"&gt;'ALTER TABLE ['&lt;/span&gt; + tc2.TABLE_NAME + &lt;span class="str"&gt;'] DROP ['&lt;/span&gt; + rc1.CONSTRAINT_NAME + &lt;span class="str"&gt;']'&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt; INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1&lt;br&gt;&lt;span class="kwrd"&gt;LEFT&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt; INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 &lt;span class="kwrd"&gt;ON&lt;/span&gt; tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME&lt;br&gt;&lt;span class="kwrd"&gt;OPEN&lt;/span&gt; @&lt;span class="kwrd"&gt;Cursor&lt;/span&gt; &lt;span class="kwrd"&gt;FETCH&lt;/span&gt; &lt;span class="kwrd"&gt;NEXT&lt;/span&gt; &lt;span class="kwrd"&gt;FROM&lt;/span&gt; @&lt;span class="kwrd"&gt;Cursor&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; @&lt;span class="kwrd"&gt;Sql&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;WHILE&lt;/span&gt; (@@FETCH_STATUS = 0)&lt;br&gt;&lt;span class="kwrd"&gt;BEGIN&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;Exec&lt;/span&gt; SP_EXECUTESQL @&lt;span class="kwrd"&gt;Sql&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;FETCH&lt;/span&gt; &lt;span class="kwrd"&gt;NEXT&lt;/span&gt; &lt;span class="kwrd"&gt;FROM&lt;/span&gt; @&lt;span class="kwrd"&gt;Cursor&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; @&lt;span class="kwrd"&gt;Sql&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;END&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;CLOSE&lt;/span&gt; @&lt;span class="kwrd"&gt;Cursor&lt;/span&gt; &lt;span class="kwrd"&gt;DEALLOCATE&lt;/span&gt; @&lt;span class="kwrd"&gt;Cursor&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; sp_MSForEachTable &lt;span class="str"&gt;'DROP TABLE ?'&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h1&gt;Delete All Stored Procedures&lt;/h1&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @procName &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(500)&lt;br&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; cur &lt;span class="kwrd"&gt;cursor&lt;/span&gt;&lt;br&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; &lt;span class="kwrd"&gt;select&lt;/span&gt; [name] &lt;span class="kwrd"&gt;from&lt;/span&gt; sys.objects &lt;span class="kwrd"&gt;where&lt;/span&gt; type = &lt;span class="str"&gt;'p'&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;open&lt;/span&gt; cur&lt;br&gt;&lt;br&gt;&lt;span class="kwrd"&gt;fetch&lt;/span&gt; &lt;span class="kwrd"&gt;next&lt;/span&gt; &lt;span class="kwrd"&gt;from&lt;/span&gt; cur &lt;span class="kwrd"&gt;into&lt;/span&gt; @procName&lt;br&gt;      &lt;span class="kwrd"&gt;while&lt;/span&gt; &lt;span class="preproc"&gt;@@fetch_status&lt;/span&gt; = 0&lt;br&gt;      &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;br&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; @procName &amp;lt;&amp;gt; &lt;span class="str"&gt;'DeleteAllProcedures'&lt;/span&gt;&lt;br&gt;                  &lt;span class="kwrd"&gt;exec&lt;/span&gt;(&lt;span class="str"&gt;'drop procedure '&lt;/span&gt; + @procName)&lt;br&gt;                  &lt;span class="kwrd"&gt;fetch&lt;/span&gt; &lt;span class="kwrd"&gt;next&lt;/span&gt; &lt;span class="kwrd"&gt;from&lt;/span&gt; cur &lt;span class="kwrd"&gt;into&lt;/span&gt; @procName&lt;br&gt;      &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="kwrd"&gt;close&lt;/span&gt; cur&lt;br&gt;&lt;span class="kwrd"&gt;deallocate&lt;/span&gt; cur&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h1&gt;Delete All Views&lt;/h1&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @procName &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(500)&lt;br&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; cur &lt;span class="kwrd"&gt;cursor&lt;/span&gt;&lt;br&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; &lt;span class="kwrd"&gt;select&lt;/span&gt; [name] &lt;span class="kwrd"&gt;from&lt;/span&gt; sys.objects &lt;span class="kwrd"&gt;where&lt;/span&gt; type = &lt;span class="str"&gt;'v'&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;open&lt;/span&gt; cur&lt;br&gt;&lt;br&gt;&lt;span class="kwrd"&gt;fetch&lt;/span&gt; &lt;span class="kwrd"&gt;next&lt;/span&gt; &lt;span class="kwrd"&gt;from&lt;/span&gt; cur &lt;span class="kwrd"&gt;into&lt;/span&gt; @procName&lt;br&gt;      &lt;span class="kwrd"&gt;while&lt;/span&gt; &lt;span class="preproc"&gt;@@fetch_status&lt;/span&gt; = 0&lt;br&gt;      &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;br&gt;                  &lt;span class="kwrd"&gt;exec&lt;/span&gt;(&lt;span class="str"&gt;'drop view '&lt;/span&gt; + @procName)&lt;br&gt;                  &lt;span class="kwrd"&gt;fetch&lt;/span&gt; &lt;span class="kwrd"&gt;next&lt;/span&gt; &lt;span class="kwrd"&gt;from&lt;/span&gt; cur &lt;span class="kwrd"&gt;into&lt;/span&gt; @procName&lt;br&gt;      &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;close&lt;/span&gt; cur&lt;br&gt;&lt;span class="kwrd"&gt;deallocate&lt;/span&gt; cur&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h1&gt;Delete All Functions&lt;/h1&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @procName &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(500)&lt;br&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; cur &lt;span class="kwrd"&gt;cursor&lt;/span&gt;&lt;br&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; &lt;span class="kwrd"&gt;select&lt;/span&gt; [name] &lt;span class="kwrd"&gt;from&lt;/span&gt; sys.objects &lt;span class="kwrd"&gt;where&lt;/span&gt; type = &lt;span class="str"&gt;'fn'&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;open&lt;/span&gt; cur&lt;br&gt;&lt;br&gt;&lt;span class="kwrd"&gt;fetch&lt;/span&gt; &lt;span class="kwrd"&gt;next&lt;/span&gt; &lt;span class="kwrd"&gt;from&lt;/span&gt; cur &lt;span class="kwrd"&gt;into&lt;/span&gt; @procName&lt;br&gt;      &lt;span class="kwrd"&gt;while&lt;/span&gt; &lt;span class="preproc"&gt;@@fetch_status&lt;/span&gt; = 0&lt;br&gt;      &lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;br&gt;                  &lt;span class="kwrd"&gt;exec&lt;/span&gt;(&lt;span class="str"&gt;'drop function '&lt;/span&gt; + @procName)&lt;br&gt;                  &lt;span class="kwrd"&gt;fetch&lt;/span&gt; &lt;span class="kwrd"&gt;next&lt;/span&gt; &lt;span class="kwrd"&gt;from&lt;/span&gt; cur &lt;span class="kwrd"&gt;into&lt;/span&gt; @procName&lt;br&gt;      &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="kwrd"&gt;close&lt;/span&gt; cur&lt;br&gt;&lt;span class="kwrd"&gt;deallocate&lt;/span&gt; cur&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7596980" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/T-SQL/default.aspx">T-SQL</category></item><item><title>A Lap around WebMatrix – Vancouver on August 24th.</title><link>http://weblogs.asp.net/rchartier/archive/2010/08/09/a-lap-around-webmatrix-vancouver-on-august-24th.aspx</link><pubDate>Tue, 10 Aug 2010 03:03:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7585756</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7585756</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/08/09/a-lap-around-webmatrix-vancouver-on-august-24th.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;I just checked and it looks like the folks at .NET BC have managed to get around to post my up-coming presentation.&amp;nbsp; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/ALaparoundWebMatrixVancouveronAugust24t_11A4F/Capture.png" mce_href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/ALaparoundWebMatrixVancouveronAugust24t_11A4F/Capture.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/ALaparoundWebMatrixVancouveronAugust24t_11A4F/Capture_thumb.png" style="border: 0px none; display: inline;" title="Capture" alt="Capture" mce_src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/ALaparoundWebMatrixVancouveronAugust24t_11A4F/Capture_thumb.png" border="0" height="109" width="357"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Topic: A Lap around WebMatrix&lt;/b&gt;    &lt;br&gt;Please join Rob Chartier, VP of Engineering &amp;amp; Support at DotNetNuke, in a brief Lap around the new &lt;a href="http://www.microsoft.com/web/webmatrix/" mce_href="http://www.microsoft.com/web/webmatrix/" target="_blank"&gt;WebMatrix tool&lt;/a&gt; from Microsoft. Rob will cover most of the high-level features of the tool and even dig into the new Razor syntax. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://netbc.ca/DNCal/EventDetail.aspx?date=2010/08/24" title="http://netbc.ca/DNCal/EventDetail.aspx?date=2010/08/24" mce_href="http://netbc.ca/DNCal/EventDetail.aspx?date=2010/08/24"&gt;http://netbc.ca/DNCal/EventDetail.aspx?date=2010/08/24&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/ALaparoundWebMatrixVancouveronAugust24t_11A4F/webx-hero_2.jpg" mce_href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/ALaparoundWebMatrixVancouveronAugust24t_11A4F/webx-hero_2.jpg"&gt;&lt;img src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/ALaparoundWebMatrixVancouveronAugust24t_11A4F/webx-hero_thumb.jpg" style="border: 0px none; display: inline;" title="webx-hero" alt="webx-hero" mce_src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/ALaparoundWebMatrixVancouveronAugust24t_11A4F/webx-hero_thumb.jpg" border="0" height="182" width="644"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;See you then!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7585756" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET+Visual+Studio+.NET/default.aspx">.NET Visual Studio .NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Razor/default.aspx">Razor</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/WebMatrix/default.aspx">WebMatrix</category></item><item><title>More on Dynamic Language Execution within DotNetNuke</title><link>http://weblogs.asp.net/rchartier/archive/2010/08/09/more-on-dynamic-language-execution-within-dotnetnuke.aspx</link><pubDate>Tue, 10 Aug 2010 00:57:14 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7585589</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7585589</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/08/09/more-on-dynamic-language-execution-within-dotnetnuke.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://weblogs.asp.net/rchartier/archive/2010/07/21/introducing-dynamo-a-scriptable-dotnetnuke-module.aspx" target="_blank"&gt;A few weeks ago I ripped out a module over the weekend&lt;/a&gt; which allowed a Content Editor for DotNetNuke to be able to actually start scripting content within the UI.&amp;#160; Imagine being able to embed &lt;strong&gt;scripts &lt;/strong&gt;within (a) the Text/Html module which is complied+interpreted on the server; a Text/Html/Script module.&lt;/p&gt;  &lt;p&gt;That is essentially what this Dynamo module allows you to do; Dynamic Language Execution within DotNetNuke.&amp;#160; It doesn’t use Reflection.Emit so it is safe in Medium Trust.&lt;/p&gt;  &lt;p&gt;I wanted to do a follow-up post to highlight some of the changes that I have made over the past few weeks and to request feedback from you folks.&lt;/p&gt;  &lt;h2&gt;Context Switching&lt;/h2&gt;  &lt;p&gt;The first revision of my module did not allow you to switch between HTML and Script in a single script block.&amp;#160; In fact it took the entire input you gave it and treated it as Script.&amp;#160; Thus you had to hard code all HTML blocks within “echo” statements (aka Response.Write).&amp;#160; This was one of my goals for the first release, but I decided to move ahead without it.&amp;#160; &lt;/p&gt;  &lt;p&gt;I spent a decent amount of time figuring out the best way to handle this, and here is what I came up with:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;By Default the script will treated as HTML.&amp;#160; &lt;/li&gt;    &lt;li&gt;You must enclose actual Script within @{&amp;#160; …..&amp;#160; }@ tags. &lt;/li&gt;    &lt;li&gt;It will process each Context in order and append that to a string builder &lt;/li&gt;    &lt;li&gt;Finally, once all Context blocks are complete, emit a LiteralControl with the final content. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I have this working in the recent builds (past 1.5.0), and working quite well.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/MoreonDynamicLanguageExecutionwithinDotN_E58A/Capture.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Capture" border="0" alt="Capture" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/MoreonDynamicLanguageExecutionwithinDotN_E58A/Capture_thumb.png" width="644" height="394" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Error Handling&lt;/h2&gt;  &lt;p&gt;There are two core areas around Error Handling that I had defaulted to (poorly) in the past.&amp;#160; The first was when the Jint (the internal mechanism that handles the Dynamic Scripting Support) throws/returns an error I added it to the module output and emitted it to the page along with the rest of the content.&amp;#160; This is now being suppressed.&amp;#160; I also break out of step execution of all of the context switching.&amp;#160; That is, the step which threw the exception will be the last one to execute.&amp;#160; This is for a normal user.&amp;#160; For a SuperUser it will Append() the exception and continue the execution.&lt;/p&gt;  &lt;p&gt;Second, I set Jint’s debug mode to that of the HttpContext.Current.IsDebuggingEnabled flag.&amp;#160; So it aligns Jint’s debugging with what you have set in web.config.&lt;/p&gt;  &lt;h2&gt;Security&lt;/h2&gt;  &lt;p&gt;The last piece that I still have left to take care of is Security.&amp;#160; Ultimately the Jint engine relies on two methods to handle security.&amp;#160; The first of which is to completely Disable the security and the second is to utilize the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.permissions.aspx" target="_blank"&gt;System.Security.Permissions Namespace&lt;/a&gt; in order to control access.&amp;#160; For this release I have just completely Disabled Security.&amp;#160; My next set of work will be dedicated to creating an Host-&amp;gt;Scripting menu item which allows you to control Security on a per Portal basis.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Finally, if you are using the module for anything or if you have any feature enhancements or changes, please let me know.&amp;#160; I plan on contributing to this module for the coming months.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dnnlabs.codeplex.com/releases/view/49383" target="_blank"&gt;I just updated to 1.6 on Codeplex.&amp;#160; Go upgrade now!&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7585589" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET+C_2300_/default.aspx">.NET C#</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/HTML/default.aspx">HTML</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET+Framework/default.aspx">.NET Framework</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DNN/default.aspx">DNN</category></item><item><title>Sprite and Image Optimization Framework &amp; DotNetNuke</title><link>http://weblogs.asp.net/rchartier/archive/2010/08/09/sprite-and-image-optimization-framework-amp-dotnetnuke.aspx</link><pubDate>Mon, 09 Aug 2010 19:50:49 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7585179</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7585179</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/08/09/sprite-and-image-optimization-framework-amp-dotnetnuke.aspx#comments</comments><description>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;The folks over at Microsoft recently pushed a open source release of their &lt;a href="http://aspnet.codeplex.com/releases/view/50140" target="_blank"&gt;Sprite and Image Optimization Framework onto Codeplex&lt;/a&gt; last week.&amp;#160; And after a few tweaks I was able to get it running within DotNetNuke, here is how…&lt;/p&gt;  &lt;p&gt;Download the &lt;a href="http://aspnet.codeplex.com/releases/view/50140#DownloadId=140570"&gt;Sprite and Image Optimization Framework&lt;/a&gt;.&amp;#160; Unzip it and open up the ImageOptimizationFramework.sln file using Visual Studio .NET 2010.&amp;#160; &lt;/p&gt;  &lt;h2&gt;Getting it 3.5 Compatible&lt;/h2&gt;  &lt;p&gt;If you are still running your DotNetNuke installation on 3.5, you will need to change the “Target Framework” for both the “Web Forms Control” and the “Image Optimization Framework” down to 3.5.&amp;#160; This can be achieved by right clicking the project and under the “Application” Tab / Target Framework choose “.NET 3.5 Framework”, save and close both property windows.&lt;/p&gt;  &lt;p&gt;Next you will notice that when you attempt to build (now that we are on 3.5) you will get a compiler error.&amp;#160; In ImageOptimization.cs I changed the following method to look like:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RebuildFromCacheHit(&lt;span class="kwrd"&gt;string&lt;/span&gt; key, &lt;span class="kwrd"&gt;object&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;, CacheItemRemovedReason reason) {

  var data = (&lt;span class="kwrd"&gt;object&lt;/span&gt;[])&lt;span class="kwrd"&gt;value&lt;/span&gt;;
  &lt;span class="kwrd"&gt;string&lt;/span&gt; path = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)data[0];
  IEnumerable&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; cachedDirectoriesBelowCurrentFolder = (IEnumerable&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;)data[1];&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;/pre&gt;

&lt;p&gt;That is, I replaced their use of the Tuple class with the generic object[] &lt;/p&gt;

&lt;p&gt;The second method that needed to be changed is:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InsertItemIntoCache(&lt;span class="kwrd"&gt;string&lt;/span&gt; path, IEnumerable&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; directoriesBelowCurrentFolder) {
  &lt;span class="kwrd"&gt;string&lt;/span&gt; key = Guid.NewGuid().ToString();
  &lt;span class="rem"&gt;//var value = Tuple.Create(path, directoriesBelowCurrentFolder);&lt;/span&gt;
  var &lt;span class="kwrd"&gt;value&lt;/span&gt;= &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[]{path, directoriesBelowCurrentFolder};
  HttpRuntime.Cache.Insert(key, &lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; CacheDependency(path), Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, RebuildFromCacheHit);
}&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Notice again, it was converting the Tuple to use an object[].&amp;#160; I’m sure there is a more optimal way available but this is good enough for this round of testing.&lt;/p&gt;

&lt;p&gt;The solution should compile now.&amp;#160; &lt;/p&gt;

&lt;h2&gt;DotNetNuke&lt;/h2&gt;

&lt;p&gt;If you navigate to the folder”&amp;#160; %My Download Directory%\sprite-image-optimization-framework\WebFormsControlSample\Bin\&amp;#160;&amp;#160; you will see the 2 compiled DLLs and PDB files. XCopy deploy these into your local (testing) DNN installation’s bin folder.&lt;/p&gt;

&lt;p&gt;You will now need to crack open your web.config for your DNN installation and add the following line, under the “System.Web/httpModules” section:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt; &lt;span class="kwrd"&gt;=&amp;quot;Microsoft.Samples.Web.ImageOptimizationModule&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt; &lt;span class="kwrd"&gt;=&amp;quot;Microsoft.Samples.Web.ImageOptimizationModule&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;This HttpModule assumes that there is a folder at the root of your web site named App_Sprites.&amp;#160; You should create that folder now otherwise you will get a yellow screen of death at first load.&lt;/p&gt;

&lt;p&gt;The HttpHandler wires up a cache dependency to the App_Sprites folder after “indexing” the content.&amp;#160; It will take all of the images in that folder and create the Sprite Image, and associated CSS files.&amp;#160; I also noticed that it will actually rebuild these files if they are deleted for any reason.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/SpriteandImageOptimizationFrameworkDotNe_AC33/Capture.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Capture" border="0" alt="Capture" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/SpriteandImageOptimizationFrameworkDotNe_AC33/Capture_thumb.png" width="602" height="360" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Notice the CSS files, a dat file and the new sprite0.png file; all of these were created based on the existing images in that folder by the HttpHandler.&lt;/p&gt;

&lt;p&gt;Within your module folder structure, create a “App_Sprites” folder, copy your images in to that folder.&amp;#160; Like so:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/SpriteandImageOptimizationFrameworkDotNe_AC33/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/SpriteandImageOptimizationFrameworkDotNe_AC33/image_thumb.png" width="283" height="625" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Notice that I set references to both of the ImageOptimizationFramework.dll and the ImageSprite.dll in this project.&lt;/p&gt;

&lt;p&gt;In your code-behind file for your module, we will follow the same pattern as the HttpHandler in order to add our Cache Dependency to the ImageOptimizer, like so:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Samples.Web;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; DNN.Sprites.DesktopModules.SpriteSample
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Sprite : DotNetNuke.Entities.Modules.PortalModuleBase
    {
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; _lockObj = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;();
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; _hasAlreadyRun;

        &lt;span class="kwrd"&gt;static&lt;/span&gt; Sprite()
        {
            &lt;span class="kwrd"&gt;lock&lt;/span&gt; (_lockObj)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (_hasAlreadyRun)
                    &lt;span class="kwrd"&gt;return&lt;/span&gt;;
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                    _hasAlreadyRun = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }

            ImageOptimizations.AddCacheDependencies(System.Web.HttpContext.Current.Server.MapPath(&lt;span class="str"&gt;&amp;quot;~/DesktopModules/SpriteSample/App_Sprites/&amp;quot;&lt;/span&gt;), rebuildImages: &lt;span class="kwrd"&gt;true&lt;/span&gt;);
            &lt;span class="kwrd"&gt;return&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {

        }
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;And finally in our ascx document we can now use the new ImageSprite control to refer to our images:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeBehind=&amp;quot;Sprite.ascx.cs&amp;quot; Inherits=&amp;quot;DNN.Sprites.DesktopModules.SpriteSample.Sprite&amp;quot; %&amp;gt;&lt;/span&gt;
&lt;span class="asp"&gt;&amp;lt;%@ Register TagPrefix=&amp;quot;asp&amp;quot; Namespace=&amp;quot;Microsoft.Samples.Web&amp;quot; Assembly=&amp;quot;ImageSprite&amp;quot; %&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ImageSprite&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/DesktopModules/SpriteSample/App_Sprites/windowsLogo.png&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ImageSprite&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ImageSprite1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/DesktopModules/SpriteSample/App_Sprites/xbox.png&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ImageSprite&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ImageSprite2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ImageUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/DesktopModules/SpriteSample/App_Sprites/office.png&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Which emits:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/SpriteandImageOptimizationFrameworkDotNe_AC33/Capture1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Capture1" border="0" alt="Capture1" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/SpriteandImageOptimizationFrameworkDotNe_AC33/Capture1_thumb.png" width="372" height="191" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;With the HTML:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;dnn_ctr6123_ModuleContent&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SpriteContent&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;img&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;windowsLogo-png&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;border-width:0px;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;img&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;dnn_ctr6123_Sprite_ImageSprite1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xbox-png&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;border-width:0px;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;img&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;dnn_ctr6123_Sprite_ImageSprite2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;office-png&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;border-width:0px;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Play close attention to the class attribute as well.&amp;#160; They are using a fairly simplistic naming convention to automatically emit the attribute for predictability.&lt;/p&gt;

&lt;p&gt;Although the project seems to be in the early stages I can see it receiving very broad adoption in the near future.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7585179" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET+C_2300_/default.aspx">.NET C#</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/HTML/default.aspx">HTML</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/ASPInsiders/default.aspx">ASPInsiders</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DNN/default.aspx">DNN</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Cache/default.aspx">Cache</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Caching/default.aspx">Caching</category></item><item><title>Introducing… Dynamo – A Scriptable DotNetNuke module</title><link>http://weblogs.asp.net/rchartier/archive/2010/07/21/introducing-dynamo-a-scriptable-dotnetnuke-module.aspx</link><pubDate>Wed, 21 Jul 2010 17:31:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7570730</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7570730</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/07/21/introducing-dynamo-a-scriptable-dotnetnuke-module.aspx#comments</comments><description>&lt;h4&gt;Introduction&lt;/h4&gt; &lt;p&gt;Imagine, for a second, you have a server sided JavaScript interpreter built right into a Content Management System. It should have full access to the entire Server sided API’s, depending on security requirements of course. You could literally treat source code as content. That is what this post is about.&lt;/p&gt; &lt;p&gt;If you have ever created a module for DotNetNuke you probably have spent (wasted) countless hours mucking around with Visual Studio, IIS, the file system, packaging, deploying, etc. It didn’t matter if they were the most complex modules, or a simple Hello World module. In the end you probably have come to the conclusion that there just has to be an easier way of doing this.&lt;/p&gt; &lt;p&gt;Enter Dynamo.. (Sorry for the lame name…)&lt;/p&gt; &lt;p&gt;Essentially Dynamo is a &lt;a href="http://dotnetnuke.codeplex.com/" mce_href="http://dotnetnuke.codeplex.com/"&gt;DotNetNuke Module&lt;/a&gt; which uses &lt;a href="http://jint.codeplex.com/" mce_href="http://jint.codeplex.com/"&gt;Jint&lt;/a&gt; under the covers.&lt;/p&gt; &lt;p&gt;Dynamo allows you to completely skip Visual Studio, the debugger, IIS, deployment, packaging, etc... Install this single module and open your DNN installation to the world of dynamic language interpretation.&lt;/p&gt; &lt;p&gt;Since DotNetNuke is a content management system, Dynamo brings your source code directly into the DNN UI. It allows you to create code, on the fly, and manage that code within DNN itself.&lt;/p&gt; &lt;p&gt;A screenshot might help clarify…&lt;/p&gt; &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/IntroducingDynamoAScriptableDotNetNukemo_9328/image_2.png" mce_href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/IntroducingDynamoAScriptableDotNetNukemo_9328/image_2.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/IntroducingDynamoAScriptableDotNetNukemo_9328/image_thumb.png" style="border-width: 0px; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/IntroducingDynamoAScriptableDotNetNukemo_9328/image_thumb.png" border="0" height="576" width="628"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;As you might not be able to interpret from the above screen shot, this is a server sided scripting language built right into DotNetNuke. In the Scripting Window you edit your script and either Preview or Save it. Notice the fancy syntax highlighting, just no intellisense. When viewing the module it will interpret and render the script at the server side. So the above example produces:&lt;/p&gt; &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/IntroducingDynamoAScriptableDotNetNukemo_9328/image_4.png" mce_href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/IntroducingDynamoAScriptableDotNetNukemo_9328/image_4.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/IntroducingDynamoAScriptableDotNetNukemo_9328/image_thumb_1.png" style="border-width: 0px; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/IntroducingDynamoAScriptableDotNetNukemo_9328/image_thumb_1.png" border="0" height="143" width="248"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;The echo method will emit text to the output container directly. Anything return’ed out of the function will also get slapped into the output container automatically. So you can either use a StringBuilder to append up your content, or just echo content directly. Watch out for Page.Response.Write, it will emit the content at the top of the page; which is consistent with ASP.NET’s rendering.&lt;/p&gt; &lt;h4&gt;Examples&lt;/h4&gt; &lt;p&gt;Another real world example would be to reproduce (at a very rudimentary level) the Feedback Module which ships with DotNetNuke. Here is the code block:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;echo(&lt;span class="str"&gt;"&amp;lt;div valign='top'&amp;gt;&amp;lt;fieldset&amp;gt;&amp;lt;legend&amp;gt;Provide Feedback&amp;lt;/legend&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;echo(&lt;span class="str"&gt;"Your Email:&amp;lt;br /&amp;gt;&amp;lt;input type='text' name='fromemail'&amp;gt;&amp;lt;br /&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;echo(&lt;span class="str"&gt;"Subject:&amp;lt;br /&amp;gt;&amp;lt;input type='text' name='subject'&amp;gt;&amp;lt;br /&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;echo(&lt;span class="str"&gt;"Body:&amp;lt;br /&amp;gt;&amp;lt;textarea name='body' rows='10' cols='50'&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br /&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;echo(&lt;span class="str"&gt;"&amp;lt;input type='submit' value='Send Feedback'&amp;gt;&amp;lt;br /&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;echo(&lt;span class="str"&gt;"&amp;lt;/fieldset&amp;gt;&amp;lt;/div&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt;(Page.IsPostBack) {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; fromemail = get(&lt;span class="str"&gt;"fromemail"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; subject = get(&lt;span class="str"&gt;"subject"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; body= get(&lt;span class="str"&gt;"body"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt;(fromemail!=&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp;&amp;amp; subject!=&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp;&amp;amp; body!=&lt;span class="str"&gt;""&lt;/span&gt;) &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; DotNetNuke.Services.Mail.Mail.SendMail(fromemail, &lt;span class="str"&gt;"toemail@localhost"&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;, subject, body, &lt;span class="str"&gt;""&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;""&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt; {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;""&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So you should first notice that Dynamo does not support context switching between plain HTML and Code Blocks. Everything is a code block. If you want to emit HTML, you must do something like:&lt;/p&gt;&lt;pre class="csharpcode"&gt;echo(&lt;span class="str"&gt;"&amp;lt;div valign='top'&amp;gt;&amp;lt;fieldset&amp;gt;&amp;lt;legend&amp;gt;Provide Feedback&amp;lt;/legend&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Mixing HTML and code is a nice-to-have in the ole product roadmap for the project.&lt;/p&gt;
&lt;p&gt;Next you will notice the code itself is a slight mix with JavaScript syntax and .NET Types. The &lt;a href="http://jint.codeplex.com/" mce_href="http://jint.codeplex.com/"&gt;interpreter&lt;/a&gt; has the ability to mix each and interpret it accordingly. This also includes being able to call into the DotNetNuke API library as well. It’s important to note that we are using an interpreter and NOT using Reflection.Emit(). Thus we are just fine within Medium Trust.&lt;/p&gt;
&lt;p&gt;What else can Dynamo do? Here is a short list of tested scenarios:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Consumes RSS Feeds (uses RSS.NET)&lt;/li&gt;
&lt;li&gt;Full Database CRUD&lt;/li&gt;
&lt;li&gt;Full Access to the DNN API, including but not limited to Portals/Tabs, Modules, Users, etc..&lt;/li&gt;
&lt;li&gt;Emitting custom JavaScript and CSS (into the Head tag, or CSS inline)&lt;/li&gt;
&lt;li&gt;Detecting PostBack’s&lt;/li&gt;
&lt;li&gt;File I/O&lt;/li&gt;
&lt;li&gt;Rendering files (into the interpreter, and getting the results)&lt;/li&gt;
&lt;li&gt;Twitter Timeline&lt;/li&gt;
&lt;li&gt;Page caching&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Your options you have are literally limitless.&lt;/p&gt;
&lt;h4&gt;Debugging&lt;/h4&gt;
&lt;p&gt;Since DotNetNuke is Web Based it would be extremely hard difficult to get stuff like intellisense and full step by step debugging working. I don’t have the time right now, but you never know with a future version of the product.&lt;/p&gt;
&lt;p&gt;For now, I have the ability to “Show Debugger Details”, in the Edit Script control, when you hit Preview. It literally will emit debug information at each step of the code as it interprets it. I did a simple dump of the Current Statement and the locals available. &lt;/p&gt;
&lt;p&gt;With that said I don’t block any exceptions and do bubble them up to the UI, so if you do have issues they will very obvious.&lt;/p&gt;
&lt;h4&gt;Source Code Versioning &lt;/h4&gt;
&lt;p&gt;Most professional software developers do use some sort of Source Control software. Right now the tool does NOT have anything built in to help with this. I would love to add this at the very least to the product backlog. Eventually I would love to get to it…&lt;/p&gt;
&lt;h4&gt;Security&lt;/h4&gt;
&lt;p&gt;The source code itself contains the line of code which completely disabled all security validations. You can do some serious damage with this. If this bothers you, you should do one of two things:&lt;/p&gt;
&lt;p&gt;1. Find the line: JintEngine.DisableSecurity(); Remove it, recompile and redeploy to your server&lt;/p&gt;
&lt;p&gt;2. Don’t use this package version in production.&lt;/p&gt;
&lt;h4&gt;Getting started&lt;/h4&gt;
&lt;p&gt;There are two methods for you to get started; the easiest method would be to use the &lt;a href="http://dnnlabs.codeplex.com/releases/view/49383#DownloadId=136628" mce_href="http://dnnlabs.codeplex.com/releases/view/49383#DownloadId=136628" target="_blank"&gt;prepackaged module installation file here.&lt;/a&gt; Download it, and install it into your Development DNN Installation site. The module’s name is “Dynamo” and should be available for you to drop on a page.&lt;/p&gt;
&lt;p&gt;The more difficult method would be to &lt;a href="http://dnnlabs.codeplex.com/SourceControl/list/changesets" mce_href="http://dnnlabs.codeplex.com/SourceControl/list/changesets"&gt;grab the source code,&lt;/a&gt; and compile it. This would be the method you would need to take in order to re-enable the Security (See the Security section above). This is what I use when building/testing the module itself. So if you need to make other fundamental changes you will need to do this as well.&lt;/p&gt;
&lt;p&gt;I would recommend you reset your references to the DotNetNuke specific DLL’s out of your actual bin folder for DotNetNuke. Once you have it building, I personally just use xcopy deployment to the website’s bin and DesktopModules folder and refresh the browser. Debugging can easily be done by setting the breakpoint and attaching VS.NET to w3wp.exe. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7570730" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/Visual+Basic/default.aspx">Visual Basic</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DNN/default.aspx">DNN</category></item><item><title>DotNetNuke 2010 - Firefox Persona</title><link>http://weblogs.asp.net/rchartier/archive/2010/07/14/dotnetnuke-2010-firefox-persona.aspx</link><pubDate>Wed, 14 Jul 2010 22:37:13 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7566461</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7566461</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/07/14/dotnetnuke-2010-firefox-persona.aspx#comments</comments><description>&lt;p&gt;Show your DotNetNuke passion by using the DotNetNuke 2010 Firefox Persona, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/113916/" target="_blank"&gt;found here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNuke2010FirefoxPersona_DBD0/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNuke2010FirefoxPersona_DBD0/image_thumb_1.png" width="543" height="77" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7566461" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DNN/default.aspx">DNN</category></item><item><title>So which password manager do you use?</title><link>http://weblogs.asp.net/rchartier/archive/2010/06/15/so-which-password-manager-do-you-use.aspx</link><pubDate>Tue, 15 Jun 2010 19:19:35 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7532270</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7532270</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/06/15/so-which-password-manager-do-you-use.aspx#comments</comments><description>&lt;p&gt;I’m sure you, like myself, have a few hundred passwords which I use on a fairly regular basis.&amp;#160; I sure hope that you shy way from a single password across all sites or a template based password where you reuse the same password but switch up a single digit or two.&amp;#160; Both of which are generally considered a very bad idea, especially when dealing with your online banking or similar sites.&lt;/p&gt;  &lt;p&gt;In the past, I tried to move my entire life and &lt;a href="http://weblogs.asp.net/rchartier/archive/tags/Portable/default.aspx" target="_blank"&gt;toolset onto a Pen drive&lt;/a&gt;.&amp;#160; I have had a varying level of success across the board with it failing miserably with the larger tools like Visual Studio, Microsoft Office, and similar applications.&amp;#160; Typically those that have a heavy dependency on the registry.&amp;#160; In my perfect world everything would be local configuration files -this push to the registry (away from ini files) was a mistake IMHO.&lt;/p&gt;  &lt;p&gt;For the longest time there was really only a single solution in the marketplace for reliable and safe Password Management tools.&amp;#160; That was &lt;a href="http://www.roboform.com/" target="_blank"&gt;RoboForm from Siber Systems&lt;/a&gt;.&amp;#160; It was so vital for me that I purchased their USB Version “RoboForm2Go”.&amp;#160; Over these past few years it treated me quite well and I still highly recommend using it for those that want an offline/portable installation-free solution.&amp;#160; For example if your one of those paranoid (safe) types that don't want some external site hosting your credentials…&lt;/p&gt;  &lt;p&gt;A few months ago I realized that the majority of my daily use of my “Portable environment” was specifically for RoboForm and nothing else.&amp;#160; The ole 80-20 rule applies.&amp;#160; I took a good long look at that fact and decided that I wanted to minimize the hassle of carrying around the USB Pen drive, getting it running, etc.. on a daily basis.&amp;#160; I also noticed that I would have liked to share this data with a few machines, simultaneously.&amp;#160; This forced me into looking into an online solution.&amp;#160; At a minimum it would plug into Firefox and store all passwords (safely) on a remote site; and be reliable/available 24x7.&amp;#160; A colleague recommended me to check out &lt;a href="http://lastpass.com/" target="_blank"&gt;LastPass&lt;/a&gt;.&amp;#160; Since this met my minimum requirements, and then some I decided to give it a run for its money.&lt;/p&gt;  &lt;p&gt;I can safely say that I have managed to completely make the transition to LastPass with no issues.&amp;#160; The online service is extremely reliable and their FireFox and IE integration is stellar.&lt;/p&gt;  &lt;p&gt;I also find myself using the Windows Mobile version of their product.&amp;#160; It needs work but it provides easy access to my data with a few clicks – you will need to upgrade to their premium product for this to work – &lt;a href="https://lastpass.com/features_premium.php" target="_blank"&gt;its only $1 per month and you get a bunch of devices supported plus a few other “features”&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Great job done by the LastPass team.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7532270" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/Security/default.aspx">Security</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Recommendations/default.aspx">Recommendations</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/Portable/default.aspx">Portable</category></item><item><title>DotNetNuke 5.4.2 - Folder Structure</title><link>http://weblogs.asp.net/rchartier/archive/2010/05/21/dotnetnuke-folder-structure.aspx</link><pubDate>Fri, 21 May 2010 18:34:35 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7495285</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7495285</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/05/21/dotnetnuke-folder-structure.aspx#comments</comments><description>&lt;p&gt;A pretty big request we are seeing in our support department is for our customers to have a better understanding of the folder structure of the DotNetNuke Product.&amp;#160; Here is a document which I was able to put together with help from the team. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.vancouvertechfest.ca/downloads/5.4.2 Install Folder Structure.pdf" target="_blank"&gt;PDF Download: 5.4.2 Install Folder Structure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I hope you find it useful as well and please let me know if you have anything to add.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7495285" width="1" height="1"&gt;</description></item><item><title>DotNetNuke Canadian Office gets a new home (6 Photos)</title><link>http://weblogs.asp.net/rchartier/archive/2010/05/10/dotnetnuke-canadian-office-gets-a-new-home-6-photos.aspx</link><pubDate>Mon, 10 May 2010 23:59:56 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7478589</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7478589</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/05/10/dotnetnuke-canadian-office-gets-a-new-home-6-photos.aspx#comments</comments><description>&lt;p&gt;As of few weeks ago some of you may have noticed the slight update in our Canadian office address – and yes I’m just getting around to blogging about it now.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The new address is…&lt;/p&gt;  &lt;p&gt;211 - 9440 202nd street   &lt;br /&gt;Langley, BC V1M 4A6    &lt;br /&gt;Canada    &lt;br /&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=211+-+9440+202nd+street+Langley,+BC+V1M+4A6+Canada&amp;amp;sll=49.04609,-122.287706&amp;amp;sspn=0.775005,1.356812&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=9440+202+St,+LANGLEY,+Greater+Vancouver+Regional+District,+British+Columbia,+Canada&amp;amp;ll=49.173722,-122.665615&amp;amp;spn=0.012078,0.0212&amp;amp;z=16&amp;amp;iwloc=A" target="_blank"&gt;[map]&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We had the opportunity to come view the place while the contractors were doing some improvements…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2875.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_2875" border="0" alt="IMG_2875" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2875_thumb.jpg" width="244" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Candice, Charles, Jenni and Jaspreet admiring the building directory in the lobby.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2879.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_2879" border="0" alt="IMG_2879" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2879_thumb.jpg" width="244" height="164" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Our support department is getting a serious upgrade!&amp;#160; Those support folks, always so demanding!&amp;#160; :)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2880.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_2880" border="0" alt="IMG_2880" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2880_thumb.jpg" width="244" height="164" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here is a good shot from reception across most of the space.&amp;#160; What you don’t see is the few offices on the left side, and a boardroom to the immediate left.&amp;#160; Pretty much the full Canadian group present and accounted for!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2881.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_2881" border="0" alt="IMG_2881" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2881_thumb.jpg" width="164" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Our soon-to-be and much-awaited-for kitchen space!&amp;#160; Server room is just to the left, and its actually in its own room.&amp;#160; Konstantine is so happy now!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2890.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_2890" border="0" alt="IMG_2890" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2890_thumb.jpg" width="164" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Joe and Shaun in deep contemplation…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2893.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_2893" border="0" alt="IMG_2893" src="http://weblogs.asp.net/blogs/rchartier/WindowsLiveWriter/DotNetNukeCanadianOfficegetsanewhome6Pho_EEFF/IMG_2893_thumb.jpg" width="244" height="164" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Keivan, overly excited about a place to work out.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So that’s the tour.&amp;#160; Ill try to take some new photos now that we are all moved in and post them up once I’m back from my mini-vacation.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7478589" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DNN/default.aspx">DNN</category></item><item><title>DotNetNuke Boston User Group</title><link>http://weblogs.asp.net/rchartier/archive/2010/05/06/dotnetnuke-boston-user-group.aspx</link><pubDate>Thu, 06 May 2010 18:52:20 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7472934</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7472934</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/05/06/dotnetnuke-boston-user-group.aspx#comments</comments><description>&lt;p&gt;Eric, over at the &lt;a href="http://www.dnnboston.org/"&gt;Boston DNN User Group&lt;/a&gt; has graciously invited me to give a presentation to his User Group on May 17th.&amp;#160; &lt;/p&gt;  &lt;p&gt;Come join me for an open discussion on “DotNetNuke – A look inside”.&amp;#160; I will cover topics like how we are adopting the Agile methodologies at a corporate level, how we are best utilizing Scrum, a sneak peek at the roadmap for 2010, and how YOU can participate with the future direction of the product.&lt;/p&gt;  &lt;p&gt;If you are currently a partner or a customer of DotNetNuke please feel free to attend and reach out, I’m sure Eric would love the extra attendance!&amp;#160; I would love to start putting faces to the names of so many of you.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7472934" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rchartier/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/User+Groups/default.aspx">User Groups</category><category domain="http://weblogs.asp.net/rchartier/archive/tags/DNN/default.aspx">DNN</category></item><item><title>DotNetNuke is hiring – Are you qualified?</title><link>http://weblogs.asp.net/rchartier/archive/2010/05/06/dotnetnuke-is-hiring-are-you-qualified.aspx</link><pubDate>Thu, 06 May 2010 18:42:38 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7472930</guid><dc:creator>Rob Chartier</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rchartier/rsscomments.aspx?PostID=7472930</wfw:commentRss><comments>http://weblogs.asp.net/rchartier/archive/2010/05/06/dotnetnuke-is-hiring-are-you-qualified.aspx#comments</comments><description>&lt;p&gt;We just posted up two positions for the Vancouver/Lower Mainland area:&lt;/p&gt;  &lt;p&gt;Engineering - Senior Developer   &lt;br /&gt;&lt;a href="https://www.bctechnology.com/scripts/show_job.cfm?id=78592"&gt;https://www.bctechnology.com/scripts/show_job.cfm?id=78592&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Engineering - Test/QA Manager   &lt;br /&gt;&lt;a href="https://www.bctechnology.com/scripts/show_job.cfm?id=78591"&gt;https://www.bctechnology.com/scripts/show_job.cfm?id=78591&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If you feel you are qualified feel free to apply now!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7472930" width="1" height="1"&gt;</description></item></channel></rss>