Dan's Green Shoes

Got my green shoes on!


4 Comments

Skype-based Guitar lessons

At the age of 36, I decided it was finally time to check off 1 item on my bucket list, learning the guitar. Fast forward 3 years later and learning the guitar has taken a back seat to family and career. It’s difficult to fit it all in. Though a lesson is typically only 30 minutes long, when you add the drive and parking, it can easily take 1 to 2 hours.

On a whim one day, I decided to search online for Skype-based guitar lessons. I found this CNET article about Lance Allen out of Nashville. I decided to shoot Lance an email and low and behold, we set up a 30 minute session once a week. The price for 30 minutes was exactly the same as the previous face to face lessons.

The day of the first lesson, I actually forgot. Fortunately, my calendar was set to remind me 5 minutes before the lesson. The beauty of Skype-based lessons is that I was able to quickly grab my guitar, point my face toward my camera on my laptop and wait for Lance to call me. Lance was very personable and the lesson went very well. The lesson only cost my day 30 minutes of time.

To my pleasant surprise, the lesson was very effective.

· Lance was able to tell my guitar was out of tune.

· During the lesson, Lance uses Skype’s instant messages to write down instructions, tabs, notes etc. This makes it very easy to copy and paste and save for later.

· Price is comparable to face to face lessons.

· The camera is able to work around personal space issues. Lance can point the camera to various angles that really enhance the learning experience.

I highly recommend giving Skype-based guitar lessons a try.

clip_image010_thumb.jpg


4 Comments

SignalR with Silverlight 5

SignalR is truly an amazing API. It’s ridiculously easy to use. The majority of SignalR client examples that I see on the web are for HTML/JS or WPF. There are examples for Silverlight but for older version of SignalR and Silverlight. What I was hoping to find was a step by step example using VS2k12, SL5 and latest greatest Nuget Packages. Since I could not find one, I thought I would create one and share. This step by step was highly inspired by the samples found here:

https://github.com/SignalR/SignalR/tree/master/samples

Setting up the Solution

Recommend you download the code and follow along. In Visual Studio 2012, create a new Silverlight 5 application called “SilverlightClientSignalR” as seen below. Continue reading


5 Comments

HTML JavaScript Data Grids

Line-of-Business applications tend to have data grids and ProModel products are no exception.  Our users have come to expect some rich behaviors that are not inherit in your basic HTML table element.  ProModel recently ranked the most popular HTML/JavaScript data grids out there right now.  Below you will find our summary.  Please note that many “Yes” and/or “No” values are hyperlinks into an example if we could find one.

We chose jxqGrid.  If you see a data grid we missed, please let me know which one.

Feature Rankings

Got To Have It Features

  1. Sorting
  2. Inline Editing
  3. Column Resizing
  4. Cell Selection
  5. Cell copy/paste
  6. Range copy/paste “Update”
GRID Sorting Inline Editing Column Resizing Cell Selection Cell copy/paste Range copy/paste
jqxGrid Yes Yes Yes Yes Yes Yes
jqGrid Yes Yes   (but not great) Yes No No No
SlickGrid Yes Yes   (but not great) Yes Yes Yes Yes
ParameterQuery Yes Yes (but not great) Yes Yes No No
Handontable Yes Yes Yes (but buggy) Yes Yes Yes
wijmo (ComponentOne) Yes Yes Yes Yes No No
KendoUI (Telerik) Yes Partial Yes Yes No No
koGrid Yes No Yes No No No
dhtmlxGrid Yes Yes Yes Yes No No
jTable Yes No Yes No No No
Sencha Ext JS Yes Yes Yes Partial No No
IgniteUI (Infragistics) Yes Partial Yes Yes No No
Syncfusion Yes Yes Yes No No No
WebGrid (Intersoft Solutions) Yes Yes Yes Yes No No

Love It Features

  1. Row Selection
  2. Filtering
  3. Flood Fill
  4. Virtualizing
  5. Range copy/paste “Adds”
  6. Knockout/Data Integration
GRID Row Selection Filtering Flood Fill Virtualizing Knockout/Data   Integration
jqxGrid Yes Yes No Partial Can   bind to pretty much anything..   Can   use KO as well
jqGrid Yes Yes   – Search No Yes MVC
SlickGrid No Yes – Search Yes Yes Seems to be kinda   “hard-wired”
ParameterQuery Yes Yes – Search No Yes Doesn’t   support KO
Handontable No No Yes No Not   sure about KO
wijmo   (ComponentOne) Yes Yes –   Filter Row No No Seems   you can use KO
KendoUI (Telerik) Yes Yes No Yes They   kinda have their own framework and server wrappers
koGrid Yes No No No Seems   you can use KO
dhtmlxGrid Yes Yes   – Search No Yes Doesn’t   support KO
jTable Yes Yes – Search No No Not   sure about KO
Sencha Ext JS Yes Yes No Yes Not   sure about KO
IgniteUI (Infragistics) Yes Yes No Yes KO   support
Syncfusion Yes Yes No Yes Not   sure about KO
WebGrid (Intersoft Solutions) Yes Yes No Yes Not   sure about KO

