Archive for Review

03 Jun 2011

JustCode makes coding just better

2 Comments Review

I wanted to hold off writing this post, because I wanted to be impartial to the product as possible. However, when I first installed Telerik’s JustCode, I instantly knew that this was the productivity enhancement tool for me.

Let me back up a little, over the years I have given ReSharper and CodeRush more than enough latitude to impress me and after using them for 3 months or more at a time I always end up just uninstalling them. And I constantly repeated this process over and over again, start with naked Visual Studio, get antsy want to try something new install ReSharper, get fed up, uninstall, install CodeRush, get fed up, uninstall, repeat.

I probably repeated this process countless times over the past 5 years, and each time I got more and more fed up and discouraged that the best productivity tool was my fingers, mouse, and naked Visual Studio. However that all changed the day I realized that Telerik was creating a competing productivity tool which seemed to solve my major issues with ReSharper and CodeRush, namely:

  1. Performance, JustCode doesn’t slow down the startup process of Visual Studio, and it doesn’t slow down the performance of Visual Studio while using it.
  2. There are no annoying pop-ups that you can’t get rid of. (mainly CodeRush)
  3. They don’t try to override everything in Visual Studio, even things that work perfectly fine. (mainly ReSharper)
  4. The power options aren’t hidden way behind obscure keyboard commands.

The first 3 points above are superficial and hard to prove in a blog post. However the 4 point is very easy to explain. My problem with CodeRush and ReSharper is that unless you had inside knowledge or a ton of time to spend learning all the ins and outs of the software you pretty much started and stayed at a disadvantage. Just to be clear, I have spent countless hours watching the video’s, reading blogs, and slowly finding all the ins and outs of each productivity tool, and to be honest it shouldn’t be this hard. And I should following up to saying it doesn’t have to be this hard.

The instant productivity is apparent day-one, with JustCode, if you have absolutely no time to learn the ins and outs or the keyword shortcuts or you just don’t care, you don’t have to worry because every option available to you for the specific piece of code is available in a context menu that shows up when you hover over the a relative piece of code:

justcode-menu

These different letters that show up are essentially your best friend, and they stand for:

  • C – Create, for generating and creating related code.
  • R – Refactor for refactoring the current code.
  • N – Navigating the project.
  • T – Testing

Under each of these menus is a context sensitive menu for all the options available to you to create, refactor, navigate, and sometimes test your code that you are hovering over.  All this being said, if you have the time and the inclination to learn the keyboard commands, you should, because it just adds a speed component to the same productivity you have by clicking around with the mouse.

The other great thing about the JustCode approach is that it is not totally in your face always reminding you that you are running JustCode such as CodeRush and ReSharper do. Maybe this is a bad marketing decision to not constantly remind the customer of the product they are using, but to me the out of the way approach of JustCode is a positive bonus.

JustCode is essentially my friend that only pops up and says “I can help you out with that problem” when I request the help, instead of the annoying friend that is always hanging around reminding you they are there and interjecting unhelpful non-sense when you don’t need their help. Just like Clippy did in Microsoft Office.

tl;dr

I cannot say enough good things about Telerik’s JustCode. If you want a comprehensive productivity tool for coding with Visual Studio that stays out of your way until you ask for its help then JustCode is just the tool for you and it will make just coding a pleasurable experience. (sorry about the play on the word just)

You can download a free trial version from here: http://www.telerik.com/account/your-products/trial-product-versions/trial-single-download.aspx?pmvid=0&pid=717

Try it, you won’t be disappointed.

16 Feb 2010

Connecting Visual Studio 2008 to Team Foundation Server 2010

5 Comments Programming, Review

With the recent release of Visual Studio 2010 RC, I decided to take Team Foundation Server (TFS) 2010 RC for a spin also.  I was really interested in seeing what new and great features are being offered, because there has been a lot of buzz around this release of TFS. 

After installing Visual Studio 2010 Ultimate on my laptop and setting up TFS 2010 as a new install, which was way easier than I remember 2005 being, I connected up VS 2010 and TFS 2010 with out a problem. 

However I ran into a ton of problems trying to get Visual Studio 2008 connected to TFS 2010.  I eventually had to resort hacking the registry to get everything to work as it should.  Here are the steps I used:

  1. Click Add Existing Team Project Button
    step-1
  2. Click Servers Button
  3. Click Add… Button
  4. Type in full server name with collection specified and trailing slash, it complains if there is no trailing slash
    step-4 
    If you actually try to use this to select projects to edit, everything will look like it went smooth.  However you will notice that no projects actually show up in the Team Explorer
  5. Close Visual Studio
  6. Remove the trailing slash from the registry key of the server you just added here:
    HKEY_CURRENT_USER/Software/Microsoft/VisualStudio/9.0/TeamFoundation/Servers
  7. Open Visual Studio
  8. Connect to your TFS 2010 server and select the projects that you want to use in 2008.

Hope this helps somebody else down the line as I am sure more and more people are going to run into this problem as they adopt TFS 2010.

