Sharepoint and Webtrends Analytics Ideas

 

Sharepoint 2010 has some great new features.  Especially considering some of the disturbing necessities of previous Sharepoint Versions.

The first thing I noticed was that Visual Studio 2010 has default templates for building Sharepoint Projects.  This is huge compared to the monstrous and annoying effort required for development on previous versions.

Being able to build Sharepoint Projects from Visual Studio 2010 is a huge change, enabling IT & Development Groups to actually use regular Windows 7 Machines instead of needing Windows Server operating systems and licenses to build Sharepoint Applications.  To me, this was always a non-starter, and actively discouraged Sharepoint Applications in the past ? obviously most companies had not listened to the voice of reason.  But now, I have changed to actively encouraging Sharepoint 2010 Projects now.

 

The second thing is, it is more open and easier to build public facing sites finally.  This has been desperately needed.  I am glad that it has finally become a higher priority.  Not that I totally trust the Sharepoint 2010 Server to be fully web compliant, I have seen that they've taken leaps ahead.

The other thing I stumbled upon recently that I had not seen was the analytics capabilities of Sharepoint 2010.  The overview is that you can get traffic, search, and inventory reports based on how much traffic the site gets, who visits the sites, and other web analytics data.  Definitely check out the blog entry "Introducing Web Analytics in Sharepoint 2010" on the Enterprise Content Management (WCM) Blog.

Between the Sharepoint Analytics, Silverlight, and offerings we provide at Webtrends we now have direct extensibility points form the internal Sharepoint Data Sources, Analytics Data Stores, temp caching and other control mechanisms within Silverlight, and much more.  What does all that techno-babble mean?  It means more data, more available faster, easier access, decreased development times, more accurate reporting, more timely reporting, and the list goes on.  Pretty much ever metric about web analytics within Sharepoint 2010 has just gotten better.

The other architectural pieces I noticed is the Sharepoint Aggregation of data is now per web application in the farm, per site collection, per site, and per search service application.  This can be broken out even further with On Demand Webtrends Analytics by providing ETL between the Sharepoint and pulling the Sharepoint or extended analytics data Webtrends provides into the Business Intelligence (BI) framework within an enterprise.  At this point I can only imagine the scale and available data points for managing enterprise collaboration, social media, and other capabilities with this combination.  I'm looking forward to seeing what kinds of ROI we can see from these integrations, whatever it is, I already know it will be measurable and I suspect substantial.

For more information about Sharepoint 2010 check out the Sharepoint Blog and for more information regarding how Webtrends can get your Sharepoint Site Analytics extended check out Webtrends Professional Services!

Are there any data points, questions, thoughts, or ideas you have about connecting Sharepoint & Analytics Data?  Anything you haven't seen connected that should be?  Does your organization use Sharepoint, Webtrends Analytics, or other collaboration software?  Anyway, I am no shill, I am honestly interested in these connections outside of the fact I work for Webtrends.  If you have a minute, please let me know what your thoughts are on these technology connections.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: Adron
Posted on: 3/23/2010 at 10:47 AM
Tags: , , ,
Categories: IDEs, Software Tools, and Applications | Web Analytics | WebTrends
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (1) | Post RSSRSS comment feed

Microsoft Silverlight Analytics Framework - Day 2 Part 2 of MIX 2010

I went to the session on Microsoft Silverlight Analytics Framework (MSAF) today while here at MIX 2010.  It was a great walk through the features, ideas, and what the end goal is.  Michael Scherotter did a great job of lining up the ideas, intentions, and the functional ideas behind the framework.

The framework is built around the Silverlight Behaviors.  If you aren't sure what behaviors are, check out these entries from Nikhilk.net Silverlight Behaviors, Silverlight 3 Drag Behavior, An Introduction to Behaviors, Triggers, and Actions, and of course the MSDN Documentation on the matter.

