<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nick Berardi]]></title><description><![CDATA[Sr. Manager at @Amazon Alexa, Entrepreneur, former Microsoft MVP, former ASPInsider, and Father of 3 Girls. My opinions are my own and no one else’s.]]></description><link>http://nickberardi.com/</link><generator>Ghost 0.5</generator><lastBuildDate>Wed, 18 Feb 2026 03:41:24 GMT</lastBuildDate><atom:link href="http://nickberardi.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[New Job]]></title><description><![CDATA[<p>Well the title pretty much tells you everything you need to know about the direction of this blog post, if that doesn't interest you then stop reading now!</p>

<p>I have loved the Philadelphia region since I took my first interview trip down here in May of 2003, right after I graduated from Penn State. And I never thought I would be leaving, but 11 years after that first interview trip back in 2003 I found myself facing a very difficult decision. </p>

<p>Philadelphia has given so much to me, I received my first professional job here, met my wife here, bought my first house here, had my two kids here, bought my second house here, received my Microsoft MVP here, had tons of support from friends, family, and especially professional support from Bill Wolff and everybody at PhillyDotNet. Given these roots I had put down, and the great admiration I have for the city, the people, and the friends I have made here. The job just proved to alluring to pass up.</p>

<p>At this point in this post you are probably saying "stop babbling and tell us what the job is." Well the job that I am going to be taking on and moving to Seattle to pursue is a job with Amazon.com as a Software Development Manager in charge of the Windows and Mac Desktop applications for <a href="https://www.amazon.com/clouddrive">Amazon Cloud Drive</a>.</p>

<p><img src="http://nickberardi.com/content/images/2014/Jul/amazon_cloud_drive_logo.gif" alt="Amazon Cloud Drive"></p>

<p>If you don't know what the Amazon Cloud Drive is, it can best be described as a hard drive in the cloud that allows users to enjoy, save and share their most cherished digital assets. It is in the same class of applications as Dropbox, Microsoft OneDrive, Google Drive, or the recently announced Apple iCloud Drive. It is currently a very hot area of tech to be in right now.</p>

<p>To me the most alluring part of this wasn't working at Amazon.com, it was working on a product that operated at the scale of Amazon, and will reach millions of users across all their devices, Kindle, Fire TV, Fire Phone, iPhone, iPad, Android, Mac, and Windows desktops. </p>

<p>Me finding and then getting this job, is essentially like finding my personal Holy Grail. It is an exciting time, with an exciting opportunity to create an application that will help millions of users around the world share their most presious pictures with their loved ones, access there music collection from any computer, and even share a file or two with anybody they want.</p>

<p>It is also going to be a crazy time, because I have to move 2 young kids, 2 cats, and my wife to Seattle. Buy a new house, try to sell my current houses in Philly, and make sure this all goes off as smoothly as possible while starting a new job. </p>

<p>If the next time you see me and all my hair has turned grey and fallen out you will know why.</p>

<p><strong><em>Note:</em></strong> Any helpful tips about Seattle and the best place to live are going to be greatly appreciated by me and my family. Assuming the market price is reasonable of course.</p>]]></description><link>http://nickberardi.com/new-job/</link><guid isPermaLink="false">0d1361af-8430-4e15-adfa-2418b8c58881</guid><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Fri, 18 Jul 2014 11:52:55 GMT</pubDate></item><item><title><![CDATA[Caddio Sport Techie Writeup]]></title><description><![CDATA[<p><img src="http://nickberardi.com/content/images/2014/May/login.png" alt="Caddio Login Screen" style="float: right" width="30%"> Many of you probably don't know this, but I have been working on a golf related app called <a href="http://caddio.com/">Caddio</a>, off and on for more than a year. The app is finally to a point where it is starting to pay off, because it is starting to receive the recognition and accolaids that every developer hopes for.</p>

<p>The <a href="http://www.sporttechie.com/2014/05/22/caddio-app-provides-crowdsourced-knowledge-of-golf-courses/">latest article about Caddio is a writeup from SportTechie</a>, and my favorite quote from the and music to my ears is this paragraph I pulled from the article:</p>

<blockquote>
  <p>Though just developed, the Caddio app has revolutionized the golf game for aspiring and novice golfers. By allowing golfers to take on each course with the power of crowdsourced knowledge a valuable digital community has been created that will continue to gain accuracy and legitimacy as more golfers contribute to the platform.</p>
</blockquote>

<p>If you are a golfer or just an enthusiest, and want to <a href="http://caddio.com/appstore">check Caddio out</a>, you can download the app by <a href="https://itunes.apple.com/us/app/caddio/id788299361">visiting the Apple App Store</a>. If you are an Android user, be on the look out for the app this summer in the Google Play and Amazon App stores.</p>

<p>If interested here are a couple more screenshots:</p>

<p><img src="http://nickberardi.com/content/images/2014/May/tip.png" alt="Caddio Tip Screen" width="32%" style="display:inline"> <img src="http://nickberardi.com/content/images/2014/May/course_screen.png" alt="Caddio Course Screen" width="32%" style="display:inline"> <img src="http://nickberardi.com/content/images/2014/May/user_profile.png" alt="Caddio User Profile Screen" width="32%" style="display:inline"></p>]]></description><link>http://nickberardi.com/caddio-sport-techie-writeup/</link><guid isPermaLink="false">0b6c852e-d883-4836-9b7a-5a8fb0d6cbef</guid><category><![CDATA[Caddio]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Fri, 23 May 2014 13:21:18 GMT</pubDate></item><item><title><![CDATA[A .NET Build Server Without Visual Studio]]></title><description><![CDATA[<blockquote>
  <p><strong>Update:</strong> Phil Haack has started a <a href="http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/5786689-support-net-builds-without-requiring-visual-studi">petition to get the steps I outlined below into an easy installer</a>. Please support it with your votes. </p>
</blockquote>

<p>Over the past week I have read a couple articles about the pain of "headless" build servers in .NET. First from <a href="http://blog.maartenballiauw.be/post/2014/04/11/Building-NET-projects-is-a-world-of-pain-and-heres-how-we-should-solve-it.aspx">Maarten Balliauw</a> and then from <a href="http://haacked.com/archive/2014/04/15/nuget-build-dependencies/">Phil Haack</a> both of them had suggestions about how to accomplish setting up a build server without installing Visual Studio. But their suggestions were more of a long term problem that could be fixed with NuGet and required much work from Microsoft and the community. </p>

<p>I agree and fully support their long term goals, but I want to give you some short term solutions that I have found to work today if you don't like installing Visual Studio on your build server.</p>

<blockquote>
  <p><strong>Note:</strong> This won't solve all build problems, but it solves many of the build problems I had with building PCL (Portable Class Libraries) on a build server.</p>
</blockquote>

<p>The <strong>first step</strong>, and this one you can't really get around is that you need to install the .NET frameworks you care about.  </p>

<p>The <strong>second step</strong> is to install some "necessary" preliminary tools. (I don't know if these are actually required given the steps below, but if anybody wants to skip over this step when giving this method a shot, I would appreciate the thumbs up or down on this step.)</p>

<ul>
<li><a href="http://www.microsoft.com/en-us/download/details.aspx?id=40760">MSBuild Tools 2013</a></li>
<li><a href="http://visualstudiogallery.msdn.microsoft.com/b0e0b5e9-e138-410b-ad10-00cb3caf4981/">Portable Class Library Tools 2</a> <em>make sure to use the <strong>/buildmachine</strong> command when installing</em></li>
<li><strong>Update:</strong> <a href="http://www.microsoft.com/en-us/download/details.aspx?id=40772">.NET Framework Developer Pack</a> (thanks to (Eric Williams)[https://twitter.com/MotoWilliams] for this)</li>
</ul>

<blockquote>
  <p>One thing that I have seen recommended by others is the <a href="http://www.microsoft.com/en-us/download/details.aspx?id=40727">Portal Class Library Reference Assemblies</a> don't bother with this. I can't tell you how pointless this installer is. It actually "installs", and I use that term loosely, a zip file in your programs directory. Yes you read that right, Microsoft makes you download an installer for a zip file that they don't even both unzipping.  <strong>Tip for Microsoft</strong> just provide the zip file and save developers a bunch of steps.</p>
</blockquote>

<p>The <strong>third step</strong> and the key to getting everything to build the same on the build server as your local machine is this very simple step. Copy the following directories from your <em>development</em> machine to your <em>build</em> server perserving the directory location:</p>

<ul>
<li>C:\Program Files (x86)\MSBuild</li>
<li>C:\Program Files (x86)\Reference Assemblies</li>
</ul>

<p><img src="http://nickberardi.com/content/images/2014/Apr/copy_directories.png" alt="Copy Directories"></p>

<blockquote>
  <p><strong>Note:</strong> I prefer to zip up the directories prior to copying them to the build server, because it makes the process faster and less error prone. Then when they are on my build server, I just unzip the directories into the correct path.</p>
</blockquote>

<h2 id="conclusion">Conclusion</h2>

<p>Between those two directories <strong>MSBuild</strong> and <strong>Reference Assemblies</strong> you have most everything you need to complete any build that Visual Studio can do by it self. And the above steps while simple, but not obvious, provide a nice clean build server that doesn't require Visual Studio to opperate. </p>

<p>The only issue with this method is that, once and a while, usually after a new SDK version is released, you will have to re-do <em>step three</em> to make sure your build and development environments are in sync. </p>

<p>Hopefully the detailed explaination of a path forward that Phil provided will make the above steps unnessisary in the future.</p>]]></description><link>http://nickberardi.com/a-net-build-server-without-visual-studio/</link><guid isPermaLink="false">f6f8d950-d1e5-4b27-9874-dead3b569ef5</guid><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Wed, 16 Apr 2014 13:47:13 GMT</pubDate></item><item><title><![CDATA[Consensus: Bringing it all together]]></title><description><![CDATA[<blockquote>
  <p>This post has been a long time in the making. Actually that is sort of a lie, I completely forgot that I promised a 4 part series until my friend <a href="https://twitter.com/jongalloway">Jon Galloway</a> decided to mention <em>consensus</em> in his BUILD 2014 presentation.</p>
</blockquote>

<p>As part of my 4 part series in creating the app I described in my prior posts, I am going to be creating an online planning poker application for distributed teams using AngularJS, SignalR, and TypeScript. In case you missed the prior posts in the series here they are:</p>

<ol>
<li><a href="http://nickberardi.com/signalr-and-typescript/">SignalR + TypeScript</a>  </li>
<li><a href="http://nickberardi.com/angularjs-and-typescript/">AngularJS + TypeScript</a>  </li>
<li><a href="http://nickberardi.com/signalr-and-angularjs/">SignalR + AngularJS</a></li>
</ol>

<p>As we saw with <strong>SignalR + TypeScript</strong> it is rather trivial to define the interfaces for the SignalR client in TypeScript, and by doing this it makes sure that your JavaScript code never suffers from the development angst that happens when as action methods change in your SignalR hub.</p>

<p>Then we saw that <strong>AngularJS + TypeScript</strong> was even more straight forward than <em>SignalR + TypeScript</em> because you didn't have to define and keep in sync an interface that represented your server infrastruture. The only interface you had to define was the <code>$scope</code> interface that was inherited from <code>ng.IScope</code>. All the other code was pretty much straight AngularJS both for the HTML template and the TypeScript code.</p>

<p>After putting everything we learned in to practice, combining <strong>SignalR + AngularJS</strong> was just a matter of wiring what we had already learned about in <em>SignalR + TypeScript</em> and <em>AngularJS + TypeScript</em> together.</p>

<h2 id="singalrangularjstypescript">SingalR + AngularJS + TypeScript</h2>

<p>You can imagin we have already done most of the leg work here, so combining all three together should be pretty straight forward at this point. The full source of the TypeScript <a href="https://github.com/nberardi/consensus/blob/master/src/Consensus/Scripts/consensus.pokerRoom.ts">can be found here</a> but a good example of what we are dealing with is the <code>joinRoom</code> method in the TypeScript code, it combines everything we have been talking about pretty concisely.</p>

<pre><code class="csharp">private joinRoom(room: PokerRoom = this.room) : JQueryPromise {  
    this.$location.path("/rooms/" + encodeURIComponent(room.Name));

    var that = this;
    return this._poker.server.joinRoom(room).done(function (data) {
        that.$scope.room = data;

        var me = that.me;
        data.Cards.forEach(function (card) {
            if (card.User.Email === me.Email)
                that.$scope.myCard = card;
        });

        that.$scope.$apply();
    });
}
</code></pre>

<h2 id="conclusion">Conclusion</h2>

<p>Hopefully you have learned as much as I have from creating this app. I came into this fully expecting that bringing together TypeScript, AngularJS, and SignalR would be a nightmare. But after diving in, I found the experience quite a bit easier and less frustrating than I expected it to be. </p>

<p>Here is what the app looks like running in a couple browsers.</p>

<p><img src="http://nickberardi.com/content/images/2014/Apr/screenshots.png" alt="screenshot of the app running in 2 browsers"></p>

<p>If you want to explore and play with this web app yourself you can visit <a href="http://consensus.azurewebsites.net/">consensus.azurewebsites.net</a> or if you perfer to download and run the code yourself, you can find it here for your forking needs <a href="https://github.com/nberardi/consensus">github.com/nberardi/consensus</a>.</p>

<p>Best of luck! Contact me with questions.</p>]]></description><link>http://nickberardi.com/consensus-bringing-it-all-together/</link><guid isPermaLink="false">b8e9b377-0132-4f64-9e70-4d8dcc335765</guid><category><![CDATA[Consensus]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Wed, 02 Apr 2014 20:46:32 GMT</pubDate></item><item><title><![CDATA[Embeding Executify Scripts]]></title><description><![CDATA[<p>Recently I have been working on a reincarnation of <a href="http://executify.com/">Executify</a> and one of the new features is the ability to embed your scripts in your blog or any web page.</p>

<iframe src="http://executify.com/16/embed/" height="300" width="100%" allowfullscreen="true" frameborder="0"></iframe>

<p><em>Note: to run the code click the <strong>Results</strong> tab</em></p>