Note: You can do this in all one step by just adding the value into the registry, I just find this way a little more visually pleasing for explaining the concept in the blog.

20 Jan 2010

Performance Optimizations Made By Microsoft, Google, and Yahoo JavaScript Minimizers

6 Comments Review

In my first post about JavaScript compression and the different levels supported by the three major competitors in the JavaScript minimization, obfuscation, and optimization tools space.  I the article I discussed which tool provided the best compression in regards to the resulting byte count.  And found that Google took the over all crown with Microsoft following very closely behind.  A comment posted on that article by Eric J. Smith of Code Smith, provided a nice lead in to my second article in this series, he posted this comment:

Eric J. Smith Comment

So if you haven’t guessed it yet by the title and then by Eric’s comment this post is going to be on the optimizations provided by the tools.  So lets get started…

Setup

Back in October I saw an interesting article on this same subject comparing Yahoo and Microsoft on site called Ajaxian. But at the time Microsoft AJAX Minimizer was only on RC6, and as of this article is at version 1.1, so somethings have changed and I wanted to provide a more relevant comparison which included Google too. I borrowed Ajaxian’s code they used to test the different tools for my own experiment in this article.

function notCalled(text) {
	alert(text);
}
/**
 * @license comment
 */
var o = (function(){
var o = {};
var b = "on";
var c = "on" + b + "mouse";
var d = c + 1000 + "on";
var x = o[d];
/*!
important comment
*/
var i = 1000;
o["on" + "click"] = function(){};
o["on" + "mouse" + "over"] =
o["on" + "mouse" + "out"] =
o["on" + "mouse" + "move"] = o["on" + "click"];
o["on" + "click"] = o["on" + "click"];
if(i)
i++
;
return o
})();

The above code is designed to test many different aspects of optimization.  Including:

  1. Code that is not called from anywhere.
  2. Preservation of Licenses, Copy Rights, and any other important comments.
  3. Frequently used string literal combination.
  4. Understanding of logic, to remove repeated and unnecessary dynamic access.
  5. Number compression.  (changing 1000 to 1e3)
  6. Get rid of the gibberish variables at the beginning of the function that serve no purpose.

Simple Compression

First things first lets just see how each of them handle simple compression, with out any optimizations enabled on each tool.  I did that by running the following:

# Ajax Minifier
ajaxmin.exe test.js -o output.js

# YUI Compressor
java -jar yuicompressor-2.4.2.jar --nomunge --preserve-semi --disable-optimizations -o output.js test.js

# Google Closure
java -jar compiler.jar --compilation_level WHITESPACE_ONLY --js test.js

Above produces the following output

// Ajax Minifier
function notCalled(text){alert(text)}var o=function(){var o={},b="on",c="on"+b+"mouse",d=c+1e3+"on",x=o[d],i=1e3;o["onclick"]=function(){};o["onmouseover"]=o["onmouseout"]=o["onmousemove"]=o["onclick"];o["onclick"]=o["onclick"];if(i)i++;return o}()

// YUI Compressor
function notCalled(text){alert(text);}var o=(function(){var o={};var b="on";var c="on"+b+"mouse";var d=c+1000+"on";var x=o[d];
/*
important comment
*/
var i=1000;o["on"+"click"]=function(){};o["on"+"mouse"+"over"]=o["on"+"mouse"+"out"]=o["on"+"mouse"+"move"]=o["on"+"click"];o["on"+"click"]=o["on"+"click"];if(i){i++;}return o;})();

// Google Closure
/*
 comment
*/
function notCalled(text){alert(text)}var o=function(){var o={};var b="on";var c="on"+b+"mouse";var d=c+1E3+"on";var x=o[d];var i=1E3;o["on"+"click"]=function(){};o["on"+"mouse"+"over"]=o["on"+"mouse"+"out"]=o["on"+"mouse"+"move"]=o["on"+"click"];o["on"+"click"]=o["on"+"click"];if(i)i++;return o}();

Some interesting things I noticed about the above code is:

  • Yahoo was the only tool who preserved the “*!” comment block and Google was the only one who preserved the “**” comment block.
  • Google and Microsoft both changed the number 1000 into 1e3. 
  • Microsoft combined the strings together, that were next to each other.
  • Yahoo added some extra parentheses, around the if(i)i++; statement.

Simple Optimization

Next we are going to look at some basic optimizations made by each tool.  I again did that by running the following:

# Ajax Minifier
ajaxmin.exe -h test.js -o output.js

# YUI Compressor
java -jar yuicompressor-2.4.2.jar -o output.js test.js

# Google Closure
java -jar compiler.jar --compilation_level SIMPLE_OPTIMIZATIONS --js test.js

Above produces the following output

// Ajax Minifier
function notCalled(a){alert(a)}var o=function(){var a={},c="on",d="on"+c+"mouse",e=d+1e3+"on",f=a[e],b=1e3;a["onclick"]=function(){};a["onmouseover"]=a["onmouseout"]=a["onmousemove"]=a["onclick"];a["onclick"]=a["onclick"];if(b)b++;return a}()