Some of the key features of the framework is to support out-of-browser scenarios, which works perfectly with out Webtrends DX Web Services.  Offline scenarios, which again, we have worked toward supporting at Webtrends DC Web Services via caching and other criteria as needed.  Another feature that I was really stoked about is the Microsoft Expression Blend integration that removes the need for coding, thus simplifying the addition of analytics components based on events or other actions within a Silverlight Application.  This framework also easily supports A/B Testing (again, something we do quit a bit of at Webtrends with Webtrends Optimize.

The last thing I really wanted to point out was the control support that this framework has support in already from Telerik RadControls, Smooth Streaming Media Element, and Microsoft Silverlight Media Framework Player 1.0.  These are implemented with behaviors and handlers exposed via MEF (Managed Extensibility Framework).

All in all, great second day, great analytics framework for Silverlight, and great presentation.  Until tomorrow, adieu.

Shout it kick it on DotNetKicks.com
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Charts For WPF and Silverlight

I have been digging around on the web lately to see what I can find that provides a solid, seamless charting ability to WPF and Silverlight.  There are a ton of choices out there.  After spending a good couple hours last night and some time today I have decided that I am going to go with Visifire.  These charts are pretty solid and ridiculously easy to implement.  Check out this video for some of the samples they have.

Visifire 2.x Gallery from visifire team on Vimeo.

I hope to have some write up how to entries in the near future.  I have just completed a few work related projects and I know there are some good samples in all that which are publishable.  : )

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: Adron
Posted on: 12/3/2009 at 6:03 PM
Tags: , , ,
Categories: IDEs, Software Tools, and Applications | Keeping Up
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (3) | Post RSSRSS comment feed

Flash, Flex, and AIR

I've started ramping hard core of Adobe's suite of products.  There are numerous reasons why, but I won't bore anyone or myself.  The cool thing is the technologies that Adobe has created.  I started to write up a description but I found this video which describes the differences between Flash & Flex Development Environments, and the difference between Flash and AIR.

This player, unto itself is rather awesome, I really dig it.

The second thing I?ve started reading through is the Inside RIA Entries.  This is a valuable knowledge base from actual bloggers and users of these Adobe toolsets.

As I'm going through all of this material I'll post more of the information I'm accumulating.

On a side note from the market perspective, Microsoft really needs to bulk up against the competition, Adobe has some amazing products that really are years ahead of the competition for developing well thought out and usable user interfaces and designs in general.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: adron
Posted on: 6/6/2009 at 11:36 AM
Tags: , , ,
Categories: IDEs, Software Tools, and Applications | WebTrends
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (0) | Post RSSRSS comment feed

PEX, Ben Hall, and Some Other Notes

While checking out more ideas for my data generation tool/app/libraries I stumbled on this video of a presentation by Ben Hall.  The presentation “DDD7 Session Video - Microsoft Pex - The Future of unit testing?” is a great introduction to the PEX framework/toolset.  If you write unit tests, or are trying to get started writing tests, this is a great video to watch.

I watched the video and have a new level of admiration for this guy, and for Red Gate.  He’s using ReSharper (+ points), steps through code smoothly and logically (+ points), and above all he knows his information.  Excellent traits.

PEX Worries?

At 40:14 in the video Ben brings up a major point of contention that I too have.  I don’t really want to use PEX with the Microsoft Test Framework.  I?d much rather use NUnit, mbUnit, or SOMETHING besides Microsoft Test.  Even though, I know, the last dozen code entries I’ve posted uses the Microsoft Test Framework I intend to change that soon.  Ben goes on to point out that almost all of the major test frameworks are now supported.  This is awesome news!  I now have full motivation and have downloaded the PEX libs.

With That Written?

I’m now off to download NUnit and get rid of my Microsoft Tests.  I will prospectively go get XUnit too and start taking a solid look at that tool.

Data Generation Tools

While viewing this video Ben also mentioned a data generation project on CodePlex.  I couldn’t help but get a bit giddy about this fact.  So I checked it out.  Red Gate Generators – Red Gate also has a professional tool that they sell.  The libraries look pretty cool and solid, but I’ll have to review the library license before I know if I can use anything there or not.  I might have to just “not see” anything there.