Like It Features

  1. Moving Rows
  2. Frozen Columns
  3. Col Selection
  4. Grouping
  5. Merged Column Headers
  6. Direct Breeze.js integration
  7. Column Reorder
GRID Frozen Columns Grouping Merged Column   Headers Column Reorder Excel Like Direct Breeze.js   integration
jqxGrid Yes Yes No Yes Yes No (refer to   notes for further links)
jqGrid Yes Yes   – but not user Yes Yes No No
SlickGrid No No No Yes Partial No
ParameterQuery Yes No Yes No No No
Handontable No No No Yes (but buggy) Yes No
wijmo   (ComponentOne) No Yes Yes Yes No No
KendoUI (Telerik) No No No Yes No Yes,   but a hack
koGrid No Yes No Yes No No
dhtmlxGrid Yes No No Yes No No
jTable No No No No No No
Sencha Ext JS Yes Yes   – (but buggy) Yes Yes No No
IgniteUI (Infragistics) No Yes Yes Yes No No
Syncfusion Yes Yes Yes Yes No No
WebGrid (Intersoft Solutions) Yes Yes Yes Yes No No


2 Comments

Calling into your database on Silverlight Application_Exit

My team has developed several Line of Business applications using Silverlight.  Most but not all have at least 3 if not all of the following feature requests:

  • Allow users to be signed into the LOB more than once. Users like having more than 1 browser tab or even more than 1 browser type with the LOB app loaded simultaneously.
  • Ability to differentiate between a user in Tab1 versus Tab2 for purposes of concurrency, etc.
  • Limit the number of simultaneous sessions a specific user can have. 1 is a valid constraint.
  • Automatically log out a user instance after X seconds a.k.a session time out
  • Gather user information such as browser type/version, screen resolution, IP, etc
  • # of concurrent distinct users logged in over time.
  • # of concurrent users logged in over time total.
  • Max or average simultaneous sessions by users.

All of these are good feature requests for any Line of Business Application. Thinking through it, these features share an implementation detail that requires the LOB to track each signed in user instance.

Implementation Plan

Here was the plan.

  1. Create a new database table called AppInstance. This table will contain a list of all the active users in the system.
  2. Create a new database table called ArchivedAppInstance. This table contains all previously logged in users.
  3. Whenever a user logs in, add a row to the AppInstance table that records the UserId, timestamp of when that user logged in and any other information your LOB might want to know.
  4. Whenever a user logs out, archive the #3 AppInstance row to ArchivedAppInstance table noting the logged out timestamp.

The information in these 2 new tables enable the implementation of the features above. Conceptually this is very simple. In fact, 1 through 3 above are easy. #4 it turns out, in Silverlight was not as straight forward as one might think. Why? First, there are multiple ways the application can be exited such as clicking the LOB “Log Out” button, closing the browser directly, navigating away from the LOB web page or, heaven forbid, a browser crash. Except for crashing, the Silverlight application’s Exit event is raised but if you try to perform some backend action like calling a web service it won’t go through since the thread required to make the service call itself is gone.

I worked on a team to solve this. My colleague Tammy McClellan recently documented our approach for other product owners internally and I thought I would share on my blog. In addition, Tammy created an extremely small and simple sample application with our implementation. You can find the code here.

Continue reading


1 Comment

Using your “User” table with MVC4 Internet Template

The MVC4 Internet template assumes that it will be adding a user table called “UserProfile” to your database.  What I think a high percentage of developers would want is to use their domain model’s “user” entity and have SimpleMembership just manage the passwords.  In this blog post I will demonstrate how I did this and welcome alternative suggestions.
I recommend you first understand the authentication process provided by the MVC 4 Internet template.  There are 2 fantastic posts you should read first.

  1. MVC 4 Authentication
  2. SimpleMembership, Membership Providers, Universal Providers and the new ASP.NET 4.5 Web Forms and ASP.NET MVC 4 templates

In addition, please check out Scott Allen’s excellent Pluralsight course called “Building Applications with ASP.NET MVC 4”.

MVC 4 Internet Template with pre-existing Domain Model

Create a new ASP.NET MVC 4 Internet Application and name it “SimpleMemberExample”

image