<p>Tell me what you think, and what needs to be improved upon.  I am completely open to suggestions about this new feature.</p>

<p><strong>Update:</strong> Just a couple of questions regarding the embedded view:  </p>

<ul>  
<li>Should I allow the code to stay editable so that people can play with it when embedded or should it be static.</li>  
<li>Is the header tab bar too pronounced?</li>  
<li>Would it be better if I hit it under they hovered over the code?</li>  
</ul>]]></description><link>http://nickberardi.com/embeding-executify-scripts/</link><guid isPermaLink="false">87e8beff-4117-44e9-b86f-39b68cf134a3</guid><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Thu, 08 Aug 2013 12:13:20 GMT</pubDate></item><item><title><![CDATA[Consensus: SignalR + AngularJS]]></title><description><![CDATA[<p>As part of my 4 part series in creating <a href="http://coderjournal.com/2013/07/planning-poker-project/">the app I described in my prior post</a>, I am going to be creating an online planning poker application for distributed teams using AngularJS, SignalR, and TypeScript. In case you missed the prior posts in the series here they are:  </p>

<ol>  
    <li><a href="http://coderjournal.com/2013/07/signalr-and-typescript/">SignalR + TypeScript</a></li>
    <li><a href="http://coderjournal.com/2013/07/angularjs-and-typescript/">AngularJS + TypeScript</a></li>
</ol>

<p>As we have seen in the prior posts when working with TypeScript is that most of the work is around strongly typing the already defined contracts in SignalR and AngularJS. However a part of the integration we haven't yet discussed is how SignalR and AngularJS play together, and as we are about to see they play together rather nicely.</p>

<p>From the last post you were given the following example of an AngularJS controller, and in this post we are going to expand that controller to include SignalR support.  </p>

<pre class="brush:javascript">var app = angular.module("consensus", []);  
app.controller("PokerRoomCtrl", function ($scope) {  
    $scope.allCardsShowing = false;

    $scope.showAllCards = function (show) {
        $scope.allCardsShowing = show;
    };
});</pre>

<p><em>To limit the footprint of our example, I have eliminated everything except the show all cards feature. Don't worry the full app will be brought together in full functionality next post, this is just to further the goal of looking at how AngularJS and SignalR can work together.</em></p>

<p>Given the above code the first thing that we need to do to implement SignalR is to instantiate our proxy in the controller.  </p>

<pre class="brush:javascript">var poker = $.connection.poker;</pre>

<p>Nothing to it, standard SignalR.  Now comes the integration with SignalR, in our example from above the <code>showAllCards</code> function hanging off the controller's <code>$scope</code> needs to send an indicator to our SignalR server.  The purpose of this indicator is to allow the team lead to send an indication, in the form of a boolean value, to every-bodies browsers telling them to show the cards.</p>

<pre class="brush:javascript">$scope.showAllCards = function (show) {  
    poker.server.showAllCards(show);
};</pre>

<p>In the above code instead of just showing the local cards like the original example from above, we are sending the value of the <code>show</code> variable to the SignalR server to be broadcast to every participant in the room.  To receive this broadcasted message we need to hook up our client method to change the <code>$scope.allCardsShowing</code> variable.</p>

<pre class="brush:javascript">poker.client.showAllCards = function (show) {  
    $scope.allCardsShowing = show;
    $scope.$apply();
};</pre>

<p>The above method receives the message sent from the SignalR server, on all the team members browsers, and changes the <code>$scope.allCardsShowing</code> variable to the value passed from the server.  The only different from this method and the original version, from above, is the use of <code>$scope.$apply();</code>.  <code>$scope.$apply();</code> needs to be called to trigger a context refresh of the AngularJS <code>$scope</code> since the call originated from SignalR which is outside of AngularJS.</p>

<p>After we put everything together, our original example has only slightly changed to accommodate SignalR.  </p>

<pre class="brush:javascript">var app = angular.module("consensus", []);  
app.controller("PokerRoomCtrl", function ($scope) {  
    var poker = $.connection.poker;

    $scope.allCardsShowing = false;

    poker.client.showAllCards = function (show) {
        $scope.allCardsShowing = show;
        $scope.$apply();
    };

    $scope.showAllCards = function (show) {
        poker.server.showAllCards(show);
    };
});</pre>

<p>We now have AngularJS events that will broadcast intentions out to every browser that is participating in the room.  In the next post I will bring AngularJS, SignalR, and TypeScript together to show the final application.  </p>

<h3>Conclusion</h3>  

<p>As you can see getting AngularJS and SignalR working together is a lot more straight forward than any other combination we have looked at so far.</p>

<p>There is no source code to post this time, everything will be brought together in the final 2 posts in the series, and the full project will be available for viewing on GitHub.</p>

<ol>  
    <li><a href="http://nickberardi.com/consensus-bringing-it-all-together/">Bringing it all together</a></li>
</ol>]]></description><link>http://nickberardi.com/signalr-and-angularjs/</link><guid isPermaLink="false">35c53b6e-1a10-44f9-9086-ae90d78feb67</guid><category><![CDATA[Consensus]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Tue, 23 Jul 2013 14:41:22 GMT</pubDate></item><item><title><![CDATA[Consensus: AngularJS + TypeScript]]></title><description><![CDATA[<p>As part of my 4 part series in creating <a href="http://coderjournal.com/2013/07/planning-poker-project/">the app I described in my prior post</a>, I am going to be creating an online planning poker application for distributed teams using AngularJS, SignalR, and TypeScript. In case you missed the post that started off this series here it is:  </p>

<ol>  
    <li><a href="http://coderjournal.com/2013/07/signalr-and-typescript/">SignalR + TypeScript</a></li>
</ol>  

<p>In this second post, I am planning to continue putting the puzzle pieces together with <strong>AngularJS and TypeScript</strong>, using the strengths of both technologies to make a harmonious solution. To get started we are first going to need to make sure we have the TypeScript definition for AngularJS added to our project, and to do this you need to run the following on NuGet.  </p>

<pre class="brush:text">Install-Package angularjs.TypeScript.DefinitelyTyped</pre>  

<p>If you have never used AngularJS before, you may want to <a href="http://angularjs.org/">familiarize yourself with the AngularJS basics</a>. In our app we are going to have the following application and controller.  </p>

<ul>  
    <li>ng-app="<strong>consensus</strong>"</li>
    <li>ng-controller="<strong>PokerRoomCtrl</strong>"</li>
</ul>  

<p>Typically you would have controller code that looks like this:  </p>

<pre class="brush:javascript">var app = angular.module("consensus", []);  
app.controller("PokerRoomCtrl", function ($scope) {  
    $scope.room = {
        Name: "our room",
        Topic: "our topic",
        Users: [{ ... users ... }],
        Cards: [{ ... cards ... }]
    };

    $scope.myCard = {
        Value: "",
    };

    $scope.$watch("room.Name", function (value) {
        if (!value) return;
        $location.path("/rooms/" + encodeURIComponent(value));
    });

    $scope.allCardsShowing = false;

    $scope.myCardValueChanged = function () {
        alert("Card changed to " + $scope.myCard.Value);
    };

    $scope.showAllCards = function (show) {
        $scope.allCardsShowing = show;
    };
});</pre>

<p>But it has the same strong typing problem that SignalR had when it came to TypeScript. But luckily for us with a little adjustment to the above code it is very easy to get TypeScript to play nice and actually benefit your AngularJS code.</p>

<p>As with SignalR, it is necessary to create an interface that will strongly type our code. In the case of SignalR we had to create a strongly typed client and server interface to interface with the backend server. As you probably already know, everything in AngularJS is based on a primary parameter called <code>$scope</code>, and that won't change when using TypeScript, however we are going to strongly type it, and for out example it will look something like this with our scope interface extending <code>ng.IScope</code>.  </p>

<pre class="brush:javascript">export interface IPokerRoomScope extends ng.IScope {  
    myCardValueChanged();
    showAllCards(show: boolean);

    allCardsShowing: bool;

    room: PokerRoom;
    myCard: PokerCard;
}</pre>

<p>Now that we have our scope defined lets see how creating a controller for AngularJS is effected when doing it in TypeScript. In AngularJS the typical controller looks something like this:  </p>

<pre class="brush:javascript">function PokerRoomCtrl ($scope) {  
    ...
}</pre>

<p>Instead of creating a <code>function</code> as defined above we are going to create a <code>class</code> with a <code>constructor</code> that takes <code>$scope</code> in TypeScript:  </p>

<pre class="brush:javascript">export class PokerRoomCtrl {  
    constructor(private $scope: IPokerRoomScope) {
        ...
    }
}</pre>

<p>As you can see they are very familiar in structure, however they look even more closely related when you take a look at the JavaScript that is generated from TypeScript.  </p>

<pre class="brush:javascript">var PokerRoomCtrl = (function () {  
    function PokerRoomCtrl ($scope) {
        this.$scope = $scope;
        ...
    }
    return PokerRoomCtrl;
})();</pre>

<p>To AngularJS the reference controller I showed above and the TypeScript generated controller are essentially the same thing in JavaScript, which is why AngularJS and TypeScript work together without too much hassle.</p>

<p>The <code>$scope</code> parameter is a dependency of the controller that is injected. You can read more about AngularJS and dependency injection <a href="http://docs.angularjs.org/guide/di">here</a>. The reason I bring this up, is because once you understand how AngularJS injects dependency into your controller, you'll realize that minimizers destroy AngularJS's ability to do dependency injection. And exceptions like this will be generated in your JavaScript console in the browser.</p>

<pre class="brush:text">Error: Unknown provider: XProvider <- x<="" pre="">

<p>Because it is common place to minify JavaScript code, it is <strong>highly recommended</strong> that you specify an <code>$inject</code> property in your code. You can read more about the <a href="http://docs.angularjs.org/guide/di#dinjectannotation"><code>$inject</code> property here</a>. To do the same in TypeScript you simply have to add the following to your controller class.</p>

<pre class="brush:javascript">// protect the injection from minification  
static $inject = ['$scope'];</pre>

<p>The last recommendation for working with AngularJS and TypeScript is for you to define the controller class in the AngularJS app, which you may remember from the original example.  TO define the controller class in the AngularJS app you do the following:</p>

<pre class="brush:javascript">var app = angular.module("consensus", []);  
app.controller("PokerRoomCtrl", PokerRoomCtrl);</pre>

<p>Putting this in your TypeScript code is more of a convenience than a necessity. If you don't have this app controller definition, you will have to fully reference your controller class on the page, which will include the full namespace of your TypeScript module plus the class name.  Instead of me having to reference <code>Consensus.PokerRoomCtrl</code> as the controller name, I can simply just use <code>PokerRoomCtrl</code> or whatever other name you give the controller when referencing it in the AngularJS app.</p>

<h3>Conclusion</h3>  

<p>As you can see getting AngularJS and TypeScript working together is a lot more straight forward than SignalR and TypeScript.  </p>

<p>There is no source code to post this time, everything will be brought together in the final 2 posts in the series, and the full project will be available for viewing on GitHub.</p>

<ol>  
    <li><a href="http://coderjournal.com/2013/07/signalr-and-angularjs/">SignalR + AngularJS</a></li>
    <li><a href="http://nickberardi.com/consensus-bringing-it-all-together/">Bringing it all together</a></li>
</ol></-></pre>]]></description><link>http://nickberardi.com/angularjs-and-typescript/</link><guid isPermaLink="false">d9088d0e-dcb6-4f72-bba4-79070f059cc6</guid><category><![CDATA[Consensus]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Fri, 12 Jul 2013 15:00:52 GMT</pubDate></item><item><title><![CDATA[Consensus: SignalR + TypeScript]]></title><description><![CDATA[<p>As part of my 4 part series in creating <a href="http://coderjournal.com/2013/07/planning-poker-project">the app I described in my prior post</a>, I am going to be creating an online planning poker application for distributed teams using AngularJS, SignalR, and TypeScript.</p>

<p>In this first post, I would like to talk about bringing <strong>SignalR and TypeScript</strong> together to create a solution that follows the best practices of both frameworks. To get started we are first going to need to make sure we have the TypeScript definition for SignalR added to our project, and to do this you need to run the following on NuGet.  </p>

<pre class="brush:text">Install-Package signalr.TypeScript.DefinitelyTyped</pre>  

<p>If you have never used SignalR before, you may want to <a href="http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client">familiarize yourself with the SignalR basics</a>.  In the app we have the following client and server endpoints.  </p>

<table>  
<thead>  
<tr>  
<th>Server</th>  
<th>Client</th>  
</tr>  
</thead>  
<tbody>  
<tr>  
<td><code>join</code></td>  
<td></td>  
</tr>  
<tr>  
<td><code>joinRoom</code></td>  
<td><code>userChanged</code></td>  
</tr>  
<tr>  
<td><code>leaveRoom</code></td>  
<td><code>userRemoved</code></td>  
</tr>  
<tr>  
<td><code>resetRoom</code></td>  
<td><code>resetRoom</code></td>  
</tr>  
<tr>  
<td><code>showAllCards</code></td>  
<td><code>showAllCards</code></td>  
</tr>  
<tr>  
<td><code>changeRoomTopic</code></td>  
<td><code>roomTopicChanged</code></td>  
</tr>  
<tr>  
<td><code>changeChard</code></td>  
<td><code>cardChanged</code></td>  
</tr>  
</tbody>  
</table>  

<p><em>(each row shows a server call and a resulting client call that is broadcast to all users in the planning poker room)</em></p>

<p>Typically you would make calls like this:  </p>

<pre class="brush:javascript">var poker = $.connection.poker;  
poker.client.userChanged = function (user) {  
    console.log("user " + user.Name + " changed");
};
$.connection.hub.start().done(function () {
    $("#join").click(function () {
         poker.server.joinRoom({ Name: $("#roomName").val() }, { Name: $("#userName").val() }).done(function(room) {
             console.log("joined " + room.Name + " room and " + room.Users.length + " are present");
         });
     });
});</pre>

<p>The only problem with this approach is that TypeScript knows nothing about the custom proxy that was generated at <code>$.connection.poker</code>, so it will throw errors and not allow the compilation of the code to continue. There are ways to get around this by not using the generated proxy as described in the guide I linked to earlier, but that is not type safe and really doesn't take advantage of any of the benefits that TypeScript's type safety offers. Lets do it the right way, and to do it the right way to gain the type safety we need to define our client and server interfaces to TypeScript.</p>

<p>The first thing we need to do is tell TypeScript about our generated proxy called <code>poker</code>.  </p>

<pre class="brush:javascript">interface SignalR {  
    poker: HubProxy;
}</pre>

<p>You do that by extending the SignalR type interface in your typescript file. <em>Note that this extension of SignalR has to be done out side of the module namespace.</em> Next lets extend <code>client</code> and <code>server</code> extensions off of the <code>HubProxy</code> interface. This will provide us with interfaces to define our methods for the endpoints we talked about earlier in the table above.  </p>

<pre class="brush:javascript">interface HubProxy {  
    client: IPokerRoomClient;
    server: IPokerRoomServer;
}</pre>

<p>This extends <code>HubProxy</code> in a similar way that we extended the <code>SignalR</code> interface by just adding additional properties to an already existing interface. The last thing we need to do is define the endpoint methods for our <code>client</code> and <code>server</code>. Which you can find here.  </p>

<pre class="brush:javascript">interface IPokerRoomClient {  
    userChanged(user: Consensus.PokerUser);
    userRemoved(user: Consensus.PokerUser);

    resetRoom(room: Consensus.PokerRoom);
    showAllCards(show: boolean);
    roomTopicChanged(topic: string);
    cardChanged(card: Consensus.PokerCard);
}

interface IPokerRoomServer {  
    join(user: Consensus.PokerUser): JQueryPromise;
    joinRoom(room: Consensus.PokerRoom): JQueryPromise;
    leaveRoom(room: Consensus.PokerRoom, user: Consensus.PokerUser): JQueryPromise;

    resetRoom(room: Consensus.PokerRoom): JQueryPromise;
    showAllCards(room: Consensus.PokerRoom, show: boolean): JQueryPromise;
    changeRoomTopic(room: Consensus.PokerRoom, topic: string): JQueryPromise;
    changedCard(room: Consensus.PokerRoom, value: string): JQueryPromise;
}</pre>

<p>The above interfaces define the type safe endpoint methods for both the client and server side of SignalR. A couple new types were defined in the above code for types we haven't yet talked about. These are object types that match exactly what is used on the server side.  </p>

<pre class="brush:javascript">module Consensus {  
    export class PokerUser {
        public Name: string;
        public Email: string;
        public Disconnected: string;
    }

    export class PokerRoom {
        public Name: string;
        public Topic: string;
        public Users: PokerUser[];
        public Cards: PokerCard[];
    }

    export class PokerCard {
        public User: PokerUser;
        public Value: string;
    }
}</pre>

<p>These types will make more sense when we actually walk through the server side code, but for now here they are. You can see all this put together here: <a href="https://gist.github.com/nberardi/5904129#file-consensus-pokerroom-ts">consensus.pokerRoom.ts</a>. Next lets go over the C# equivalents of the above.  </p>

<pre class="brush:csharp">namespace Consensus.Models  
{
    public class PokerUser
    {
        public string Name { get; set; }
        public string Email { get; set; }

        public DateTimeOffset? Disconnected { get; set; }
    }

    public class PokerRoom
    {
        public PokerRoom()
        {
            Users = new List();
            Cards = new List();
        }

        public string Name { get; set; }
        public string Topic { get; set; }

        public virtual ICollection Users { get; set; } 
        public virtual ICollection Cards { get; set; } 
    }

    public class PokerCard
    {
        public PokerUser User { get; set; }
        public string Value { get; set; }
    }
}</pre>

<p>The above are one-to-one matches of their TypeScript counter part. Having a one-to-one match isn't necessary for everything to work, but it makes life easier. The rest of the code for this post is creating working hub methods for SignalR, which I am going to briefly cover to bring our original JavaScript example in for a full loop. I am just doing this for completeness because there are many other articles on the web that deal with the topic of creating SignalR hub methods, including the article I originally referenced above.  </p>

<pre class="brush:csharp">public PokerRoom JoinRoom(PokerRoom room)  
{
    var user = _users.Where(x =&gt; x.Key == Context.ConnectionId).Select(x =&gt; x.Value).FirstOrDefault();

    if (user == null)
        throw new Exception("No user with this connection Id has joined yet.");

    _logger.Info("{0} joined {1} room", user.Email, room.Name);

    room = _rooms.FirstOrDefault(x =&gt; x.Name == room.Name) ?? room;

    if (!_rooms.Contains(room))
        _rooms.Add(room);

    if (room.Users.All(x =&gt; x.Email != user.Email)) {
        room.Users.Add(user);
    }

    // tell the people in this room that you've joined
    Clients.Group(room.Name).userChanged(user);

    Groups.Add(Context.ConnectionId, room.Name);

    return room;
}</pre>

<p>From the original endpoint table this hub method covers the 2nd row after the header for the <code>joinRoom / userChanged</code> server and client methods. If you would like to view the rest of the methods for this hub, you can see all this put together here: <a href="https://gist.github.com/nberardi/5904129#file-poker-cs">Poker.cs</a>.</p>

<h3>Conclusion</h3>  

<p>As you can see getting SignalR and TypeScript working together isn't as straight forward as other frameworks like jQuery because the auto proxy generation.  Ultimately TypeScript may seem like a pain to setup initially because of the little extra work you have to do at the beginning of a project to define your proxy interfaces.  However in the end you have a type safe interface for your client and server endpoint methods, which will save you time in the long run.</p>

<p>If you would like to view all the source for this post, you can find it here at the GitHub Gist I setup.  <a href="https://gist.github.com/nberardi/5904129">https://gist.github.com/nberardi/5904129</a>.  Best of luck and stay tuned for the next 3 posts in the series.</p>

<ol>  
    <li><a href="http://coderjournal.com/2013/07/angularjs-and-typescript/">AngularJS + TypeScript</a></li>
    <li><a href="http://coderjournal.com/2013/07/signalr-and-angularjs/">SignalR + AngularJS</a></li>
    <li><a href="http://nickberardi.com/consensus-bringing-it-all-together/">Bringing it all together</a></li>
</ol>]]></description><link>http://nickberardi.com/signalr-and-typescript/</link><guid isPermaLink="false">a4ec5896-224a-4a88-a939-1e1dac6b5ad2</guid><category><![CDATA[Consensus]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Wed, 03 Jul 2013 14:00:02 GMT</pubDate></item><item><title><![CDATA[Consensus: Planning Poker Project]]></title><description><![CDATA[<p>Last Friday I decided to sit down and see how painful it would be to integrate AngularJS, SignalR, and TypeScript together to produce a useful and interesting tool.  The tool I decided to create was an online planning poker tool for distributed teams that need to do SCRUM planning.  I personally have a need for this, since it is very hard if not impossible to effectively to do poker planning over a conference call.</p>

<p>If you are not familiar with planning poker, <a href="http://en.wikipedia.org/wiki/Planning_poker">you can learn more here</a>, the general premise is this:  </p>

<blockquote>The reason to use Planning poker is to avoid the influence of the other participants. If a number is spoken, it can sound like a suggestion and influence the other participants' sizing. Planning poker should force people to think independently and propose their numbers simultaneously. This is accomplished by requiring that all participants show their card at the same time.</blockquote>  
To play planning poker, each player is provided a set of cards loosely-based on the Fibonacci sequence, and the following procedure is used for estimating the tasks for the upcoming sprint.  
<blockquote>  
<ul>  
    <li>A Moderator, who will not play, chairs the meeting.</li>
</ul>  
<ul>  
    <li>The Product Manager provides a short overview. The team is given an opportunity to ask questions and discuss to clarify assumptions and risks. A summary of the discussion is recorded by the Project Manager.</li>
</ul>  
<ul>  
    <li>Each individual lays a card face down representing their estimate. Units used vary - they can be days duration, ideal days or story points. During discussion, numbers must not be mentioned at all in relation to feature size to avoid anchoring.</li>
</ul>  
<ul>  
    <li>Everyone calls their cards simultaneously by turning them over.</li>
</ul>  
<ul>  
    <li>People with high estimates and low estimates are given a soap box to offer their justification for their estimate and then discussion continues.</li>
</ul>  
<ul>  
    <li>Repeat the estimation process until a consensus is reached. The developer who was likely to own the deliverable has a large portion of the "consensus vote", although the Moderator can negotiate the consensus.</li>
</ul>  
<ul>  
    <li>An egg timer is used to ensure that discussion is structured; the Moderator or the Project Manager may at any point turn over the egg timer and when it runs out all discussion must cease and another round of poker is played. The structure in the conversation is re-introduced by the soap boxes.</li>
</ul>  
</blockquote>  

<p>Now that you have a basic understanding of what planning poker consists of, the parts of the procedure that I am going to build an application for are specifically choosing the cards, and showing them.  </p>

<h3>Why did I choose AngularJS, SignalR, and TypeScript over other similar technologies?</h3>  

<p>No reason in particular, I have been using AngularJS, SignalR, and TypeScript for quite a while now, but I had never used any of them in conjunction with each other.  As a fun exercise to see how easy or painful it would be to use all 3 in the same project I decided to create this poker planning tool, which I called Consensus.  </p>

<h3>Where can I find a working copy?</h3>  

<p>You can find a working copy of the Consensus software at: <a href="http://consensus.azurewebsites.net/">http://consensus.azurewebsites.net/</a>  </p>

<h3>Break down of future posts:</h3>  

<p>I am going to break this application into a 4 part series of blog posts, that deals with integrating just two components at a time. I believe this is the best approach, because not only does a combination of two of these technologies expand how relative the post will be to the audience, over all three technologies at the same time.  But it also breaks up a very long topic into 4 easily digestible posts, instead of just throwing it together in one large post that is too long for anybody but the most die-hard to care about reading.  </p>

<ol>  
    <li><a href="http://coderjournal.com/2013/07/signalr-and-typescript/">SignalR + TypeScript</a></li>
    <li><a href="http://coderjournal.com/2013/07/angularjs-and-typescript/">AngularJS + TypeScript</a></li>
    <li><a href="http://coderjournal.com/2013/07/signalr-and-angularjs/">SignalR + AngularJS</a></li>
    <li><a href="http://nickberardi.com/consensus-bringing-it-all-together/">Bringing it all together</a></li>
</ol>  

<p>Stay tuned the posts should start rolling out soon.</p>]]></description><link>http://nickberardi.com/planning-poker-project/</link><guid isPermaLink="false">1b8c798b-7c65-4af2-8b49-3f4c70a4eedb</guid><category><![CDATA[Consensus]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Tue, 02 Jul 2013 14:00:40 GMT</pubDate></item><item><title><![CDATA[I am a Microsoft Most Valued Professional, Part 2]]></title><description><![CDATA[<p><img alt="Microsoft Most Valued Professional" src="http://coderjournal.com/uploads/2012/07/mvp_horizontal_fullcolor.png" width="675" height="273"></p>

<p>Last year was <a href="http://coderjournal.com/2012/07/i-am-a-microsoft-most-valued-professional/">my first year being involved in the Microsoft MVP program</a>.  Over the past year, I have met many great developers through the MVP program and at the Summit, and  I am happy to say that my MVP for ASP.NET/IIS has been renewed for a 2nd year.</p>]]></description><link>http://nickberardi.com/i-am-a-microsoft-most-valued-professional-part-2/</link><guid isPermaLink="false">a28fd21a-80cb-4fe6-bec9-9b3e8864161c</guid><category><![CDATA[Microsoft MVP]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Mon, 01 Jul 2013 17:22:20 GMT</pubDate></item><item><title><![CDATA[Open Source Podcast #2]]></title><description><![CDATA[<p>First of all we have to say a big thank you to <a href="https://twitter.com/kcstreet">Kerry Street</a> for suggesting the name <a href="http://seriouslyopen.com/"><strong>Seriously Open</strong></a>. It was the best name by far, and I think it nicely condenses what we are trying to portray with our podcast.</p>

<p><img class="alignright" style="float: right;" alt="" src="http://getglimpse.com/content/glimpse100.png" width="95" height="98">This is part 1 of a two part interview that we had with the founders of the Glimpse Project, Nik Molnar and Anthony van der Horn.  The reason for two podcast releases is that we had such a great conversation with them, it was very tough to find any bad parts of the interview, plus there were essentially two podcasts.  One about Glimpse and how it came about, and the other about the industry of open source.  In the first podcast, Nik and Anthony talk to us about what it was like to start Glimpse and what it takes to create a successful open source project.</p>

<p>If you are not familiar with Glimpse, it is an Open Source platform that aims to change the way we think about diagnostics and the frameworks we interact with. After releasing Glimpse at Mix11, Glimpse has become a tool that is used daily by tens of thousands of developers around the world. It is intended for developers who want to use a a client side diagnostics tool for the server side of their applications. It is often referred to as Firebug for the server.</p>

<p>Podcast: <a href="http://seriouslyopen.com/glimpse-with-nik-molnar-and-anthony-van-der-hoorn">http://seriouslyopen.com/glimpse-with-nik-molnar-and-anthony-van-der-hoorn <br>
D</a>ownload: <a href="https://itunes.apple.com/us/podcast/seriously-open/id636361747">http://traffic.libsyn.com/seriouslyopen/2-glimpse-nik-molnar-anthony-van-der-hoorn.mp3</a> <br>
iTunes: <a href="https://itunes.apple.com/us/podcast/seriously-open/id636361747">https://itunes.apple.com/us/podcast/seriously-open/id636361747</a></p>]]></description><link>http://nickberardi.com/open-source-podcast-2/</link><guid isPermaLink="false">c75fc16a-e5e1-40b1-88cf-72a1b929e0e1</guid><category><![CDATA[Podcast]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Sat, 11 May 2013 14:38:46 GMT</pubDate></item><item><title><![CDATA[Open Source .NET Podcast #1]]></title><description><![CDATA[<p>A few weeks ago<a href="https://twitter.com/jrusbatch"> Justin Rusbatch</a> and I produced a first in hopefully a long line of podcasts.  The mission statement of our podcast is:  </p>