// YUI Compressor
function notCalled(a){alert(a)}var o=(function(){var h={};var e="on";var j="on"+e+"mouse";var g=j+1000+"on";var a=h[g];
/*
important comment
*/
var f=1000;h.onclick=function(){};h.onmouseover=h.onmouseout=h.onmousemove=h.onclick;h.onclick=h.onclick;if(f){f++}return h})();

// Google Closure
/*
 comment
*/
function notCalled(a){alert(a)}var o=function(){var a={},b=1E3;a.onclick=function(){};a.onmouseover=a.onmouseout=a.onmousemove=a.onclick;a.onclick=a.onclick;b&&b++;return a}();

Some interesting things to note about this new code is:

  • Yahoo and Google still keep their respective comment blocks. 
  • Google and Microsoft both still changed the number 1000 into 1e3. 
  • Google and Yahoo show a better understanding of the code by changing the dynamic event hash mappings in to actual bound properties.  Microsoft still  only combines the strings together.
  • All of the tools obfuscated the variable names.
  • Microsoft and Google both combined the three variables at the beginning of the method in to a one statement.
  • Anybody notice the optimization that Google did b&&b++ instead of if(b)b++, this shows a really good understanding of the code.
  • On the other had Yahoo added some extra parentheses, again, around the if(i)i++ statement, but dropped the extra semi-colon.
  • Google was the only one who got rid of the gibberish variables at the beginning of the function that served no purpose.

Best Optimizations

Next we are going to check out the best possible combination of options for each tool to produce the most optimized code.  We will produce this with the following:

# Ajax Minifier
ajaxmin.exe -hc test.js -o output.js

# YUI Compressor
java -jar yuicompressor-2.4.2.jar -o output.js test.js

# Google Closure
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js test.js

You may have noticed that we are using the same commands for Yahoo, this is on purpose, because Yahoo really doesn’t have a simple state the compares to the other tools. 

The following output was produced

// Ajax Minifier
function notCalled(a){alert(a)}var o=function(){var d="click",c="mouse",a="on",b={},f=a,g=a+f+c,h=g+1e3+a,i=b[h],e=1e3;b[a+d]=function(){};b[a+c+"over"]=b[a+c+"out"]=b[a+c+"move"]=b[a+d];b[a+d]=b[a+d];if(e)e++;return b}()

// YUI Compressor
function notCalled(a){alert(a)}var o=(function(){var h={};var e="on";var j="on"+e+"mouse";var g=j+1000+"on";var a=h[g];
/*
important comment
*/
var f=1000;h.onclick=function(){};h.onmouseover=h.onmouseout=h.onmousemove=h.onclick;h.onclick=h.onclick;if(f){f++}return h})();

// Google Closure
/*
 comment
*/
(function(){var a={},b=1E3;a.onclick=function(){};a.onmouseover=a.onmouseout=a.onmousemove=a.onclick;a.onclick=a.onclick;b&&b++;return a})();

Some interesting things to note about this code is:

  • Yahoo and Google still keep their respective comment blocks. 
  • Google and Microsoft both still changed the number 1000 into 1e3. 
  • Google and Yahoo still show a better understanding of the code by changing the dynamic event hash mappings in to actual bound properties. 
  • Microsoft combined the “click”, “mouse” and “on” strings in to variables that are concatenated together in the variables and event references.
  • All of the tools still obfuscated the variable names.
  • Microsoft and Google still both combined the three variables at the beginning of the method in to a one statement.
  • Google still kept the b&&b++ instead of if(b)b++.
  • Yahoo added some extra parentheses, again, around the if(i)i++ statement, but dropped the extra semi-colon.
  • Google still was the only one who got rid of the gibberish variables at the beginning of the function that served no purpose.
  • Google removed the notCalled function, since it was not being used in this script file.  This is good and bad, because if you referenced this from the outside, then this will cause problems when you try to use it.

Final Word

Even though Google ADVANCED_OPTIMIZATIONS scored the highest and Microsoft with –hc turned on scored second on my last post.  I think Google with SIMPLE_OPTIMIZATIONS turned on is my current favorite for providing a good balance between optimization, compression, and compatibility with the original version.  Closely followed by Yahoo with out any configuration options turned off.  These two placed #3 and #5, respectively, in my previous post.

Even though Google with ADVANCED_OPTIMIZATIONS, did the best overall, it still scares me a little for the following reasons that I mentioned last time:

There are a couple things that should be noted about Google Closure with Advanced Options, which may not make the most beneficial option for you to choose when you are trying to minify your files.

  1. Removal of Code You Want to Keep
  2. Inconsistent Property Names
  3. Compiling Two Portions of Code Separately
  4. Broken References between Compiled and Uncompiled Code

Here are the files that resulted from the above testing:

  1. test.js
  2. microsoft.js
  3. microsoft-h.js
  4. microsoft-hc.js
  5. yahoo-all.js
  6. yahoo.js
  7. google-w.js
  8. google-s.js
  9. google-a.js

So which of the following optimizations do you feel the most comfortable with?