Custom Domain Model/Database

The first thing I want to do is create the custom domain model/database.  In the “Model” directory, lets add a class that represents our custom “User” table.  Lets call this custom user entity “Administrator” as seen here:

namespace SimpleMembershipExample.Models
{
    public class Administrator
    {
        public Administrator(){}
        #region Fields and Properties
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        #endregion
    }
}

(I was unable to figure out how my user table’s unique identifier could use a Guid.  I think the unique identifier of your custom user entity/table must be an int to use SimpleMembership.  anyone know?)

Lets add a custom DbContext as shown here to the root of the project.

using System.Data.Entity;
using SimpleMembershipExample.Models;

namespace SimpleMembershipExample
{
    public class SomeAppDbContext: DbContext
    {
        public SomeAppDbContext(): base(nameOrConnectionString: "SomeAppName"){}
        public DbSet<Administrator> Administrators { get; set; }
    }
}

The DbContext only contains a single table called Administrators just to keep this super duper easy.  Yours would contain lots more. Notice in the custom constructor, I am telling the DbContext to use a specific connection string.  Lets add that connection string to the Web.Config.

image

This connection string could be anything you want it to be.

Just for demo purposes, I am naming the database “SomeAppName”.  As a final step, in “Global.asax.cs”, put the following code:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        SomeAppDbContext dbcontext = new SomeAppDbContext();
        dbcontext.Administrators.All(i => i.Name != "Dan");

Running the application, the magical EF Code First will create the following database.  We have a custom database with a custom user table called “Administrators”.

image

Customizing MVC 4 Internet Template

Remove InitializeSimpleMembershipAttribute

The Internet template contains an Action filter called “InitializeSimpleMembershipAttribute”.  I deleted that class and removed any references to it.

Replace UserProfile with your Custom User Entity

The Internet template assumes that it will be adding a user table called “UserProfile” to your database.  What I think a high percentage of developers would want is to use their domain model’s “user” entity and have SimpleMembership just manage the passwords.  Let me demonstrate how to do this.

In the “Model” folder, in the “AccountModel.cs” file, delete the “UserProfile” class.  We want to use our “Administrator” entity instead.  Wherever UserProfile is referenced elsewhere, replace with Administrator.   The original UserProfile had properties called “UserName” and “UserId”.  Administrator has properties “Name” and “Id”.  Make sure to sync those properties up.

I want to have only 1 DbContext and I want to use my DbContext.  In the “Model” folder, in the “AccountModel.cs” file, delete the “UsersContext” class.  Wherever UsersContext is referenced elsewhere, replace with SomeAppDbContext.

Call WebSecurity.InitializeDatabaseConnection

As a final step, in “Global.asax.cs”, put the following code:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        SomeAppDbContext dbcontext = new SomeAppDbContext();
        dbcontext.Administrators.All(i => i.Name != "Dan");
        WebSecurity.InitializeDatabaseConnection("SomeAppName", 
            "Administrators", "Id", "Name", autoCreateTables: true);

WebSecurity.InitializeDatabaseConnection takes the web.config connection string name, the name of your custom user table (“Administrators”), the unique identifier field name of your user table (“Id”) and the user name field.  Running the InitializeDatabaseConnection method does several things:

  1. Initializes the static Roles and WebSecurity classes.
  2. Adds the following tables to your database: webpages_Membership, webpages_OAuthMembership, webpages_Roles, webpages_UsersInRoles, UserProfile.

Running the Internet Application

When you run the code with those changes, the following database is created:

image

The home screen looks like this:

image

Click on the Register link in the upper right.

image

Fill out the form and click the “Register” button.  The MVC 4 Internet template application will navigate you back to the home page.

image

Notice it knows the name you registered with.  If you check for cookies, you will see the typical ASPXAUTH as shown below.

image

If you click the “Log off” link and check cookies, the ASPXAUTH cookie disappears.  The ASPXAUTH cookie is the key to the authentication.

When you look at the database you will see the following:

image

Notice with the code changes, the MVC Internet template knew to save to the custom user table “Administrators”.  The password was saved to the webpages_Membership table with a foreign key relationship to the Administrators table.

Please download the code here.


Leave a comment

ProModel Harlem Shake

I just had to share this.  Aaron Nelson heads up ProModel’s support group.  He has a great sense of humor and does a great job.

Aaron produced this video that shows a simulation model of various ProModel employees doing the Harlem Shake.  Please take note that the model is even capturing stats and shows reports at the end of the video.

Simulating the Harlem Shake

If you are unfamiliar with the Harlem Shake Internet meme, please check this out.

Follow

Get every new post delivered to your Inbox.

Join 447 other followers