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

ReSharper Loves VAR too Much :: Tip o' The Day

So fix it.  Of course, one can have it set however they want, but I know many developers that hate being warned/told/suggested that all their explicit/implicit type declarations should be with var or vice versa.

So here is what you do, hit up the ReSharper menu and click on Options.  Then go find this set of options.  (Click for original image)

1 Find this option...

2 Set these settings...

3 They're about this far down...

Technorati Tags: ,

del.icio.us Tags: ,
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Posted by: Adron
Posted on: 8/16/2008 at 11:34 AM
Categories: IDEs, Software Tools, and Applications | How-To, Samples, and Such
Actions: E-mail | Kick it! | DZone it! | del.icio.us
Post Information: Permalink | Comments (0) | Post RSSRSS comment feed

Setting Sail with the Smuggling Pattern :: Part 1

Maybe because I'm often entertained by the geekiest of things, I've started usage of the Smuggling Pattern named after a fellow software architect Matt Davis's terminology of smuggling data into and out of Excel.  It is something that I've lately needed to do on a regular basis, get data into and out of Excel without Excel, or at least the evil COM Interop Model, really knowing what is going on.  In other words, I want total programmatic control over data so I can trust it versus Excel mangling my poor data up.  This is what the Smuggling Pattern is going to do for me, and it is doing it well.

Now you might think, "WTF!"  But just to clarify, the Smuggling Pattern is really the Builder Pattern that we architects know and love with a cooler more fun more pirate like name!  So with that, here's some of that code, and the TDD process I undertook to get this sucker built to set sail.

First I created a C# Class Project and created the following file folder structure and files.

Once I completed that I jumped right into testing.  Of course with ReSharper it makes life so much friggin simpler, in addition to TDD making life simpler.  I do still admit, that if you're not practiced at TDD, then doing tests in whatever order you are comfortable with still keeps you at peak performance.  But eventually you should work toward TDD and toss in a great tool like ReSharper.  The difference in speed and quality is almost like getting 2 of the 3 engineering axioms instead of just 1 (i.e. speed, quality, & cost).

The first tests I started on where the individual builder tests, or in my case the Smuggler Object.  I always create a check for null just to make sure that I named the file correctly, kind of a double check, and it gives me the attribute, category, and other parts that I can copy to the other tests easily.

using Production.Smugglers.Builders;
using NUnit.Framework;

namespace Production.Tests
{
    [TestFixture]
    public class SmugglerTests
    {
        [Test, Category("Builder Tests")]
        public void TestsSmugglerIsNotNull()
        {
            var smuggler = new Smuggler();
            Assert.IsNotNull(smuggler);
        }
    }
}

This test I ran and it proved that the smuggler does instantiate appropriately, albeit not doing a single useful thing yet.  Next test...

[Test, Category("Builder Tests")]
public void TestsSmugglerOrderCompletionResult()
{
    var smuggler = new Smuggler();
    smuggler.CompleteOrder();
    SmuggledClassForTest smuggled = smuggler.GetSmuggledSwag();
    Assert.AreEqual(smuggled.StuffTestValue, Resources.ValueForTestingSmugglerSmuggled);
}

Now this test, if you view the picture, didn't color code so well.  ReSharper points out that the instantiated class smuggler doesn't have a CompleteOrder or GetSmuggledSwag method.

image 2

Move the curser (and new character marker over the red method) and hit Alt+Enter (IntelliJ Keymapping) and select the Create method 'Smuggler.CompleteOrder'.

Now we have no more red, and the class Smuggler now has the method CompleteOrder.  The same code that is displayed in the image is directly below it so it can be copied and pasted easily.  Also note, I went ahead and added the IBuilder interface to the class since it will need to meet the contractual obligations of the builder interface.

namespace Production.Smugglers.Builders
{
    public class Smuggler : IBuilder
    {
        public void CompleteOrder()
        {
            throw new NotImplementedException();
        }
    }
}

I then wrote the following additional test, below is the additional test and the ones I already completed in total.

[TestFixture]
public class SmugglerTests
{
    [Test, Category("Builder Tests")]
    public void TestsSmugglerIsNotNull()
    {
        var smuggler = new Smuggler();
        Assert.IsNotNull(smuggler);
    }

    [Test, Category("Builder Tests")]
    public void TestsSmugglerSmuggledIsNotNull()
    {
        Smuggler smuggler = new Smuggler();
        smuggler.CompleteOrder();
        SmuggledClassForTest smuggled = smuggler.GetSmuggledSwag();
        Assert.IsNotNull(smuggled);
    }

    [Test, Category("Builder Tests")]
    public void TestsSmugglerOrderCompletionResult()
    {
        Smuggler smuggler = new Smuggler();
        smuggler.CompleteOrder();
        SmuggledClassForTest smuggled = smuggler.GetSmuggledSwag();
        Assert.AreEqual(smuggled.StuffTestValue, Properties.Resources.ValueForTestingSmugglerSmuggled);
    }
}

After that I went ahead and fleshed out the following classes to get the smuggler tests to green light.  First I stuck a resource variable in for my "test variable value".  One could do this another million ways but I figured this quick n' easy.

This resource file is located in the Properties of the project.

Find the resources by clicking the tab...

Then finished the interface (for now of course).

namespace Production.Smugglers.Builders
{
    public interface IBuilder
    {
        void CompleteOrder();
        SmuggledClassForTest GetSmuggledSwag();
    }
}

Then finished the Smuggler Class (i.e. Builder).

namespace Production.Smugglers.Builders
{
    public class Smuggler : IBuilder
    {
        private readonly SmuggledClassForTest smuggledClassForTest = new SmuggledClassForTest();

        public void CompleteOrder()
        {
            smuggledClassForTest.StuffTestValue = Resources.ValueForTestingSmugglerSmuggled;
        }

        public SmuggledClassForTest GetSmuggledSwag()
        {
            return smuggledClassForTest;
        }
    }
}

Then the little SmuggledClassForTests class, which is basically the product of the builder.

namespace Production.Smugglers.Smuggled
{
    public class SmuggledClassForTest
    {
        public string StuffTestValue { get; set; }
    }
}

Note the namespaces, I make a point to follow the standard of maintaining folder and namespace integrity.  I promise keeping the integrity makes getting to and finding code way faster than getting those things out of sync.

I then ran the tests again...

...green lights!

kick it on DotNetKicks.com

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList