Thursday, September 25, 2014

Forms Authentication Sliding Expiration and the SPA

Working on a SPA with Forms Sliding expiration.  The trick is how to let the SPA know the user has timed out.  If you make a call to the server, with sliding expiration enabled... the account will never expire.

I don't have a working solution yet, but thought I would post the observation.

Tuesday, September 23, 2014

TF-Git

Testing out TF-Git.  The tools for peer review are more robust in the git ecosystem than in TFS.  The workflow seems reasonable so far.  
 
https://gittf.codeplex.com/


Gitlab - Permissions and Groups

When setting up GitLab, before you start using it, be sure to set up a project group.  If this step is omitted, all projects are created under a user account and only that user can check in code. 

I have seen this issue three times now, so I thought I should post this.  This is unique to GitLab and there is not a visible analog in Stash or GitHub.

Tuesday, September 16, 2014

Do not use RequireJs and AngularJs

Do not use RequireJs with AngularJs.  It is premature optimization.  I have read many posts where they show how to use requireJs.  I have not seen one post that has empirical data PROOVING that using RequireJs improves the overall user experience in any significant way.

I suggest mastering alternative strategies for ng-repeat if you want to optimize something.

I spent a year and a half writing 25,000 lines of AngularJs code with no problems! We were bad developers and did not even minify and consolidating our JavaScript. The JavaScript was in ~30 different files. (We wanted to min and consolidate but the usual tools were not allowed in our secure and constrained environment.)

Most of the noise about using RequireJs is theoretical. I have yet to read a post where a team could not satisfy performance requirements established by the business using AngularJs and had to refactor to using RequireJs for lazy loading.

If the wire is your worry...

  • consolidate your JavaScript into one file,
  • minimizing that file,
  • compress files across the wire
In most AngularJs apps the images are probably larger than the JavaScript.


Even Brian Ford recommends not using RequireJs with AngularJs. http://briantford.com/blog/huuuuuge-angular-apps

I would like to post more on the mechanics of AngularJs and why I feel this way, but time is short today.

Thursday, August 28, 2014

Integration testing services with Jasmine 2.0


Testing real services using jQuery and Jasmine took some research. I saw in the docs that I needed to work with done(), but where?  The code below works.

Saturday, April 26, 2014

Optimizing Pagination with MemoryCache

In web development pagination is fairly straight forward when using out of the box components. When building custom components on expensive queries, paging is not quick to implement.

The query I needed to implement paging against was an expensive query.  After fighting and fighting, I thought why not slam the whole thing in MemCached and page against the query.  Felt kinda weird about it.  After all this would have been a major fail 10 years ago.  Then listened to Rob Conery on DotNetRocks.  In Robs new project Biggy, he stuffs the whole database in memory using ICollectionOf<T>.  Feeling validated, started down the memory path.

I was not quite ready to use Biggy, but MemCached is appropriate.  MemCached was not setup.  Then found the MemoryCache class in .NET.  There is more than one version.  One for web and one for console apps.  Nice! I mainly wanted to use MemoryCache for the expiration policies.

The performance is significantly faster than the expensive sql queries.  Creating pagination across the collection is very easy using linq.

It has been so easy to code against, I've created a few filters; light search, return only certain fields, or exclude certain fields.

Disclaimer: There is a very good reason why I'm not using an ORM or a document database that does not have this baked in.


Friday, March 14, 2014

Verify Times Once

My first WebApi controller test is usually Verify Times Once as show below.

Repo.Verify(x=>x.GetUser(It.IsAny<string>()),Times.Once);


A new member of the team questioned the value of the test. I agreed it was probably more ceremony than a realistic possible regression.
Later in the day I saw the following property in a class.

 public static IFooRepo Repo { get { return _repo ?? (_repo = new FooRepo()); } } 

The code above is tightly coupled.  I prefer loose coupling.  The property is doing the work of the constructor (assuming we are using constructor injection.)  Changing the property from static to a regular class property allows the developer to override the hard coded FooRepo with a mock repo object derived from the IFooRepo interface providing support for testing other methods.  I think we still have a problem with this pattern.  Given a class with more that one property, how will the developer know which properties need setting and which to leave alone? The developer never needs to guess what properties need to be set when the class uses constructor injection.

It might feel like ceremony to perform an obvious test like Verify Times Once, but it ensures loosely coupled code that supports future TDD style tests.