Fini.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: Adron
Posted on: 2/17/2009 at 7:56 AM
Tags: , , ,
Categories: IDEs, Software Tools, and Applications | Keeping Up | Website and Application Write-Ups
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (0) | Post RSSRSS comment feed

Find Those Police, Before They Find You!

A buddy of mine commissioned and has released a pretty awesome IPhone App.  Of course I'm still a bit behind the times with my beat up HTC, but I'll be getting either an Android Phone or an IPhone in maybe a year or two.  This app however, has made me ponder moving up that purchase date.  Check out NMobile for IPhone.  That's my self motivated advertising blurb of the day, thanks for reading.
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: Adron
Posted on: 12/4/2008 at 7:06 AM
Tags: ,
Categories: IDEs, Software Tools, and Applications
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (0) | Post RSSRSS comment feed

Biscuits & Fried Chicken

So yeah, absolutely pointless title except I'm gettin' me some of that.

In other news, I've reloaded my main workstation.  This workstation is my spiffy 1.5+ year old Dell Inspiron 1720.  It is a fairly decent laptop for a workstation, with 1920x1200 resolution it gives me almost what one has with dual monitor support!

The Tools & Architecture Frameworks Listing

Every few months I end up with a different set of frameworks and applications that I use for development.  Being a developer one has to change frequently and stay updated with the latest and greatest, or risk losing value as a developer and fading into mediocrity.  I don't dig that prospect so I tend to stay close to bleeding edge, without the blood (aka lotsa bugs).

Architectural Pieces - Major 5

  1. entlib - For many of the internal pieces, I'm ramping up on and already using several of the entlib libraries (redundant use of library, eh).
  2. Silverlight 2 - For many of my web efforts, I'll be pushing through some Silverlight Apps for the UI part of my architectural standard.
  3. .NET 3.5 SP1 - Of course, for the framework that binds it all together, it's gonna be .NET 3.5 SP1.
  4. The Cloud / Azure - I'll be working diligently to get some initial cloud & Azure work done to prototype how and where I can place applications into the cloud for various reasons.  I'm actually hoping to avoid local database use in the future with use of SSDS (SQL Server Data Services) or SDS.
  5. SQL Server 2008 - 08' features rock!  Nuff' said.

Architectural Pieces - Minor 4

  1. Spring.NET - The architectural elements put together to make up this framework is awesome.  I dig the pieces and would prospectively use this if there is reason not to use entlib pieces (i.e. performance, existing code base, etc)
  2. Adobe Air App - I'm thinking of doing development against Air instead of Silverlight 2 in numerous places, primarily because it deploys EVERY FREAKING WHERE!!!  Adobe Air is truly amazing, and I'm surprised it hasn't gotten more publicity.  It smokes Java for smoothness, Silverlight for compatibility and gloss, and overall looks pretty easy to develop for.
  3. Java Struts - If need be, there could be future efforts I've seen coming down the pipe that will require Struts n such.  It could be an interesting ride to jump sides and build out some Java App with Struts.  I'd however, rather not, as there is no real reason to use this.
  4. RoR or Ruby on Rails - I'm not explaining this.  If you haven't heard or checked out the phenom that Ruby on Rails is, you're doing yourself a disservice, just go check it out.  It IS worth your time if you build more than one application per year.  :)

Tools / IDEs / Other Things - The 4

  1. Subversion - Just because I have it, it is insanely simple, takes almost no time to use and maintain.  Simply, It aint broke, and I'm not fixing it.
  2. Tortoise & Visual SVN - Total cost is $49 bucks.  It is worth every penny.  Integrates Tortoise into Visual Studio in a more flawless integration than Team Foundation Services source integration from Microsoft itself!
  3. ReSharper - Again, if you don't use it, you probably should.  It's one of the greatest tools on the market.  Personal is $199, company license is like $349 or something.  It's worth it, it is more than worth it.  If you aren't using it you're probably spending too much money on overall development and NOT writing code the way it should be.  I can't rave about the awesomeness of this product enough.
  4. Visual Studio.NET 2008 - Ya gotta have VS is you really want to get hard core with the .NET.  VS.NET Express is available for free.  VS.NET Professional is about $900 or more, but if you check out Microsoft's Biz deals you can get it for free. Also if you are a student you can get it for practically nothing, or for free.  So no real excuse not to use this.  If you work for a company that has in excess of $1 million per year, they better buy you a copy.  If they don't, and they're making you use notepad or something to write code in for .NET, you should quit, because rest assured that company will strangle itself from being so cheap and you'll be out of work anyway.

