Friday, December 16, 2016

ForgeSCMC using GIT on

There are many reasons I am excited to see git support on Below are a few notes on successfully using early versions of the ForgeSCMC tool.

The following scenario assumes you use a different git repository than as the primary development repository and that you need to push released code to as part of a contractual agreement.

My daily git client is Github for Desktop, and sometimes SourceTree.  I use ForgeSCMC only to push code to

Setting UP
There are several documents, the one you need to read is the "Git-Gerrit Users Guide.docx".  Pay special attention to the sections covering Git Developer and Git Reviewer role setup and the section "Assigning Source Code Permissions to Roles"

Quick Tips
Some of these tips are not fully tested, so your mileage may vary.

If you are a GitHub, GitLab, BitBucket, or VSTS user, your standard workflow will not work for pushing code to You will need to follow the Gerrit Workflow that is commit based and not branch based.

Create a single commit from a dev branch using
git merge --squash <featurebranch> 

Commits are a bit different than GitHub or VSTS.

git commit -m 'my message' //will not work using ForgeSCMC

git commit -a -m "my message" //works: notice the double quotes and the ammend command.

Amends are required because forge uses Gerrit as the code review tool.  Gerrit is commit based, wile VSTS and GitHub are branch based. I've read that the Google Gerrit team wants to remedy this but, but when they built Gerrit, the copied the workflow of their existing tool.

Keep both remote repositories in sync by add the repo as a remote using your primary git client. ForgeSCMC does not support the remote add command. This is a one time step

git add remote forge https://yourProjectUrlHere

Monday, April 4, 2016

Open Source With Scott Hanselman

I love watching Scott Hanselman present, (who doesn't.)  But I had a pretty busy schedule at Microsoft Build 2016 and chose to skip Scott's talk on Open Source.  I've been doing open source for a while and thought I'd get more value out of standing inline to get HoloLense tickets. (Might be my only chance to use a HoloLense for at least a year, probably two.)

When I saw the line  CRAZY MOB for HoloLense.  I went to hear Scott speak and IT WAS THE BEST TALK!  He even joked that he was overflow for HoloLense.

The talk was about open source, but leave it Scott to hit it from a completely different angle.  I hope they publish his talk, it was one that every developer should see!

Have some fun!  If you are doing forms over data all day and hate it. Try something else in your spare time like play with Arduino or Raspberry Pi (I was like, hey that's me.  I'm always playing with physical computing! Although I still enjoy my forms over data work.  It is a nice break from my managerial responsibilities.)

Helping Others:  Scott pointed out some sites for people just getting started and are willing to help new people and be kind about it.

Self Worth: Don't tie your self worth or value to the number of GitHub Stars your project has, or the number of projects you have contributed to.  Be proud of what you were able to accomplish. This area has always been easy for me.  I'm rather proud of my 600+ points on stack overflow.  I'm glad the minimal amount of work I've done has been able to impact so many people.  I have a few questions that have been viewed over ten-thousand times!  I do wish that I had started participating on Stack Overflow much earlier, I missed out on some fun. (Wait is that being hard on myself? Well a little motivating pain can be a good thing. )


Friday, March 18, 2016

Upgrading to Angular Component Router

I have a use case where I can benefit from upgrading to the 'new' component router in AngularJs 1.5. Below are my very quickly jotted down notes.

Wow! My app is so much faster after the upgrade!

I needed to have nested routes.  Basically a list of (different) things on the left nav.  When clicked, the correct controller and view need to show in the center of the page.
For HTML I'm using Bootstrap so the initial html is pretty easy, just a row with two columns (col-md-3, col-md-9)

My primary resource is the AngularJs docs .

I decided to NOT upgrade to html 5 routing mode.

I'm ripping out my old routing, although I'm not quite confident I need to do this.

  • I started by making my top nav an angular component. This is the top level of the component tree.
    • I pulled the top nav (html) out of the index.html and making a topNav.html template.
    • Then I basically copied the component example in the AngularJs docs. Kept this in my index.js file or the ng-app's first controller file.
    • changed the ng-href's into ng-links in the topNav.html
    • wired up all the immediate routes mentioned in the topNav
      • which leads to making components in all the other modules
      • I'm working them one at a time.
      • Read the docs carefully, if your routes have sub routes you have to include /... in your parent route definition.
  • Converting an existing controller over to a component.
    • follow the example in the docs
    • I'm using the syntax in the controller, I kept that but also added an extra line, might be unnecessary though
      • $ctrl = this
    • changed all my controllerAs syntax for ctrl to $ctrl in my HTML (had to do this.)
    • Another big gotcha was route parameters
      • required and optional, you will need to visit the AngularJs 2.0 docs for this. 
      • The biggest unexpected part is the syntax changes based on the route definition
        • if in the ng-link you have extra parameters (that are not in the route definition) they will show up as optional parameters in either ?foo=bar or ;foo=bar.
        • Usually the required parameters show up in the route like #/user/eric
    • $'id', is now
      •  this.$router.navigate(['MyThingRoute', { id: }]);
  • Navigating to a nested component from a home or other page.
    • <a ng-link="['UsersList','UserDetail',{userId:$}]">{{$}}</a>
      • This invokes the UsersList component, then the UserDetail component, and then the user id is added to the route auto-magically.

Thursday, May 7, 2015

Unit Testing Invalid Model State in a WebApi 2 Controller

I choose to do this operation in two different tests.
1. Test the controller behavior when the model state is invalid.  Do this by forcing the model state to invalid by adding an entry before the method is called.
2. Test the model state attributes independently from the controller.

For the controller Test

public void WhenModelStateIsInvalidDoNotSave()
  var mockRepo = new Mock<IProductRepo>();

  var ctrl = new ProductController(mockRepo.Object);
  ctrl.ModelState.AddModelError("SomeRandomProperty","SomeRandomProperty was not valid");

  var actual = ctrl.Post(new Product());

  Assert.IsInstanceOfType(actual, typeof(InvalidModelStateResult));

public IHttpActionResult Post([FromBody] Product model)
       return BadRequest(ModelState);
    return Ok();

Wednesday, March 25, 2015

AngularJs Style Guide

Simple but radical concept, have the tests right next to the code.  In server side code, I'm so used to separating tests into a separate project. On some projects I work on the tests need to be stripped out for the production build, even thought unit tests should be harmless, but not my call.  This can be done with the build scripts, if needed.

There are many other gems in this document, check it out.

Tuesday, March 10, 2015

Creating a self signed cert using makecert

"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\makecert.exe" ^
-n "CN=CARoot" ^
-r ^
-pe ^
-a sha512 ^
-len 4096 ^
-cy authority ^
-sv CARoot.pvk ^

"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\pvk2pfx.exe" ^
-pvk CARoot.pvk ^
-spc CARoot.cer ^
-pfx CARoot.pfx ^
-po Test123

Wednesday, March 4, 2015

My favorite quick data access tool is WebMatrix.Data.  It went through a name change, I'm posting it here so I don't forget it.