<blockquote>To talk about and promote Open Source .NET software development to encourage more participation.</blockquote>  

<p>It occurred to us while we were talking about the setup of the podcast, such as name, logo, topics, etc, that we should just record it.  And make this podcast process as open as possible, just like a real open source project.  We decided on the podcast that we had the following outstanding issues for the podcast that we needed pull requests from the community for:  </p>

<ol>  
    <li><span style="line-height: 13px;"><strong>Name</strong>
Should be available both in .com and twitter</span></li>  
    <li><strong>Logo</strong>
Dependent on #1 being done.</li>  
    <li><strong>Intro and exit music.</strong></li>
    <li><strong>A 3rd podcast member.</strong></li>
</ol>  

<p>If you can help us out with any of these issues will we take your suggestion seriously and incorporate them in.  The obvious outstanding and persistent issue that we will always be willing to accept is new hot .NET Open Source projects that you would like us to interview the founders of.</p>

<p>Without any more setup, here is our first podcast in hopes of many more if it is well received.</p>

<iframe src="https://skydrive.live.com/embed?cid=2D5676AE8C13E111&resid=2D5676AE8C13E111%21509&authkey=ALc4tlH9Bp8luPs" width="98" height="120" frameborder="0" scrolling="no"></iframe>

<p>Please use the commenting in my blog to leave any feedback, as we get the above issues resolved we will try and find a better home for what we are doing.</p>]]></description><link>http://nickberardi.com/open-source-net-podcast-1/</link><guid isPermaLink="false">03449d2d-62ca-4376-bed3-16af549bbdb6</guid><category><![CDATA[Podcast]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Tue, 09 Apr 2013 14:00:24 GMT</pubDate></item><item><title><![CDATA[Strong Naming: One Year Later]]></title><description><![CDATA[<p>It is almost 1 year to the date of when I first posted <a href="http://coderjournal.com/2012/04/json-net-strong-naming-and-nuget-woes/">JSON.NET Strong Naming And NuGet Woes</a> and the NuGet compatibility issues have stabilized  This stabilization hasn't happened through a change from Microsoft, but a change in how publishers of NuGet packages version their libraries.</p>

<p>I am writing this post, because even after one year I am getting very passionate comments on one side of the issue or not, people don't seem to take a middle road on the strong naming issue. If you don't believe me <a href="http://coderjournal.com/2012/04/json-net-strong-naming-and-nuget-woes/#comments">take a look at the comments</a>.</p>

<p>Lucky for us, most developers who choose to strongly name their assemblies now are using a versioning mechanism that reduces the chances of breaking referencing assemblies in NuGet.  This "new" versioning technique is actually a non-technique.  Let me explain, instead of changing the version of the assembly with each release, you leave the version of the assembly set, until it is necessary to communicate a major release.</p>

<p>Lets look at JSON.NET again as our standard bearer.  Mostly do to the fact that it is the most widely used strongly named assembly in NuGet.  Since I last wrote my post almost a year ago, 11 releases have been made, however none of those releases caused breaking changes for any of the NuGet packages that referenced a 4.5.x version when built.  You may ask, "So what changed?"  As I alluded to previously the answer is "Nothing."  NuGet still functions as it did a year ago.  Strong naming still functions as it did a year ago.  .NET assemblies still function the same as they did a year ago.  The strongly named version of Newtonsoft.Json.dll did change either across those 11 releases, it has remained constant at 4.5.0.0.  And that last thing is exactly what was needed to settle down all the referencing problems in NuGet.</p>

<p><img class="alignnone size-full wp-image-2541" alt="Screen Shot 2013-04-02 at 8.46.28 AM" src="http://coderjournal.com/uploads/2013/04/Screen-Shot-2013-04-02-at-8.46.28-AM.png" width="700"></p>

<p>As I talked about in my previous post the main difference between strongly named assemblies and plain assemblies is that when you strongly name an assembly the versions have to match for any referencing assembly, for plain assemblies there is no requirement.  If you put out a new release of a strongly named assembly and don't change the version, the assemblies that reference it don't know the difference and are happy to keep using it.</p>

<p>At the time when I posted my previous post, I hadn't realized that James Newton-King had changed the policy to what I had described above, which is commonly referred to as SemVer.  He pointed this <a href="http://coderjournal.com/2012/04/json-net-strong-naming-and-nuget-woes/comment-page-1/#comment-67222">out to me in the comments</a>.  </p>

<blockquote><img class="alignleft" style="padding: 10px;" alt="" src="http://0.gravatar.com/avatar/e43cefbb045bbe6e800589876dc5677b?s=60&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D60&amp;r=PG" width="60" height="60"> FYI I discussed strong naming a couple of weeks ago –<a href="http://james.newtonking.com/archive/2012/03/20/json-net-4-5-release-1-iso-dates-async-metro-build.aspx" rel="nofollow">http://james.newtonking.com/archive/2012/03/20/json-net-4-5-release-1-iso-dates-async-metro-build.aspx</a>

No one seems to have read it.</blockquote>  

<p>He was right I didn't read it and that was a failure on my part.  The only reason I bring this up and mention him in this post, is because while I don't owe him an apology for speaking my opinion, I do have to apologize for using his project as an example of a wider spread problem in the industry at that time.  Projects like JSON.NET are often surrogate children to their owners, and to call out another person's child in such a public way isn't fair, so I apologize for that.</p>

<p>My stance on Strong Naming assemblies has softened a little over the past year, mostly due to the fact that it isn't causing me as much greif as it use to.  I still think it is a plague on .NET developers, unwittingly forced down on high from a VP who read a white paper from 2001.  However, I typically take the stance of, if it doesn't effect or slow down me, I am going to stay hands off on what other people do.  And right now that is the case.</p>]]></description><link>http://nickberardi.com/strong-naming-one-year-later/</link><guid isPermaLink="false">2f30fdc0-350a-4936-99e2-c5939738946b</guid><category><![CDATA[ASP.NET]]></category><category><![CDATA[CodePlex]]></category><category><![CDATA[JSON.NET]]></category><category><![CDATA[NuGet]]></category><category><![CDATA[asp.net mvc]]></category><category><![CDATA[ASP.NET WebAPI]]></category><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Tue, 02 Apr 2013 13:04:22 GMT</pubDate></item><item><title><![CDATA[Free 5 Hours From Executify]]></title><description><![CDATA[<p>Executify is offering 5 hours of complimentary compute time in honor of the MVP 2013 Summit for running CRON jobs in the cloud.  </p>

<blockquote>In honor of the Microsoft MVP Summit going on in Seattle right now, we are offering every person who signs up this week, 5 hours of complimentary compute time for running all your CRON jobs.

Signup here: <a href="http://www.executify.com/signup" rel="nofollow">http://executify.com/signup</a>

After you sign up for your account be sure to <a href="http://executify.com/docs/index#creating-your-first-job" rel="nofollow">checkout our documentation on creating your first CRON job</a> in Executify.</blockquote>]]></description><link>http://nickberardi.com/free-5-hours-from-executify/</link><guid isPermaLink="false">b4be1c09-b23b-4db8-9f46-6c5b1de21869</guid><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Tue, 19 Feb 2013 21:56:11 GMT</pubDate></item><item><title><![CDATA[Being Stolen From Sucks]]></title><description><![CDATA[<p>When you put open source software out there in the wild there is a mutual understanding that, you are going to see my source code, and probably take some influence from it into your own source code.  Maybe sometimes you even take a little more than influence, and copy some lines of code.  As an open source developer, we all know this is happening and we all know this is alright, encouraged, and to be expected.</p>

<p>When it gets to the point of out right copying of whole files it becomes a different story all together.  And that is what I am addressing today.  I should start out by saying that <a href="http://www.datastax.com/">Datastax </a>is a great contributor to open source software, and has provided the Cassandra community with a great amount of free docs and tools, and is one of the primary drivers behind recommending the FluentCassandra library to clients.  I wish that is where we could leave it.</p>

<p>One of their developers decided to take some shortcuts and started copying FluentCassandra without attribution and passing the work off has his own. Everybody has deadlines and I understand that, but it takes a certain kid of malevolence and disdain for open source software, to out right copy certain parts of a competing code bases code for the expediency of getting your own out to market.</p>

<p>The developer who did this, <a href="https://github.com/pawel-kaplanski">Pawel Kaplanski</a>, contributed a couple issues and some minor code that ultimately had to be rewritten to FluentCassandra back in September 2012.  You can see that he does work for Datastax here and that the only thing he has done for open source software ever to contribute a few minor things to FluentCassandra over a 3 day period in September. <em>(side note: I would hope that a company like Datastax who loves open source software, would hire developers who love open source software, however that doesn't appear to be the case with Pawel who seems to only troll for code to make his day job easier)</em></p>

<p><img alt="copycat-pawel-kaplanski" src="http://coderjournal.com/uploads/2013/02/copycat-pawel-kaplanski.png" width="944" height="836"></p>

<p>Pawel was first introduced to me back in September by Michael Figuiere. In the email Michael was explaining to me that Pawel was going to be helping me out on FluentCassandra while working on their own client library.  Which was wonderful news for me, because I always appreciate help, I thought this was a win-win for everybody involved. But as you can see from the above Github interactions, Pawel didn't quite live up to his end of the bargain, and as I will show next in seemed to only be a win for Pawel.</p>

<p><img alt="email" src="http://coderjournal.com/uploads/2013/02/email.png" width="782" height="694"></p>

<p>So lets get down to the dirty stuff.  Which I have started to <a href="https://github.com/managedfusion/fluentcassandra/issues/114">track in an issue on FluentCassandra</a>.  The first and most egregious copying of code, and the part of FluentCassandra that has literally taken many many weeks of my time, over the past year, in tweaking and getting just right is the LINQ Expression Evaluator.</p>

<p><img alt="compare1" src="http://coderjournal.com/uploads/2013/02/compare1.png" width="1428" height="858"></p>

<p>As you can see in this picture the white spaces in the indicator on the left hand side is code that was copied.  These pieces of code contain the exact method names, program code, positions, and everything, so it is undoubtedly copied as a whole and then tweaked for his own needs.  This is just lazy and dishonest.</p>

<p>There are others too, notice any similarities here:</p>

<p><a href="https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra.Data.Linq/CqlQueryEvaluator.cs">https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra.Data.Linq/CqlQueryEvaluator.cs</a> <br>
<a href="https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra/GuidGenerator.cs">https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra/GuidGenerator.cs</a> <br>
<a href="https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra/GuidVersion.cs">https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra/GuidVersion.cs <br>
</a><a href="https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra/DateTimePrecise.cs">https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra/DateTimePrecise.cs</a><a href="https://github.com/datastax/csharp-driver/blob/28d8958873f55727bf515cf97b32c9cbfa31af9f/Cassandra/GuidVersion.cs"> <br>
</a></p>

<p>No attribution at all for our hard work:</p>

<p><a href="https://github.com/managedfusion/fluentcassandra/blob/master/src/Linq/CqlQueryEvaluator.cs">https://github.com/managedfusion/fluentcassandra/blob/master/src/Linq/CqlQueryEvaluator.cs</a> <br>
<a href="https://github.com/managedfusion/fluentcassandra/blob/master/src/GuidGenerator.cs">https://github.com/managedfusion/fluentcassandra/blob/master/src/GuidGenerator.cs</a> <br>
<a href="https://github.com/managedfusion/fluentcassandra/blob/master/src/GuidVersion.cs">https://github.com/managedfusion/fluentcassandra/blob/master/src/GuidVersion.cs <br>
</a><a href="https://github.com/managedfusion/fluentcassandra/blob/2c77dfca83891a9559e14a2b58797095c0486050/src/System/DateTimePrecise.cs">https://github.com/managedfusion/fluentcassandra/blob/2c77dfca83891a9559e14a2b58797095c0486050/src/System/DateTimePrecise.cs</a><a href="https://github.com/managedfusion/fluentcassandra/blob/master/src/GuidVersion.cs"> <br>
</a></p>

<p>The last one is the most interesting because it dates when he copied the FluentCassandra source code as somewhere between August 25 and September 6.  Which line up nicely to his 3 days that he looked at FluentCassandra.  I know this date range because I <a href="https://github.com/managedfusion/fluentcassandra/commits/master/src/System/DateTimePrecise.cs">removed DateTimePrecise from the code base on September 6</a> because it had a nasty bug in it.</p>

<p><img alt="history-datetimeprecise" src="http://coderjournal.com/uploads/2013/02/history-datetimeprecise.png" width="934" height="196"></p>

<p>To be clear I am just very irritated that Datastax promised some help to FluentCassandra and the only help we seem to have gotten was a developer who decided to steal our code and not contribute anything back.  And the two bugs that Pawel opened on FluentCassandra were bugs that he fixed in his own copy of the source code, but couldn't be bothered to contribute back to FluentCassandra.  That takes a real set of brass ones to be that blatant.<img class="alignnone size-full wp-image-2411" alt="pawel-issues" src="http://coderjournal.com/uploads/2013/02/pawel-issues.png" width="707" height="119"></p>

<p>There is one bright spot and really all that I ask for, developer <a href="https://github.com/kcieslinski" rel="author">kcieslinski</a> <a href="https://github.com/datastax/csharp-driver/blob/master/Cassandra/BigDecimal.cs">does actually attribute FluentCassandra</a>when he copied the BigDecimal code.</p>

<p><img alt="kcieslinski" src="http://coderjournal.com/uploads/2013/02/kcieslinski.png" width="934" height="288"></p>

<p>That simple one line is all that I ever ask for.</p>]]></description><link>http://nickberardi.com/being-stolen-from-sucks/</link><guid isPermaLink="false">c9f021d0-fc44-480e-afff-6d39508e690f</guid><dc:creator><![CDATA[Nick Berardi]]></dc:creator><pubDate>Sat, 16 Feb 2013 23:01:12 GMT</pubDate></item></channel></rss>