So that's my list, any questions feel free to contact me or drop a comment.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: adron
Posted on: 11/17/2008 at 7:28 AM
Tags: , , , , , , , , , ,
Categories: IDEs, Software Tools, and Applications | Just Stuff | Keeping Up
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (0) | Post RSSRSS comment feed

Visual Studio Project and Solution Guidelines :: Tip o' The Day

Over the years I've tried various configurations for projects and solutions in Visual Studio. One thing I've noticed is there are definitely good ways to do things and bad ways to do things. My intention is to, with this entry and others, lay out what is good, efficient, and elegant practice in putting together Visual Studio Projects. Since I haven't posted a tip o' the day in a long while, I figured that would be a great category to drop these into.

Don't Add Projects Whimsically!

Projects after a while start to cause all sorts of problems. There are interdependency issues that come up, possible circular references, reference maintenance, obfuscation of logic, namespace telescoping, and the list goes on. Keep project organization simple. In MVC for instance, often a solution becomes littered with a project for the model, the assembler for the model, a project for the view, and maybe ever several projects for the controllers.

All of that should be fine in a single project! Yes, one single itty bitty project. The project can then be built into a single DLL and life is thus simplified!

So don't add projects "just because".

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: Adron
Posted on: 11/3/2008 at 6:54 AM
Tags: , , , ,
Categories: IDEs, Software Tools, and Applications | Tip o' The Day
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (0) | Post RSSRSS comment feed

Code Paste Add In for Windows Live Writer

UPDATED 10/25/2008 Code Sections Formatting Fixed With CSS

What I'm using is available Plugin Collection for Windows Live Writer on Codeplex.  This comes in real useful when getting code into a blog entry.  Because straight pasting really doesn't do so well for readability.

So here are my test code pastes.  A basic view in C#.

   1:  using System;
   2:  using System.ComponentModel;
   3:  using System.Windows.Forms;
   4:  using Microsoft.Practices.Unity;
   5:  using Tsr.SeatingSystem.Controller;
   6:  using Tsr.SeatingSystem.Controller.Views;
   7:  using Tsr.SeatingSystem.WinForm.Properties;
   8:  using Tsr.SeatingSystem.WinForm.Seating;
   9:   
  10:  namespace Tsr.SeatingSystem.WinForm
  11:  {
  12:      public partial class SeatingSystemMainView : Form, ISeatingSystemMainView
  13:      {
  14:          private TsrController controller;
  15:   
  16:          public SeatingSystemMainView()
  17:          {
  18:              InitializeComponent();
  19:              Icon = Resources.Clock;
  20:          }
  21:   
  22:          [Dependency]
  23:          public TsrController Controller
  24:          {
  25:              get { return controller; }
  26:              set
  27:              {
  28:                  controller = value;
  29:                  controller.SetSeatingSystemMainView(this);
  30:              }
  31:          }
  32:   
  33:          #region View Events & Raise Events
  34:   
  35:          public event EventHandler SeatingSystemMainView_Load;
  36:          public event EventHandler ExitToolStripMenuItem_Click;
  37:          public event EventHandler TicketingToolStripMenuItem_Click;
  38:          public event EventHandler SeatingToolStripMenuItem_Click;
  39:          public event EventHandler ReservationsToolStripMenuItem_Click;
  40:          public event EventHandler OptionsToolStripMenuItem_Click;
  41:          public event EventHandler AboutToolStripMenuItem_Click;
  42:          public event PropertyChangedEventHandler PropertyChanged;

Some basic SQL.

   1:  /****** Object:  View [dbo].[tmtUserListing]    Script Date: 07/06/2008 01:27:11 ******/
   2:  IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[tmtUserListing]'))
   3:  DROP VIEW [dbo].[tmtUserListing]
   4:  GO
   5:  /****** Object:  View [dbo].[tmtUserListing]    Script Date: 07/06/2008 01:27:11 ******/
   6:  SET ANSI_NULLS ON
   7:  GO
   8:  SET QUOTED_IDENTIFIER ON
   9:  GO
  10:  IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[tmtUserListing]'))
  11:  EXEC dbo.sp_executesql @statement = N'CREATE VIEW dbo.tmtUserListing
  12:  AS
  13:  SELECT     dbo.tmtUsers.UserId, GrandCentral.dbo.aspnet_Users.UserName
  14:  FROM         dbo.tmtUsers LEFT OUTER JOIN
  15:                        GrandCentral.dbo.aspnet_Users ON dbo.tmtUsers.UserId = GrandCentral.dbo.aspnet_Users.UserId
  16:  ' 
  17:  GO

Some XAML (Which technically isn't on the list, but I formatted it via HTML)

   1:  <UserControl x:Class="SecurityAdministratorWpf.Login"
   2:      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:      Height="225" Width="410">
   5:      <Grid>
   6:          <Button Height="23" 
   7:                  HorizontalAlignment="Right" 
   8:                  Margin="0,0,28,15" 
   9:                  Name="buttonLogin" 
  10:                  VerticalAlignment="Bottom" 
  11:                  Width="75" 
  12:                  ToolTip="Click to login.">Login</Button>
  13:      </Grid>
  14:  </UserControl>

Some HTML

   1:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
   2:  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
   3:  <head runat="server">
   4:      <link rel="stylesheet" href="default.css" type="text/css" />
   5:      <link rel="shortcut icon" href="~/pics/blogengine.ico" type="image/x-icon" />
   6:  </head>
   7:  <body>
   8:      <form id="Form1" runat="server">
   9:      <div class="outerouter">
  10:          <div class="outer-container">
  11:              <div class="inner-container">
  12:                  <div class="header">
  13:                      <div class="title">
  14:                          <div class="sitename">
  15:                              <a href="~/" runat="server">
  16:                                  <%=BlogSettings.Instance.Name %></a></div>
  17:                          <div class="sitenameshadow">
  18:                              <%=BlogSettings.Instance.Name %></div>
  19:                          <div class="slogan">
  20:                              <%=BlogSettings.Instance.Description %></div>
  21:                      </div>
  22:                  </div>
  23:                  <div class="path">
  24:                      <div class="left">
  25:                          <ul>
  26:                              <li>
  27:                                  <asp:HyperLink ID="HlHome" NavigateUrl="~/default.aspx" runat="server">Home</asp:HyperLink></li>
  28:                              <li class="page_item">
  29:                                  <asp:HyperLink ID="HlArchive" NavigateUrl="~/archive.aspx" runat="server">Archive</asp:HyperLink></li>
  30:                              <li class="page_item">
  31:                                  <asp:HyperLink ID="hlContact" NavigateUrl="~/contact.aspx" runat="server">Contact</asp:HyperLink></li>
  32:                          </ul>
  33:                      </div>
  34:                      <div class="right">
  35:                          <a href="<%=Utils.FeedUrl %>">Subscribe to My Feed<asp:Image ID="RssIconImage1" runat="Server"
  36:                              Width="24px" Height="24px" AlternateText="RSS Feed" ImageAlign="AbsMiddle" Style="margin: 0 0 0 10px" /></a>
  37:                      </div>
  38:                      <div class="clearer">
  39:                      </div>
  40:                  </div>
  41:                  <% if (Page.User.Identity.IsAuthenticated)
  42:                     { %>
  43:                  <div class="adminpath">
  44:                      <h2>
  45:                          Admin:</h2>
  46:                      <uc1:menu ID="Menu1" runat="server" />
  47:                  </div>
  48:                  <%} %>
  49:                  <div class="main">
  50:                      <div class="content">
  51:                          <asp:ContentPlaceHolder ID="cphBody" runat="server" />
  52:                      </div>
  53:                      <div class="navigation">
  54:                          <blog:SearchOnSearch ID="SearchOnSearch1" runat="server" MaxResults="3" Headline="You searched for"
  55:                              Text="Here are some results for the search term on this website" />
  56:                          <div class="block">
  57:                              <h2>
  58:                                  Search</h2>
  59:                              <blog:SearchBox ID="SearchBox1" runat="server" />
  60:                          </div>
  61:                          <div class="block">
  62:                              <h2>
  63:                                  Tags</h2>
  64:                              <blog:TagCloud ID="TagCloud1" runat="server" />
  65:                          </div>
  66:                          <div class="block">
  67:                              <h2>
  68:                                  Categories</h2>
  69:                              <blog:CategoryList ID="CategoryList1" ShowRssIcon="true" runat="Server" />
  70:                          </div>
  71:                          <div class="block">
  72:                              <h2>
  73:                                  Archive</h2>
  74:                              <blog:MonthList ID="MonthList1" runat="Server" />
  75:                          </div>
  76:                          <div class="block">
  77:                              <h2>
  78:                                  Blogroll</h2>
  79:                              <blog:Blogroll ID="Blogroll1" runat="server" />
  80:                          </div>
  81:                          <div class="block">
  82:                              <h2>
  83:                                  Disclaimer</h2>
  84:                              <p>
  85:                                  The opinions expressed herein are my own personal opinions and do not represent
  86:                                  my employer's view in anyway.</p>
  87:                              <p>
  88:                                  &copy; Copyright
  89:                                  <%=DateTime.Now.Year %></p>
  90:                          </div>
  91:                      </div>
  92:                      <div class="clearer">
  93:                          &nbsp;</div>
  94:                  </div>
  95:                  <div class="footer">
  96:                      <div class="left">
  97:                          <div>
  98:                              Powered by <a href="http://www.dotnetblogengine.net/" target="_blank">BlogEngine.NET</a>
  99:                              <%=BlogSettings.Instance.Version() %>
 100:                              | Design by <a href="http://michael.sivers.co.uk">Michael Sivers</a>
 101:                          </div>
 102:                      </div>
 103:                      <div class="right">
 104:                          <asp:LoginStatus ID="LoginStatus1" runat="Server" LoginText="Sign in" LogoutText="Sign out"
 105:                              EnableViewState="false" />
 106:                      </div>
 107:                      <div class="clearer">
 108:                      </div>
 109:                  </div>
 110:              </div>
 111:          </div>
 112:      </div>
 113:      </form>
 114:  </body>
 115:  </html>
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

How I'm Using BlogEngine.NET Part 1

BlogEngine.NET does not currently do multiple blogs per installation of the web application.  I know this is supposed to change in the future, but I needed a solution now.  The easiest fix really, and the previous Community Server Engine installation lent itself well to this, was to just create a web application for each blog I was going to have.

What I did was create a basic web application, which I planned to host at the root level of my domain, http://www.adronbhall.com.  I create that web application in my overall .NET Solution and then created two copied instances of the BlogEngine.NET Application in the same solution.  These would be copied into the existing directories, or paths of the current root application like; http://adronbhall.com/blogs/technology__software_development/ and http://adronbhall.com/blogs/my_transportation_obsession/.

I then created a separate database for each.  This of course, IMHO, isn't all that great since I'll have redundant users and all that.  I'm just going to have to figure that problem out later.  For now, I just want to get the engines setup so I can have total control over my sites and code base.

I reconnected each respective BlogEngine.NET installation to their own database.  I got good connectivity, downloaded the appropriate skins that I wanted for each, and got to work on setting them up.

Then things got really fun when I began building out the ETL for each of the sites.  The Community Server database was of course in a single source, but the other two were going to need to be in separate locations.  Not really complicated, but not something one whips up in 5 minutes either.

The first thing I tried was creating a true to the ideal ETL project with SSIS, which turned out to be a complete waste of time and a PIA.  After that I just wrote some straight SQL that would take data from the originating database and insert the data via mappings directly into the database I wanted it to end up in.  The following are the first steps of this makeshift ETL effort.

First I setup each database, configured each of the blogengine.net databases so they were ready for import.  Then I added a database project to my overall solution.

The Database Project "EtlCode"

The Databases

I then started created the various extraction SQL that is needed for the views in the AdronsCommunity Database.  There were several views, with some code duplication (SQL isn't exactly an OOP language), but specifically geared toward each database the data would eventually end up in.

Each of the views created had the following code, notice that I've used a lot of "as SomeColumn" so that the names would align easily and reduce prospective confusion.  If I want to extract the other entries not related to these two blogs later I wanted to make it easy on myself.

Query for Categories

SELECT  dbo.cs_Post_Categories.Name, 
    dbo.cs_Post_Categories.Description, 
    dbo.cs_Post_Categories.CategoryID AS CS_CategoryID, 
    dbo.cs_Post_Categories.IdForBlogEngine AS CategoryId
FROM dbo.cs_Post_Categories INNER JOIN
    dbo.cs_Post_Categories_Parents ON 
        dbo.cs_Post_Categories.CategoryID = dbo.cs_Post_Categories_Parents.CategoryID
WHERE (dbo.cs_Post_Categories.SectionID = 13) 

Query for Posts

SELECT     TOP (100) PERCENT 
    IdForBlogEngine AS PostID, 
    Subject AS Title, 
    Body AS Description, 
    FormattedBody AS PostContent, 
    PostDate AS DateCreated, 
    NULL AS DateModified, 
    'Adron' AS Author, 
    IsApproved AS IsPublished, 
    NULL AS IsCommentEnabled, 
    NULL AS Raters, 
    NULL AS Rating, 
    NULL AS Slug, 
    PostID AS CS_PostID
FROM dbo.cs_Posts
WHERE (PostAuthor = N'adron') AND 
    (UserID = 2102) AND 
    (SectionID = 13) AND 
    (IsApproved = 1) AND 
    (PostType = 0)
ORDER BY DateCreated DESC

Query for Categories & Posts Many to Many Table

SELECT TOP (100) PERCENT 
    dbo.cs_Posts.Subject, 
    dbo.cs_Post_Categories.Name, 
    dbo.cs_Posts_InCategories.PostID, 
    dbo.cs_Posts_InCategories.CategoryID, 
    dbo.cs_Posts.IdForBlogEngine AS PostIDForBlogEngine, 
    dbo.cs_Post_Categories.IdForBlogEngine AS CategoryIdForBlogEngine
FROM dbo.cs_Post_Categories 
            INNER JOIN
    dbo.cs_Posts_InCategories ON 
        dbo.cs_Post_Categories.CategoryID = dbo.cs_Posts_InCategories.CategoryID 
            RIGHT OUTER JOIN
    dbo.cs_Posts ON 
        dbo.cs_Posts_InCategories.PostID = dbo.cs_Posts.PostID
WHERE (dbo.cs_Post_Categories.Name IS NOT NULL) AND 
    (dbo.cs_Post_Categories.SectionID = 13)
ORDER BY dbo.cs_Posts.PostDate DESC

Query for Comments

SELECT TOP (100) PERCENT 
    dbo.cs_Posts.IdForBlogEngine AS PostCommentID, 
    dbo.l_looselyPosts.PostID, 
    dbo.cs_Posts.PostDate AS CommentDate, 
    dbo.cs_Posts.PostAuthor AS Author, 
    '' AS Email, 
    '' AS Website, 
    dbo.cs_Posts.FormattedBody AS Comment, 
    dbo.cs_Posts.IPAddress AS IP, 
    dbo.cs_Posts.IsApproved
FROM dbo.cs_Posts INNER JOIN 
    dbo.l_looselyPosts ON 
        dbo.cs_Posts.ParentID = dbo.l_looselyPosts.CS_PostID
WHERE (dbo.cs_Posts.PostType = 1)
ORDER BY CommentDate DESC

Notice in the queries above, I turned each one into a veiw.  Some of the above views have dependencies on each other to derive the new primary keys and other criteria for the process.  Also one thing I stumbled upon is that I had to make the Email and Website columns on the Query for Comments empty nvarchar types instead of null, because in code they break when they're null but work fine when they just have empty strings.  This might be a bug, at some point, I'll mention but doubt it is causing any harm at this point.

Once each of these were created I could then create my actual queries for the process.

Get the Categories

DELETE FROM [looselycoupled].[dbo].[be_PostCategory]
GO
INSERT INTO [looselycoupled].[dbo].[be_PostCategory]
           ([PostID]
           ,[CategoryID])
SELECT l_looselyPostsCategories.PostIDForBlogEngine, 
    l_looselyPostsCategories.CategoryIdForBlogEngine
FROM l_looselyPostsCategories 
            INNER JOIN
    l_looselyCategories ON 
        l_looselyPostsCategories.CategoryID = l_looselyCategories.CS_CategoryID 
            INNER JOIN
    l_looselyPosts ON 
        l_looselyPostsCategories.PostID = l_looselyPosts.CS_PostID

Get the Posts

DELETE FROM [looselycoupled].[dbo].[be_Posts]
GO
INSERT INTO [looselycoupled].[dbo].[be_Posts]
           ([PostID]
           ,[Title]
           ,[Description]
           ,[PostContent]
           ,[DateCreated]
           ,[DateModified]
           ,[Author]
           ,[IsPublished]
           ,[IsCommentEnabled]
           ,[Raters]
           ,[Rating]
           ,[Slug])
SELECT [PostID]
      ,[Title]
      ,[Description]
      ,[PostContent]
      ,[DateCreated]
      ,[DateModified]
      ,[Author]
      ,[IsPublished]
      ,[IsCommentEnabled]
      ,[Raters]
      ,[Rating]
      ,[Slug]
FROM [AdronsCommunity].[dbo].[l_looselyPosts]

Get the Many to Many Posts to Categories

DELETE FROM [looselycoupled].[dbo].[be_Categories]
GO
INSERT INTO [looselycoupled].[dbo].[be_Categories]
           ([CategoryName]
            ,[Description]
            ,[CategoryID])
SELECT DISTINCT 
    CAST(Name AS nvarchar(50)) AS Name, 
    CAST(Description AS nvarchar(200)) AS Description, 
    CategoryId
FROM         AdronsCommunity.dbo.l_looselyCategories

Get the Comments

DELETE FROM [looselycoupled].[dbo].[be_PostComment]
GO
INSERT INTO [looselycoupled].[dbo].[be_PostComment]
           ([PostCommentID]
           ,[PostID]
           ,[CommentDate]
           ,[Author]
           ,[Email]
           ,[Website]
           ,[Comment]
           ,[Ip]
           ,[IsApproved])
SELECT    [PostCommentID]
      ,[PostID]
      ,[CommentDate]
      ,[Author]
      ,[Email]
      ,[Website]
      ,[Comment]
      ,[IP]
      ,[IsApproved]
FROM    [AdronsCommunity].[dbo].[l_looselyComments]

That's it for the ETL.  In the next part I'll cover some other tasks I had to complete in order to get moved over onto BlogEngine.NET.

Just for fun I've added the Acronym Translation List for any newbies.

  • ETL - Extract, Transform, and Load.  Something that is generally used to refer to business intelligence data warehouses or other elaborate data processes.
  • PIA - Pain In the Ass.  Self descriptive.
  • IMHO - In My Humble Opinion.  Exactly what is written.
  • SQL - This isn't really an acronym, according to the original creators, it became an acronym, then un-became an acronym.  However, many people think that it means Standard Query Language, when it reality it just means Sequal.
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: Adron
Posted on: 9/19/2008 at 11:22 AM
Tags: , , , , , ,
Categories: How-To, Samples, and Such | IDEs, Software Tools, and Applications | My Projects
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (3) | Post RSSRSS comment feed