<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>juristr.com</title>
 
 <link href="http://juristr.com" />
 <updated>2013-05-09T23:55:19-07:00</updated>
 <id>http://juristr.com</id>
 <author>
   <name>Juri Strumpflohner</name>
   <email>juri.strumpflohner@gmail.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/juristrumpflohner" /><feedburner:info uri="juristrumpflohner" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Blog Like a Hacker with Jekyll and Nitrous.IO</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/K4Fa3sobtS0/blog-like-a-hacker-with-jekyll-and-nitrousio" />
   <updated>2013-05-08T00:00:00-07:00</updated>
   <id>http://juristr.com/blog/2013/05/blog-like-a-hacker-with-jekyll-and-nitrousio</id>
   <content type="html">&lt;p&gt;One of the best moves I probably did about half a year ago was to move my &lt;a href='/blog/2012/09/im-relocating-my-domain-site-and-blog/'&gt;Blog from blogger to Jekyll&lt;/a&gt;, hosted on GitHub. It simply reflects the kind of blogging experience you want as a dev, with Markdown support, full version control and amazing hosting on GitHub plus - not to forget - &lt;a href='http://jekyllrb.com/'&gt;Jekyll&lt;/a&gt;. What I was missing so far, however, was the ability to blog from any computer or even tablet. Today I found a possible workflow: &lt;a href='http://www.nitrious.io'&gt;Nitrous.IO&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jekyll is awesome as a blogging engine. You get an engine that allows to dynamically generate static pages: the best of both worlds! This allows to have full control over the generated HTML code. Moreover Markdown editing is absolutely perfect for writing technical blog posts with lots of source code in it. There&amp;#8217;s nothing really I miss, except for..well you know when you&amp;#8217;re on another machine and you&amp;#8217;d just like to quickly edit some post or even publish a new one, or when you&amp;#8217;d like to use your tablet for finishing that blog post&amp;#8230;you &lt;strong&gt;simply can&amp;#8217;t&lt;/strong&gt;. Why? Because Jekyll requires a working Ruby installation + if you have it hosted on GitHub (as I have) you need Git installed as well. On a table that doesn&amp;#8217;t work. Or does it?&lt;/p&gt;

&lt;h2 id='nitrousio_makes_it_possible'&gt;Nitrous.IO Makes It Possible&lt;/h2&gt;
&lt;iframe src='http://www.youtube.com/embed/7X6IvkgkC7k' allowfullscreen='allowfullscreen' frameborder='0' height='315' width='560'&gt; &lt;/iframe&gt;
&lt;p&gt;Simply speaking Nitrous.IO is a cloud IDE similar to Cloud9 but with the additional focus to give you a complete development box, with SSH access and in-browser shell. Their goal is to make a new setup as easy as possible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hello World in 60 Seconds.&lt;/strong&gt; Managing development environments is a pain. Get setup lightning fast in the cloud &amp;amp; code from anywhere, on any machine. &lt;cite&gt;&lt;a href='https://www.nitrous.io/'&gt;nitrous.io/&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it is &lt;em&gt;literally&lt;/em&gt; set up in seconds.&lt;/p&gt;

&lt;p&gt;Nitrous has the concept of boxes&lt;/p&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/nitrousio_boxes.png' /&gt;
    &lt;figcaption&gt;Nitrous Boxes&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;When you setup a new box you&amp;#8217;re being asked to choose your environment. Currently these are supported:&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/nitrousio_envselection.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Once selected, Nitrous will setup your box and immediately afterwards you&amp;#8217;ll be forwarded to the corresponding cloud IDE:&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/nitrousio_ide.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Note the shell window in the lower region of the IDE. This is a full SSH access to your box. You can even configure Nitrous to use Putty (Windows) or your unix shell to SSH into your cloud box. Extremely nice!!&lt;/p&gt;

&lt;h2 id='configuring_jekyll_on_nitrous'&gt;Configuring Jekyll on Nitrous&lt;/h2&gt;

&lt;p&gt;Since Nitrous gives you full access either through SSH or directly through a shell in its web IDE and given that Ruby is one of the native development platforms available on it, setting up Jekyll is really just a matter of minutes.&lt;/p&gt;

&lt;h3 id='configure_github'&gt;Configure GitHub&lt;/h3&gt;

&lt;p&gt;Configuring GitHub is - again - easy as Nitrous is already designed to be connected to it. You can just follow the instructions provided on &lt;a href='http://help.nitrous.io/github-add-key/'&gt;their help site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once that&amp;#8217;s set up, just clone your blog from GitHub.&lt;/p&gt;

&lt;h3 id='install_jekyll'&gt;Install Jekyll&lt;/h3&gt;

&lt;p&gt;Just follow the instructions on its &lt;a href='http://jekyllrb.com'&gt;official homepage&lt;/a&gt; and execute&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem install jekyll&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enter your previously downloaded Jekyll blog repository and start Jekyll through the corresponding rake task.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rake preview&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id='start_blogging'&gt;Start Blogging&lt;/h3&gt;

&lt;p&gt;Now you can open the corresponding blog markdown file in the web IDE and start writing your blog post. You can even directly run Jekyll on Nitrous and preview the resulting posts in the browser while writing it.&lt;/p&gt;

&lt;p&gt;Thanks to Chrome on Android you can seamlessly also write your Jekyll blog post from your tablet!&lt;/p&gt;

&lt;p&gt;Once finished, just git push it to GitHub as usual for publishing the post.&lt;/p&gt;

&lt;h2 id='conclusion'&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;So do I like Nitrous?&lt;/strong&gt; Of course, what I have seen is impressive given it is only in private beta. But actually the use case described in this post isn&amp;#8217;t probably the intended one. Instead, to be able to get a better overview of Nitrous one would have to explore its features in terms of code editor support and so on by developing a piece of software directly on that platform, i.e. using NodeJS. So far I have played with Nitrous only for a couple of hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would such workflow be possible in another Cloud IDE as well??&lt;/strong&gt; Sure, why not. I didn&amp;#8217;t try any other cloud IDE like Cloud9 extensively, but as long as you have shell access and can run Ruby on it, it should work just fine.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/K4Fa3sobtS0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/05/blog-like-a-hacker-with-jekyll-and-nitrousio</feedburner:origLink></entry>
 
 <entry>
   <title>Perfect Workflow in Sublime Text 2</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/lFlGa9MWC0c/perfect-workflow-in-sublime-text2" />
   <updated>2013-05-06T00:00:00-07:00</updated>
   <id>http://juristr.com/blog/2013/05/perfect-workflow-in-sublime-text2</id>
   <content type="html">&lt;p&gt;I previously wrote about &lt;a href='/blog/2013/04/my-sublimetext-setup/'&gt;my Sublime Text setup&lt;/a&gt;. Well, Tuts+ has published a quite nice Sublime Text tutorial showing most of Sublime&amp;#8217;s features. Regardless of whether you&amp;#8217;re a Sublime Text enthusiast or not, you should definitely take a look at the tutorial.&lt;/p&gt;

&lt;p&gt;The tutorial covers all of the aspects I could think of or which I encountered in using Sublime so far, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple Cursors&lt;/li&gt;

&lt;li&gt;Fuzzy Search&lt;/li&gt;

&lt;li&gt;Command Palette&lt;/li&gt;

&lt;li&gt;Package Control&lt;/li&gt;

&lt;li&gt;Code Snippets&lt;/li&gt;

&lt;li&gt;Essential Plugins (like Emmet for Zen Coding, Sublime Linter, Live Reload,&amp;#8230;)&lt;/li&gt;

&lt;li&gt;(much more)&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The different single sessions are directly available &lt;strong&gt;for free&lt;/strong&gt; at the Tuts+ site: &lt;a href='https://tutsplus.com/course/improve-workflow-in-sublime-text-2/'&gt;https://tutsplus.com/course/improve-workflow-in-sublime-text-2/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Instead, if you prefer to watch all the tutorials &amp;#8220;all-in-one&amp;#8221; then there&amp;#8217;s a cut available on Youtube. Lasts about 2 1/2 hours:&lt;/p&gt;
&lt;iframe src='http://www.youtube.com/embed/TZ-bgcJ6fQo' allowfullscreen='allowfullscreen' frameborder='0' height='315' width='560'&gt; &lt;/iframe&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/lFlGa9MWC0c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/05/perfect-workflow-in-sublime-text2</feedburner:origLink></entry>
 
 <entry>
   <title>Git Explained: For Beginners</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/08W1fJ3Gc1E/git-explained" />
   <updated>2013-04-30T00:00:00-07:00</updated>
   <id>http://juristr.com/blog/2013/04/git-explained</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m working with Git now &lt;a href='/blog/2010/11/juri-goes-git-first-steps/'&gt;for about two years&lt;/a&gt; but only for my personal projects and those I have on GitHub. At work we still use TFS and SVN (as of now). Recently &lt;a href='https://twitter.com/nusco'&gt;Paolo Perrotta&lt;/a&gt; came to our company to hold a course about Agile planning and since Git was quite new to most of my mates, he also quickly explained Git in the context of refactoring. I really liked his approach of explaining it and that&amp;#8217;s why I&amp;#8217;d like to replicate his explanation here.&lt;/p&gt;

&lt;h2 id='just_before_we_start'&gt;Just before we start..&lt;/h2&gt;

&lt;p&gt;How is Git different from other VCS (Version Control Systems)? Probably the most obvious difference is that Git is distributed (unlike SVN or TFS for instance). This means, you&amp;#8217;ll have a local repository which lives inside a special folder named &lt;code&gt;.git&lt;/code&gt; and you&amp;#8217;ll normally (but not necessarily) have a remote, central repository where different collaborators may contribute their code. Note that each of those contributors has an &lt;strong&gt;exact clone&lt;/strong&gt; of the repository on their local workstation.&lt;/p&gt;

&lt;p&gt;Git itself can be imagined as something that sits on top of your file system and manipulates files. Even better, you can imagine Git as a &lt;strong&gt;tree&lt;/strong&gt; structure where &lt;strong&gt;each commit creates a new node&lt;/strong&gt; in that tree. Nearly all Git commands actually serve to navigate on this tree and to manipulate it accordingly.&lt;br /&gt;As such in this tutorial I&amp;#8217;d like to take a look at how Git works by viewing a Git repository from the point of view of the tree it constructs. To do so I walk through some common use cases like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adding/modifying a new file&lt;/li&gt;

&lt;li&gt;creating and merging a branch with and without merge conflicts&lt;/li&gt;

&lt;li&gt;Viewing the history/changelog&lt;/li&gt;

&lt;li&gt;Performing a rollback to a certain commit&lt;/li&gt;

&lt;li&gt;Sharing/synching your code to a remote/central repository&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='terminology'&gt;Terminology&lt;/h2&gt;

&lt;p&gt;Here&amp;#8217;s the git terminology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;master -&lt;/strong&gt; the repository&amp;#8217;s main branch. Depending on the work flow it is the one people work on or the one where the integration happens&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;clone -&lt;/strong&gt; copies an existing git repository, normally from some remote location to your local environment.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;commit -&lt;/strong&gt; submitting files to the repository (the local one); in other VCS it is often referred to as &amp;#8220;checkin&amp;#8221;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;fetch or pull -&lt;/strong&gt; is like &amp;#8220;update&amp;#8221; or &amp;#8220;get latest&amp;#8221; in other VCS. The difference between fetch and pull is that pull combines both, fetching the latest code from a remote repo as well as performs the merging.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;push -&lt;/strong&gt; is used to submit the code to a remote repository&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;remote -&lt;/strong&gt; these are &amp;#8220;remote&amp;#8221; locations of your repository, normally on some central server.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;SHA -&lt;/strong&gt; every commit or node in the Git tree is identified by a unique SHA key. You can use them in various commands in order to manipulate a specific node.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;head -&lt;/strong&gt; is a reference to the node to which our working space of the repository currently points.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;branch -&lt;/strong&gt; is just like in other VCS with the difference that a branch in Git is actually nothing more special than a particular label on a given node. It is not a physical copy of the files as in other popular VCS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='workstation_setup'&gt;Workstation Setup&lt;/h2&gt;

&lt;p&gt;I do not want to go into the details of setting up your workstation as there are numerous tools which partly vary on the different platforms. For this post I perform all of the operations on the command line. Even if you&amp;#8217;re not the shell-guy you should give it a try (it never hurts ;) ).&lt;/p&gt;

&lt;p&gt;To setup command line Git access simply go to &lt;a href='http://git-scm.com/downloads'&gt;git-scm.com/downloads&lt;/a&gt; where you&amp;#8217;ll find the required downloads for your OS. More detailed information can be found &lt;a href='http://git-scm.com/book/en/Getting-Started-Installing-Git'&gt;here as well&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After everything is set up and you have &amp;#8220;git&amp;#8221; in your PATH environment variable, then the first thing you have to do is to config git with your name and email:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git config --global user.name &amp;quot;Juri Strumpflohner&amp;quot;
$ git config --global user.email &amp;quot;myemail@gmail.com&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id='lets_get_started_create_a_new_git_repository'&gt;Lets get started: Create a new Git Repository&lt;/h2&gt;

&lt;p&gt;Before starting, lets create a new directory where the git repository will live and &lt;code&gt;cd&lt;/code&gt; into it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mkdir mygitrepo
$ cd mygitrepo&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we&amp;#8217;re ready to initialize a brand new git repository.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git init
Initialized empty Git repository in c:/projects/mystuff/temprepos/mygitrepo/.git/&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can check for the current status of the git repository by using&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use &amp;quot;git add&amp;quot; to track)&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id='create_and_commit_a_new_file'&gt;Create and commit a new file&lt;/h2&gt;

&lt;p&gt;The next step is to create a new file and add some content to it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ touch hallo.txt
$ echo Hello, world! &amp;gt; hallo.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Again, checking for the status now reveals the following&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to include in what will be committed)
#
#       hallo.txt
nothing added to commit but untracked files present (use &amp;quot;git add&amp;quot; to track)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To &lt;strong&gt;&amp;#8220;register&amp;#8221;&lt;/strong&gt; the file for committing we need to &lt;strong&gt;add&lt;/strong&gt; it to git using&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git add hallo.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Checking for the status now indicates that the file is ready to be committed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use &amp;quot;git rm --cached &amp;lt;file&amp;gt;...&amp;quot; to unstage)
#
#       new file:   hallo.txt
#&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can now &lt;strong&gt;commit&lt;/strong&gt; it to the repository&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git commit -m &amp;quot;Add my first file&amp;quot;
  1 file changed, 1 insertion(+)
  create mode 100644 hallo.txt&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;It is common practice to use the &amp;#8220;presence&amp;#8221; in commit messages. So rather than writing &amp;#8220;added my first file&amp;#8221; we write &amp;#8220;add my first file&amp;#8221;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So if we now step back for a second and take a look at the tree we would have the following.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/gitrepo_tree1.png' /&gt;
    &lt;figcaption&gt;State of the repo tree after 1st commit&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There is &lt;em&gt;one node&lt;/em&gt; where the &amp;#8220;label&amp;#8221; &lt;em&gt;master&lt;/em&gt; points to.&lt;/p&gt;

&lt;h2 id='add_another_file'&gt;Add another file&lt;/h2&gt;

&lt;p&gt;Lets add another file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;Hi, I&amp;#39;m another file&amp;quot; &amp;gt; anotherfile.txt
$ git add .
$ git commit -m &amp;quot;add another file with some other content&amp;quot;
  1 file changed, 1 insertion(+)
  create mode 100644 anotherfile.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Btw, note that this time I used &lt;code&gt;git add .&lt;/code&gt; which adds all files in the current directory (&lt;code&gt;.&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;From the point of view of the tree we now have another node and master has moved on to that one.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/gitrepo_tree2.png' alt='' /&gt;&lt;/p&gt;

&lt;h2 id='create_a_featurebranch'&gt;Create a (feature)branch&lt;/h2&gt;

&lt;p&gt;Branching and merging is what makes Git so powerful and for what it has been optimized, being a distributed version control system (VCS). Indeed, &lt;strong&gt;feature branches&lt;/strong&gt; are quite popular to be used with Git. Feature branches are created for every new kind of functionality you&amp;#8217;re going to add to your system and they are normally deleted afterwards once the feature is merged back into the main integration branch (normally the master branch). The advantage is that you can experiment with new functionality in a separated, isolated &amp;#8220;playground&amp;#8221; and quickly switch back and forth to the original &amp;#8220;master&amp;#8221; branch when needed. Moreover, it can be easily discarded again (in case it is not needed) by simply dropping the feature branch.&lt;/p&gt;

&lt;p&gt;But lets get started. First of all I create the new feature branch:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git branch my-feature-branch&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Executing&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git branch
* master
  my-feature-branch&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;we get a list of branches. The &lt;code&gt;*&lt;/code&gt; in front of &lt;code&gt;master&lt;/code&gt; indicates that we&amp;#8217;re currently on that branch. Lets switch to &lt;code&gt;my-feature-branch&lt;/code&gt; instead:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git checkout my-feature-branch
Switched to branch &amp;#39;my-feature-branch&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Again&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git branch
  master
* my-feature-branch&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;Note you can directly use the command &lt;code&gt;git checkout -b my-feature-branch&lt;/code&gt; to &lt;em&gt;create&lt;/em&gt; and &lt;em&gt;checkout&lt;/em&gt; a new branch in one step.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What&amp;#8217;s different to other VCS is that there is only &lt;em&gt;one working directory&lt;/em&gt;. All of your branches live in the same one and there is not a separate folder for each branch you create. Instead, when you switch between branches, Git will replace the content of your working directory to reflect the one in the branch you&amp;#8217;re switching to.&lt;/p&gt;

&lt;p&gt;Lets modify one of our existing files&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;Hi&amp;quot; &amp;gt;&amp;gt; hallo.txt
$ cat hallo.txt
Hello, world!
Hi&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230;and then commit it to our new branch&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git commit -a -m &amp;quot;modify file adding hi&amp;quot;
2fa266a] modify file adding hi
1 file changed, 1 insertion(+)&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;, this time I used the &lt;code&gt;git commit -a -m&lt;/code&gt; to add and commit a modification in one step. This works only on files that have already been added to the git repo before. New files won&amp;#8217;t be added this way and need an explicit &lt;code&gt;git add&lt;/code&gt; as seen before.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What about our tree?&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/gitrepo_tree3.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;So far everything seems pretty normal and we still have a straight line in the tree, but note that now &lt;code&gt;master&lt;/code&gt; remained where it was and we moved forward with &lt;code&gt;my-feature-branch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lets switch back to master and modify the same file there as well.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git checkout master
Switched to branch &amp;#39;master&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As expected, &lt;code&gt;hallo.txt&lt;/code&gt; is unmodified:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cat hallo.txt
Hello, world!&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lets change and commit it on master as well (this will generate a nice &lt;em&gt;conflict&lt;/em&gt; later).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;Hi I was changed in master&amp;quot; &amp;gt;&amp;gt; hallo.txt
$ git commit -a -m &amp;quot;add line on hallo.txt&amp;quot;
c8616db] add line on hallo.txt
1 file changed, 1 insertion(+)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Our tree now visualizes the branch:&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/gitrepo_tree4.png' alt='' /&gt;&lt;/p&gt;

&lt;h2 id='merge_and_resolve_conflicts'&gt;Merge and resolve conflicts&lt;/h2&gt;

&lt;p&gt;The next step would be to merge our feature branch back into &lt;code&gt;master&lt;/code&gt;. This is done by using the merge command&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git merge my-feature-branch
Auto-merging hallo.txt
CONFLICT (content): Merge conflict in hallo.txt
Automatic merge failed; fix conflicts and then commit the result.    &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As expected, we have a merge conflict in &lt;code&gt;hallo.txt&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Hello, world!
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
Hi I was changed in master
=======
Hi
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; my-feature-branch&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lets resolve it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Hello, world!
Hi I was changed in master
Hi&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;..and then commit it&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git commit -a -m &amp;quot;resolve merge conflicts&amp;quot;
[master 6834fb2] resolve merge conflicts&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The tree reflects our merge.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/gitrepo_tree5.png' /&gt;
    &lt;figcaption&gt;Fig 1: Tree state after the merge&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id='jump_to_a_certain_commit'&gt;Jump to a certain commit&lt;/h2&gt;

&lt;p&gt;Lets assume we want to jump back to a given commit. We can use the &lt;code&gt;git log&lt;/code&gt; command to get all the SHA identifiers that uniquely identify each node in the tree.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git log
commit 6834fb2b38d4ed12f5486ebcb6c1699fe9039e8e
Merge: c8616db 2fa266a
Author: = &amp;lt;juri.strumpflohner@gmail.com&amp;gt;
Date:   Mon Apr 22 23:19:32 2013 +0200

    resolve merge conflicts

commit c8616db8097e926c64bfcac4a09306839b008dc6
Author: Juri &amp;lt;juri.strumpflohner@gmail.com&amp;gt;
Date:   Mon Apr 22 09:39:57 2013 +0200

    add line on hallo.txt

commit 2fa266aaaa61c51bd77334516139597a727d4af1
Author: Juri &amp;lt;juri.strumpflohner@gmail.com&amp;gt;
Date:   Mon Apr 22 09:24:00 2013 +0200

    modify file adding hi

commit 03883808a04a268309b9b9f5c7ace651fc4f3f4b
Author: Juri &amp;lt;juri.strumpflohner@gmail.com&amp;gt;
Date:   Mon Apr 22 09:13:49 2013 +0200

    add another file with some other content

commit aad15dea687e46e9104db55103919d21e9be8916
Author: Juri &amp;lt;juri.strumpflohner@gmail.com&amp;gt;
Date:   Mon Apr 22 08:58:51 2013 +0200

    Add my first file    &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Take one of the identifiers (also if it isn&amp;#8217;t the whole one, it doesn&amp;#8217;t matter) and jump to that node by using the &lt;code&gt;checkout&lt;/code&gt; command&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git checkout c8616db
Note: checking out &amp;#39;c8616db&amp;#39;.

You are in &amp;#39;detached HEAD&amp;#39; state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c8616db... add line on hallo.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note the comment git prints out. What does that mean? &lt;strong&gt;Detached head&lt;/strong&gt; means &amp;#8220;head&amp;#8221; is no more pointing to a branch &amp;#8220;label&amp;#8221; but instead to a specific commit in the tree.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can think of the &lt;strong&gt;HEAD&lt;/strong&gt; as the &amp;#8220;current branch&amp;#8221;. When you switch branches with &lt;code&gt;git checkout&lt;/code&gt;, the HEAD revision changes to point to the tip of the new branch. &lt;span&gt;&amp;#8230;&lt;/span&gt; It is possible for HEAD to refer to a specific revision that is not associated with a branch name. This situation is called a &lt;a href='http://git-scm.com/docs/git-checkout#_detached_head'&gt;detached HEAD&lt;/a&gt;. &lt;cite&gt;&lt;a href='http://stackoverflow.com/a/2304106/50109'&gt;Stackoverflow Post&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Basically when I now change hallo.txt and commit the change, the tree looks as follows: &lt;figure&gt;
    &lt;img src='/blog/assets/imgs/gitrepo_tree6.png' /&gt;
    &lt;figcaption&gt;Detached head state&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the newly created node has no label on it. The only reference that currently points towards it is &lt;code&gt;head&lt;/code&gt;. However, if we now switch to master again then the previous commit will be lost as we have no way of jumping back to that tree node.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  576bcb8 change file undoing previous changes

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name 576bcb8239e0ef49d3a6d5a227ff2d1eb73eee55

Switched to branch &amp;#39;master&amp;#39;    &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And in fact, git is so kind to remind us about this fact. The tree looks now again as in figure 6.&lt;/p&gt;

&lt;h2 id='rollback'&gt;Rollback&lt;/h2&gt;

&lt;p&gt;Jumping back is nice, but what if we want to &lt;strong&gt;undo&lt;/strong&gt; everything back to the state before the merge of the feature branch? It is as easy as&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git reset --hard c8616db
HEAD is now at c8616db add line on hallo.txt&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/gitrepo_tree4.png' /&gt;
    &lt;figcaption&gt;The tree after the reset&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The generic syntax here is &lt;code&gt;git reset --hard &amp;lt;tag/branch/commit id&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id='undo_uncommitted_changes'&gt;Undo Uncommitted Changes&lt;/h2&gt;

&lt;p&gt;Another common scenario of &amp;#8220;undoing&amp;#8221; stuff is to simply discard local, yet uncommitted changes.&lt;/p&gt;

&lt;h3 id='files_not_staged_for_a_commit'&gt;Files Not Staged For a Commit&lt;/h3&gt;

&lt;p&gt;Assume you modified a file. Executing &lt;code&gt;git status&lt;/code&gt; would result in&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git status
# On branch master
# Changes not staged for commit:
#   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)
#   (use &amp;quot;git checkout -- &amp;lt;file&amp;gt;...&amp;quot; to discard changes in working directory)
#
#       modified:   hallo.txt
#
no changes added to commit (use &amp;quot;git add&amp;quot; and/or &amp;quot;git commit -a&amp;quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So far nothing has been added to your local Git repo, nor has it been staged (registered) for being committed. What would it mean to discard those changes?? Think about the Git tree. Simply to get (checkout) the latest version of that file, right??&lt;/p&gt;

&lt;p&gt;Thus,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git checkout hallo.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;performs our &amp;#8220;undo&amp;#8221;. A further&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git status
# On branch master
nothing to commit, working directory clean&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id='files_staged_for_a_commit'&gt;Files Staged for a Commit&lt;/h3&gt;

&lt;p&gt;The other case might be when you modified a file and already staged it for being committed through a &lt;code&gt;git add&lt;/code&gt; commit.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git status
# On branch master
# Changes to be committed:
#   (use &amp;quot;git reset HEAD &amp;lt;file&amp;gt;...&amp;quot; to unstage)
#
#       modified:   hallo.txt
#&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A &lt;code&gt;git checkout&lt;/code&gt; wouldn&amp;#8217;t have any effect in this case, but instead (if you read what git printed on the status output) we have to do a &lt;strong&gt;reset&lt;/strong&gt;. Why? Because the &lt;code&gt;git add&lt;/code&gt; already created a node in the Git tree (actually not 100% correct: &lt;a href='http://stackoverflow.com/questions/3689838/difference-between-head-working-tree-index-in-git'&gt;see Git index vs. working tree&lt;/a&gt; for more details) which have not yet been committed yet, however. Therefore we need to &amp;#8220;reset&amp;#8221; our current pointer to HEAD which is the top of our current branch.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git reset HEAD hallo.txt
Unstaged changes after reset:
M       hallo.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and consequently:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git status
# On branch master
# Changes not staged for commit:
#   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)
#   (use &amp;quot;git checkout -- &amp;lt;file&amp;gt;...&amp;quot; to discard changes in working directory)
#
#       modified:   hallo.txt
#
no changes added to commit (use &amp;quot;git add&amp;quot; and/or &amp;quot;git commit -a&amp;quot;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We&amp;#8217;re now again in the state when we have local changes &lt;em&gt;not yet staged for a commit&lt;/em&gt; and can therefore use the &lt;code&gt;checkout&lt;/code&gt; command to discard them. A quicker way of doing so is to use the&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git reset --hard HEAD&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;command which will do an un-staging + checkout in one command.&lt;/p&gt;

&lt;h2 id='sharingsynching_your_repository'&gt;Sharing/Synching your Repository&lt;/h2&gt;

&lt;p&gt;Ultimately we want to share our code, normally by synching it to a central repository. For doing so, we have to add a &lt;strong&gt;remote&lt;/strong&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git remote add origin git@github.com:juristr/intro.js.git&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To see whether I succeeded, simply type:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git remote -v&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which lists all of the added remotes. Now we need to &lt;strong&gt;publish our local branch master&lt;/strong&gt; to the remote repository. This is done like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git push -u origin master&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And we&amp;#8217;re done.&lt;/p&gt;

&lt;p&gt;The real powerful thing is that you can add multiple different remotes. This is often used in combination with cloud hosting solutions for deploying your code on your server. For instance, you could add a remote named &amp;#8220;deploy&amp;#8221; which points to some cloud hosting server repository, like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git remote add deploy git@somecloudserver.com:juristr/myproject&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and then whenever you want to publish your branch you execute a&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git push deploy&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id='cloning'&gt;Cloning&lt;/h3&gt;

&lt;p&gt;Similarly it works if you&amp;#8217;d like to start from an existing remote repository. The first step that needs to be done is to &amp;#8220;checkout&amp;#8221; the source code which is called &lt;strong&gt;cloning&lt;/strong&gt; in Git terminology. So we would do something like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git clone git@github.com:juristr/intro.js.git
Cloning into &amp;#39;intro.js&amp;#39;...
remote: Counting objects: 430, done.
remote: Compressing objects: 100% (293/293), done.
remote: Total 430 (delta 184), reused 363 (delta 128)
Receiving objects: 100% (430/430), 419.70 KiB | 102 KiB/s, done.
Resolving deltas: 100% (184/184), done.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will create a folder (in this case) named &amp;#8220;intro.js&amp;#8221; and if we enter it&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd intro.js/&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and check for the remotes we see that the according tracking information of the remote repository is already set up&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git remote -v
origin  git@github.com:juristr/intro.js.git (fetch)
origin  git@github.com:juristr/intro.js.git (push)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can now start the commit/branch/push cycle just normally.&lt;/p&gt;

&lt;h2 id='resources_and_links'&gt;Resources and Links&lt;/h2&gt;

&lt;p&gt;The scenarios above were the simples, but at the same time probably also the most used ones. But there&amp;#8217;s a lot more Git is capable of. To get more details you may want to consult the links below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://gitready.com/'&gt;http://gitready.com/&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://git-scm.com/book'&gt;Book: Pro Git by Scott Chacon&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://try.github.io/'&gt;Try Git in 15 minutes&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.youtube.com/watch?v=ZDR433b0HJY&amp;amp;feature=youtu.be&amp;amp;t=21m4s'&gt;Introduction to Git with Scott Chacon of GitHub&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://gist.github.com/juristr/5280366'&gt;My personal Git Cheat Sheet where I continuously add stuff I want to remember&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://gitimmersion.com/index.html'&gt;Git Immersion&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.slideshare.net/lemiorhan/git-branching-model'&gt;Git Branching Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have to add more, just let me know in the comments!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/08W1fJ3Gc1E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/04/git-explained</feedburner:origLink></entry>
 
 <entry>
   <title>My Sublime Text Setup</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/m8ZQZiOuJ8M/my-sublimetext-setup" />
   <updated>2013-04-10T00:00:00-07:00</updated>
   <id>http://juristr.com/blog/2013/04/my-sublimetext-setup</id>
   <content type="html">&lt;p&gt;I absolutely love this editor. A ridiculously fast editor which has everything you&amp;#8217;d love to have from a simple notepad to an advanced, extensible IDE with auto-completion, highlighting to whatever you&amp;#8217;d like to have. This post aims at mainly being a setup reference for myself.&lt;/p&gt;

&lt;p&gt;Actually, I&amp;#8217;m a bit late now, as a couple of days ago &lt;a href='http://blog.alexmaccaw.com/sublime-text'&gt;Alex MacCaw posted published exactly a similar post&lt;/a&gt; to this one here. So go and check that out as well, it contains a bunch of valuable information.&lt;/p&gt;

&lt;h2 id='sublime_configuration'&gt;Sublime Configuration&lt;/h2&gt;

&lt;p&gt;I usually have the following customizations:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    &amp;quot;font_size&amp;quot;: 16,
    &amp;quot;tab_size&amp;quot;: 4,
    &amp;quot;translate_tabs_to_spaces&amp;quot;: true
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The large font for being able to focus better on a smaller context which I found quite useful. Moreover it&amp;#8217;s more relaxing for my eyes.&lt;/p&gt;

&lt;p&gt;I usually leave the tab-size on &amp;#8220;4&amp;#8221; as that&amp;#8217;s what my other colleagues are accustomed to have in their IDEs. But note you might want to set it to &amp;#8220;2&amp;#8221;, especially when using CoffeeScript as it is more handy there.&lt;/p&gt;

&lt;h3 id='access_from_the_shell'&gt;Access from the Shell&lt;/h3&gt;

&lt;p&gt;In order to use sublime productively, one of the first steps is to make it accessible from your shell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On OSX&lt;/strong&gt;, the best way (as already Alex mentions in his post) is to create a symlink to your Sublime installation directory like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ln -s &amp;quot;/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl&amp;quot; /usr/bin/subl&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But since I&amp;#8217;m also working as a .Net developer and thus I&amp;#8217;m having a &lt;strong&gt;Windows machine&lt;/strong&gt; at work, I&amp;#8217;d like to have the same functionality there as well. As such I created a special directory under &lt;code&gt;C:\bin\utils&lt;/code&gt; which is linked in the &lt;code&gt;PATH&lt;/code&gt; environment variable. Inside that directory I created a &lt;code&gt;subl.cmd&lt;/code&gt; with the following content:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@echo off
&amp;quot;C:\Program Files\Sublime Text 3\sublime_text.exe&amp;quot; %1&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id='installing_packages'&gt;Installing Packages&lt;/h2&gt;

&lt;p&gt;Sublime wouldn&amp;#8217;t be that rich and useful without its packages (extensions basically). If you miss any kind of functionality, search for a package and I bet there is one already available.&lt;/p&gt;

&lt;h3 id='package_control'&gt;Package Control&lt;/h3&gt;

&lt;p&gt;Url: &lt;a href='http://wbond.net/sublime_packages/package_control'&gt;http://wbond.net/sublime_packages/package_control&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Package Control is simply a package manager for Sublime Text packages and extensions.&lt;/p&gt;

&lt;p&gt;Package Control can be &lt;strong&gt;installed&lt;/strong&gt; using Git. Navigate to the &amp;#8220;Packages&amp;#8221; folder (you can use your menu to find it &lt;code&gt;Preferences &amp;gt; Browse packages...&lt;/code&gt;). Then execute the following commands&lt;/p&gt;
&lt;pre class='nohighlight'&gt;
git clone https://github.com/wbond/sublime_package_control.git "Package Control"
cd "Package Control"
git checkout python3
&lt;/pre&gt;
&lt;p&gt;Restart Sublime and you&amp;#8217;re done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To use&lt;/strong&gt; Package Control simply press &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;Shift&lt;/kbd&gt;+&lt;kbd&gt;P&lt;/kbd&gt; to open the Sublime Menu and write&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt; for installing a new package&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Upgrade&lt;/strong&gt; for upgrading an existing package or&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Remove&lt;/strong&gt; for removing an existing package.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='my_packages'&gt;My Packages&lt;/h2&gt;

&lt;p&gt;Here&amp;#8217;s a list of packages I&amp;#8217;m currently using with Sublime Text. I&amp;#8217;ll add/remove this list over time as I find new interesting and useful ones. The installation instructions as well as the packages I listed should work on both, Sublime Text 2 as well as Sublime Text 3 (which is currently in private beta). But since I&amp;#8217;m using the latter, you might experience some trouble in using some of them with v2.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;, if there is no hint about the installation of a package, you can simply use Package Control for adding the extension to Sublime Text.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table class='table table-striped'&gt;
  &lt;thead&gt;
    &lt;th&gt;Package Name&lt;/th&gt;
    &lt;th&gt;Description&lt;/th&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/sergeche/emmet-sublime'&gt;Emmet&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Adds Zen-coding capabilities to Sublime Text. See the &lt;a href='https://github.com/sergeche/emmet-sublime#available-actions'&gt;docs&lt;/a&gt; for a list of available commands and usage instructions.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://bitbucket.org/CDuke/sublime-tfs/wiki/Home'&gt;Sublime TFS&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;A must have package if you have TFS as your version control system. After installation you should see a "TFS" menu which illustrates the major commands.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/titoBouzout/SideBarEnhancements'&gt;SideBar Enhancements&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Adds a bunch of useful functionalities to your Sublime's sidebar context menu like copy path, duplicate file, move, copy etc...&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/SublimeLinter/SublimeLinter'&gt;SublimeLinter&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Linting support for Sublime&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/spadgos/sublime-jsdocs'&gt;DocBlockr&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;
            Augments Sublime for easy commenting of your JavaScript code. Adds comment blocks like:
            &lt;pre&gt;
/**
 * [testFunction description]
 * @param  {[type]} param1
 * @param  {[type]} param2
 * @return {[type]}
 */
testFunction : function(param1, param2) {
}
&lt;/pre&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/alienhard/SublimeAllAutocomplete'&gt;AllAutocomplete&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;This package extends Sublime's amazing autocomplete support over multiple files.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/SublimeText/TrailingSpaces'&gt;TrailingSpaces&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Allows to configure Sublime to highlight or even automatically remove all trailing spaces. Take a look at the &lt;a href='https://github.com/SublimeText/TrailingSpaces'&gt;docs&lt;/a&gt; for instructions on how to configure it.&lt;br /&gt;
            My current setup adds the following to the user preferences:
            &lt;pre&gt;
{ "trailing_spaces_trim_on_save": true }&lt;/pre&gt;
            and this to the package's preferences
            &lt;pre&gt;
{
    "trailing_spaces_include_current_line": false
}&lt;/pre&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/dzhibas/SublimePrettyJson'&gt;SublimePrettyJson&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Prettifies a compressed JSON string in the editor.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/ttscoff/MarkdownEditing'&gt;MarkdownEditing&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;If you love markdown teh same way as I do, this plugin is definitely a must have.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href='https://github.com/revolunet/sublimetext-markdown-preview'&gt;MarkdownPreview&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Although I use this less often, it is quite useful for quickly previewing your created markdown document in a browser.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id='related_posts'&gt;Related Posts&lt;/h2&gt;

&lt;p&gt;Here are some posts I find (and I&amp;#8217;ll update over time) covering similar aspects around Sublime Text setup.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://drewbarontini.com/setup/sublime-text'&gt;http://drewbarontini.com/setup/sublime-text&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/m8ZQZiOuJ8M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/04/my-sublimetext-setup</feedburner:origLink></entry>
 
 <entry>
   <title>Modularity in JavaScript MVC Frameworks</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/6d2jRy9V1RM/modularity-in-javascript-frameworks" />
   <updated>2013-04-08T00:00:00-07:00</updated>
   <id>http://juristr.com/blog/2013/04/modularity-in-javascript-frameworks</id>
   <content type="html">&lt;p&gt;JavaScript MVC architectures are a de-facto standard when you create complex single-page JavaScript applications. But it doesn&amp;#8217;t stop here. MVC helps to separate reponsibilities for coordinating the data (model) and visualization (view), but it doesn&amp;#8217;t have a concept for coordination among an application&amp;#8217;s modules or widgets as you might call them.&lt;/p&gt;

&lt;h2 id='modules_i_dont_have_anything_similar_to_that'&gt;Modules? I don&amp;#8217;t Have Anything Similar to that!&lt;/h2&gt;

&lt;p&gt;Modules is probably not the right term in JavaScript applications, better call &amp;#8216;em &lt;strong&gt;widgets&lt;/strong&gt;. A widget is something atomic with a clear responsibility, a &lt;strong&gt;mini-app&lt;/strong&gt; basically that can be instantiated (possibly multiple times) on an arbitrary part of your application. You might not be accustomed to think from such perspective and therefore start straight off without building your app. That might work just fine initially, but once it gets more complex you&amp;#8217;ll get into trouble for sure. Therefore, next time when you start building something bigger, stop for a moment and try to identify possible widgets.&lt;/p&gt;

&lt;p&gt;Consider for example GitHub&amp;#8217;s site:&lt;/p&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/githubsite_modular_widgets.png' /&gt;
    &lt;figcaption&gt;Some potential widgets of the GitHub site&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I just quickly went over its UI and marked the regions that &amp;#8220;might&amp;#8221; possibly be independent widgets. I just highlighted some of the most obvious ones (but there are obviously a lot more than those).&lt;/p&gt;

&lt;p&gt;Separating your application into smaller parts is essential for keeping your architecture clean, reusable and mainly maintainable. The principle is a known concept in computer science: &amp;#8220;divide and conquer&amp;#8221;. Divide everything up into smaller parts which have&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lower complexity&lt;/li&gt;

&lt;li&gt;are easier to test&lt;/li&gt;

&lt;li&gt;easier to extend&lt;/li&gt;

&lt;li&gt;cause less headaches&lt;/li&gt;

&lt;li&gt;(etc&amp;#8230;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and then compose them again together to form the whole application.&lt;/p&gt;

&lt;h2 id='but_wait_my_widgets_have_to_communicate'&gt;But Wait: My Widgets Have to Communicate!&lt;/h2&gt;

&lt;p&gt;Sure, modules (or widgets) within your application need to communicate with each other. Such communication creates dependencies as &lt;em&gt;widget A&lt;/em&gt; needs to have a reference to &lt;em&gt;widget B&lt;/em&gt; if it needs to invoke some operation on it, right? Well, not necessarily, as that would again couple those widgets together and you couldn&amp;#8217;t exchange &lt;em&gt;widget B&lt;/em&gt; arbitrarily without having to also change &lt;em&gt;widget A&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Therefore, a common practice for creating a modular architecture is to decouple communication among components through &lt;strong&gt;event broadcasting&lt;/strong&gt; mechanisms. Candidates are pub/sub architectures but also the Observer pattern. Below are just some frameworks I picked out that target the issue of modularizing large-scale applications.&lt;/p&gt;

&lt;h3 id='aurajs__widget_architecture_for_backbone'&gt;AuraJS - Widget Architecture for Backbone&lt;/h3&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/aurajslogo.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href='https://twitter.com/addy'&gt;Addy Osmani&lt;/a&gt; - who is a big proponent of JavaScript architecture best practices - started a project called &lt;a href='https://github.com/aurajs'&gt;AuraJS&lt;/a&gt; with the intention to bring such modular widget-like architecture to Backbone.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Aura is a decoupled, event-driven architecture for developing widget-based applications. It takes advantage of patterns and best practices for developing maintainable applications and gives you greater control over widget-based development. Aura gives you complete control of a widget&amp;#8217;s lifecycle, allowing developers to dynamically start, stop, reload and clean-up parts of their application as needed. &lt;cite&gt;&lt;a href='https://github.com/aurajs/aura'&gt;AuraJS GitHub&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can read more on &lt;a href='https://github.com/aurajs/aura'&gt;its GitHub repo&lt;/a&gt; or &lt;a href='http://addyosmani.github.io/aura/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Addy also published some good reads related to this topic. You should definitely take a look at them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://addyosmani.com/largescalejavascript/'&gt;Patterns for Large-Scale JavaScript Application Architecture&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.slideshare.net/nzakas/scalable-javascript-application-architecture'&gt;Presentation: Scalable JavaScript Application Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='marionettejs__another_backbone_extension'&gt;MarionetteJS - Another Backbone Extension&lt;/h3&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/marionettejs_logo.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Similar to AuraJS, also &lt;a href='http://marionettejs.com/'&gt;MarionetteJS&lt;/a&gt; takes an event-driven architecture approach.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Backbone.Marionette is a composite application library for Backbone.js that aims to simplify the construction of large scale JavaScript applications. &lt;cite&gt;&lt;a href='http://marionettejs.com/'&gt;MarionetteJS Homepage&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A couple of weeks ago, they released v1.0 with components like &lt;code&gt;RegionManager&lt;/code&gt; and &lt;code&gt;EventAggregator&lt;/code&gt;. Those concepts sound quite similar to &lt;a href='http://compositewpf.codeplex.com/'&gt;PRISM&lt;/a&gt; (another modular application framework for .Net) and indeed when &lt;a href='http://lostechies.com/derickbailey/2013/03/25/marionettejs-v1-0-now-with-stickers/#comment-842786661'&gt;I asked the author&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
    &lt;p&gt;:) definitely not coincidence. I spent 5+ years building large scale winforms apps, and worked with prism just enough to understand the composite architecture it created. I built a very large system with patterns from the Enterprise Integration Patterns book, which are all present in PRISM and Marionette now. This is definitely the influence and direction that I took with Marionette :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id='decoupling_in_javascriptmvc'&gt;Decoupling in JavaScriptMVC&lt;/h2&gt;

&lt;p&gt;JavaScriptMVC has the concept of modularization already build-in since v3.2.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The secret to building large apps is to NEVER build large apps. Break up your applications into small pieces. Then assemble those testable, bite-sized pieces into your big application. &lt;cite&gt;&lt;a href='http://javascriptmvc.com/docs.html#!organizing'&gt;JMVC Docs: Organizing Your App&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Already the proposed folder structure of a JavaScriptMVC project suggests such approach. A couple of days ago, Justin (one of the creators of JavaScriptMVC) published two videos where he dives into this concept again.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/jmvc_justin_tweet.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;The videos give a preview of how the upcoming release of JavaScriptMVC v3.3 further facilitates such decoupling among widgets.&lt;/p&gt;

&lt;h3 id='part_1__mvc_architecture_and_the_observer_pattern'&gt;Part 1 - MVC Architecture and the Observer Pattern&lt;/h3&gt;
&lt;iframe src='http://www.youtube.com/embed/NZi5Ru4KVug' allowfullscreen='allowfullscreen' frameborder='0' height='315' width='560'&gt; &lt;/iframe&gt;
&lt;h3 id='part_2__development_process'&gt;Part 2 - Development process&lt;/h3&gt;
&lt;iframe src='http://www.youtube.com/embed/yFxDY5SQQp4' allowfullscreen='allowfullscreen' frameborder='0' height='315' width='560'&gt; &lt;/iframe&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/6d2jRy9V1RM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/04/modularity-in-javascript-frameworks</feedburner:origLink></entry>
 
 <entry>
   <title>Entity Framework: Intercepting SQL Queries for Contextual Logging</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/tJqGBJGc5pg/intercepting-sql-queries-for-contextual-logging" />
   <updated>2013-03-22T00:00:00-07:00</updated>
   <id>http://juristr.com/blog/2013/03/intercepting-sql-queries-for-contextual-logging</id>
   <content type="html">&lt;p&gt;Proper logging is of major importance and a must have in any serious application. Writing logs is trivial and is already done successfully by a couple of open source libraries. But that&amp;#8217;s just the first step in successful application logging. The far more difficult part is to have proper metrics in place that aggregate the relevant information in a proper way and provide the necessary contextual information for being able to reproduce problems. This is the only way to prevent you from being flooded with useless waste.&lt;/p&gt;

&lt;p&gt;While I&amp;#8217;d like to go a bit deeper into the concept of properly log and aggregate information, this post is just meant to evidence a specific case I just had of properly including contextual information into log entries. Specifically, a work mate of mine recently had a strange problem of getting an &amp;#8220;Insufficient Priviledges&amp;#8221; exception in his production environment. It appeared from now and then and was not really reproducable. Being related to some query execution, in that case it would be of major help to know which kind of query was executed by Entity Framework (in our case) against the underlying Oracle database that finally resulted in the mentioned exception.&lt;/p&gt;

&lt;p&gt;The immediate approach that came to my mind is to somehow hook in a profiler in between Entity Framework and the DB, to trace and memorize all executed SQL Queries for then - later - being able to take them out in case an exception was fired. That would make it particularly easy to include the SQL statement in the log message as a contextual information for those kind of exceptions.&lt;/p&gt;

&lt;h2 id='miniprofiler_to_the_help'&gt;MiniProfiler to the Help&lt;/h2&gt;

&lt;p&gt;I did a &lt;a href='http://codeclimber.net.nz/archive/2010/12/08/Logging-all-SQL-statements-done-by-Entity-Framework.aspx'&gt;quick&lt;/a&gt; &lt;a href='http://code.msdn.microsoft.com/EFProviderWrappers'&gt;googling&lt;/a&gt; about intercepting Entity Framework statements against the DB, found some stuff but they seemed rather complicated to setup as it required to wrap the EntityContext class etc.&lt;/p&gt;

&lt;p&gt;That was when MiniProfiler came to my mind. We&amp;#8217;re using to for live-profiling our application while developing it (have to blog about how I set that up for single-page JS apps). The nice nice thing about MiniProfiler is that it also traces SQL queries, their according execution time, whether you have duplicate queries and it even &lt;strong&gt;shows you a formatted SQL statement&lt;/strong&gt;. That was exactly what I needed and so I started to take a look at the &lt;a href='https://github.com/SamSaffron/MiniProfiler'&gt;MiniProfiler&amp;#8217;s source&lt;/a&gt; for being able to understand where I could hook in.&lt;/p&gt;

&lt;h2 id='installing_and_registering_miniprofiler'&gt;Installing and Registering MiniProfiler&lt;/h2&gt;

&lt;p&gt;Installation of MniProfiler is quite straightforward. Just head over to NuGet and install the &lt;a href='http://nuget.org/packages?q=MiniProfiler'&gt;packages you need&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Remember to properly initialize it for tracing Entity Framework queries (if that&amp;#8217;s what you&amp;#8217;re using)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    MiniProfiler.Settings.SqlFormatter = 
        new StackExchange.Profiling.SqlFormatters.InlineFormatter();
    MiniProfilerEF.Initialize();&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and then to call &lt;code&gt;MiniProfiler.Start()&lt;/code&gt; and &lt;code&gt;MiniProfiler.Stop()&lt;/code&gt; in the begin and end request events respectively. Note that such setup should already be included in the MVC3 NuGet package and just needs to be customized.&lt;/p&gt;

&lt;h2 id='querying_miniprofilers_logs'&gt;Querying MiniProfiler&amp;#8217;s Logs&lt;/h2&gt;

&lt;p&gt;MiniProfiler has a very intelligently designed structure. Everything starts from invoking &lt;code&gt;MiniProfiler.Current&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var profiling = MiniProfiler.Current;
if(profiling != null)
{
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which returns the currently running profiler (or null if none) for the current &lt;code&gt;HttpContext&lt;/code&gt;. What I was particularly interested in is to understand which of the profilings did actually contain SQL related stuff. This can be retrieved by using the according &lt;code&gt;HasSqlTimings&lt;/code&gt; property&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var profiling = MiniProfiler.Current;
if(profiling != null &amp;amp;&amp;amp; profiling.HasSqlTimings)
{
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then invoking the according &lt;code&gt;GetSqlTimings() &lt;/code&gt; method, returns a list of &lt;code&gt;SqlTiming&lt;/code&gt; objects containing - beside other timing specific information - all &amp;#8220;timings&amp;#8221; that involved an execution of an SQL statement.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var profiling = MiniProfiler.Current;
if(profiling != null &amp;amp;&amp;amp; profiling.HasSqlTimings)
{
    var timings = profiling.GetSqlTimings();
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally, &lt;code&gt;FormattedCommandString&lt;/code&gt; returns a formatted version of the executed SQL statement which you should be able to directly executable against your DB.&lt;/p&gt;

&lt;p&gt;So I endend up having some very simple piece of code that looked similar to this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private string CollectExecutedQueries()
{
    var stringbuilder = new StringBuilder();

    var profiling = MiniProfiler.Current;
    if (profiling != null &amp;amp;&amp;amp; profiling.HasSqlTimings)
    {
        var timings = profiling.GetSqlTimings();

        foreach (var timing in timings)
        {
            stringbuilder.AppendLine(Environment.NewLine + &amp;quot;----START QUERY----&amp;quot;);
            stringbuilder.AppendLine(timing.FormattedCommandString);
            stringbuilder.AppendLine(&amp;quot;----END QUERY----&amp;quot;);
        }
    }

    if (stringbuilder.Length &amp;gt; 0)
    {
        return Environment.NewLine + Environment.NewLine + &amp;quot;EXECUTED QUERIES: &amp;quot; + Environment.NewLine + stringbuilder.ToString();
    }

    else return &amp;quot;&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Please don&amp;#8217;t take this code as is&lt;/strong&gt;. I&amp;#8217;m just about revising this further and publishing it in production. That will reveal whether it really was that simple or whether it needs to be improved. But first tests are promising and it seems to work properly.&lt;/p&gt;

&lt;h2 id='conclusion'&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;What&amp;#8217;s impressive is the ease with which MiniProfiler allows you to intercept SQL commands sent to the DB and the immense insight you get. Reading out the executed SQL command is really just a very simple use case of what MiniProfiler offers. I could imagine scenarios of sending automated warn logs when having duplicate or slow queries in your production environment.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/tJqGBJGc5pg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/03/intercepting-sql-queries-for-contextual-logging</feedburner:origLink></entry>
 
 <entry>
   <title>Will I really Miss Google Reader??</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/tx6esYiv2ek/will-i-really-miss-google-reader" />
   <updated>2013-03-19T00:00:00-07:00</updated>
   <id>http://juristr.com/blog/2013/03/will-i-really-miss-google-reader</id>
   <content type="html">&lt;p&gt;I guess you probably heard the latest announcements about the Google Reader shutdown. I heard about it already about half a year ago I guess, but didn&amp;#8217;t want to believe initially. Now it seems to turn into reality, at least starting with July 1st. The search for alternatives has begun…&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m a Google Reader user from the very beginning, when it was launched as a labs product. I liked the idea of having a web app where to collect and consume my news. At that time, it was quite a new thing as most RSS readers were desktop-based apps. I liked the idea of being able to seemlessly access my news at my home computer or while studying at some university computer.&lt;/p&gt;

&lt;p&gt;That remained so, till now. GReader is my personal place for trying to consume the immense amount of news that get published on the web each day. Of course, it wasn&amp;#8217;t the only place, social networks, especially Twitter, have become more and more important for me to pick up some important article or an interesting link.&lt;/p&gt;

&lt;h2 id='seems_time_to_change'&gt;Seems Time to Change&lt;/h2&gt;

&lt;p&gt;Many passionate GReader users don&amp;#8217;t like the idea of moving to another product and so didn&amp;#8217;t I. They even &lt;a href='https://www.change.org/petitions/google-keep-google-reader-running?utm_campaign=share_button_action_box&amp;amp;utm_medium=facebook&amp;amp;utm_source=share_petition'&gt;started a petition&lt;/a&gt; against stopping Google Reader. Nice initiatives that show how many people liked the product. Honestly speaking, I don&amp;#8217;t think Google will change its plans. And then, after all, if a company decides to quit a product, even if they change and keep it running, it will quickly become obsolete due to missing investments. It&amp;#8217;s already now that - if you compare GReader to other products - it lacks updated features like maybe a more modern UI, social network integrations and it&amp;#8217;s ages since its mobile Android client received significant updates. So I think, it&amp;#8217;s really time to move forward.&lt;/p&gt;

&lt;p&gt;Is switching really so hard as it seems?? Personally, when I look at my recent habits, I notice that my usage of Google Reader (on the web) declined significantly in the last years. Mostly I just added new feeds and then consumed them on my mobile, through GReader Android, or even more often through other 3rd party apps like &lt;a href='https://play.google.com/store/apps/details?id=com.twentyfivesquares.press'&gt;Press&lt;/a&gt; or &lt;a href='https://play.google.com/store/apps/details?id=flipboard.app'&gt;Flipboard&lt;/a&gt;. So the day when the announcements about GReader&amp;#8217;s shutdown went out, I decided to look around for a worthy alternative.&lt;/p&gt;

&lt;h2 id='feedly__a_worthy_alternative'&gt;Feedly - A Worthy Alternative?&lt;/h2&gt;

&lt;p&gt;There are tons of articles now on the web presenting potential GReader alternatives. A quick search and while going over some of these, revealed &lt;a href='http://feedly.com'&gt;Feedly&lt;/a&gt; which immediately caught my attention.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/feedlywebsite.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Here just some of the features I discovered so far and already started to like.&lt;/p&gt;

&lt;p&gt;(TLDR: Just jump to my conclusion at the end)&lt;/p&gt;

&lt;h3 id='native_clients'&gt;Native Clients&lt;/h3&gt;

&lt;p&gt;Feedly has a bunch of &amp;#8220;native&amp;#8221; clients, for Chrome, Firefox, Safari, iOS and Android, all of them, however, build with HTML5 and JavaScript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;HTML5+Mobile.&lt;/strong&gt; We love the power and openness of the web. We work hard on making Web+HTML5 a vibrant alternative to native mobile app development. &lt;cite&gt;&lt;a href='http://feedly.com/about.html'&gt;Feedly About&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Chrome Extension adds a nice share button directly in the lower right corner for quickly subscribing to a new feed or for saving it to read it later.&lt;/p&gt;
&lt;figure&gt;
	&lt;img src='/blog/assets/imgs/feedlybutton.png' /&gt;
	&lt;img src='/blog/assets/imgs/feedlybutton_expanded.png' /&gt;
	&lt;figcaption&gt;Feedly button (collapsed and expanded)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The web frontend has been crafted with care for the details, something I especially note as a web dev. As such, for instance, menus disappear in the form of little icons when there is not enough space or fully expand on your 27&amp;#8221; monitor.&lt;/p&gt;

&lt;p&gt;The mobile clients look modern and clean and a big plus is that you can navigate throughout most of the app by exclusively using swipe gestures (a bit similar to Flipboard). Have a look at it by yourself:&lt;/p&gt;
&lt;iframe src='http://www.youtube.com/embed/o0op66h-r6k' allowfullscreen='allowfullscreen' frameborder='0' height='315' width='560'&gt; &lt;/iframe&gt;
&lt;p&gt;Note that although the video demoes the iOS app, the Android one is exactly the same (due to the HTML5 approach of building it).&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;negative&lt;/strong&gt; thing about Feedly for Android is its missing offline support. So far, when you start Feedly without an active connection, you&amp;#8217;ll get logged out. &lt;a href='https://getsatisfaction.com/feedly/topics/can_feedly_be_viewed_offline'&gt;Offline functionality is an extremely&lt;/a&gt; important feature for a news reader as - most often especially when I don&amp;#8217;t have any active connection - I&amp;#8217;d like to read through my feeds (that have been synched previously). If you like that as well, &lt;a href='https://getsatisfaction.com/feedly/topics/offline_support_for_mobile'&gt;go and vote this feature&lt;/a&gt;!&lt;/p&gt;

&lt;h3 id='customize_it_the_way_you_like'&gt;Customize it The Way You Like&lt;/h3&gt;

&lt;p&gt;It has tons of customization possibilities. Starting from the background, font or the way articles are being presented.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;No two feedlies are the same.&lt;/strong&gt; We all have unique appetites when it comes to feeding our minds. Add the sources that inspire you and the news that matters to you. Pick your layout and your theme. Feedly is your web. &lt;cite&gt;&lt;a href='http://feedly.com/about.html'&gt;Feedly About&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
	&lt;img src='/blog/assets/imgs/feedly_cust1.png' /&gt;
	&lt;img src='/blog/assets/imgs/feedly_cust2.png' /&gt;
	&lt;img src='/blog/assets/imgs/feedly_cust3.png' /&gt;
	&lt;figcaption&gt;Some of the layout possibilities&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id='feed_aggregation_and_social_integration'&gt;Feed Aggregation and Social Integration&lt;/h3&gt;

&lt;p&gt;Beside UI customizations Feedly also tries to seamlessly integrate news feeds from your social networks like Twitter or Facebook. A &amp;#8220;Today&amp;#8221; section gives a quick overview of the most important news of the current day and there are possibilities to search and add new feeds based on common categories.&lt;/p&gt;

&lt;h2 id='conclusion'&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Sounds like they have me already, right? Not yet, but I&amp;#8217;m quite satisfied in using the service for only a couple of days now. I had some minor issues in getting logged in on the Android client, but presumably that&amp;#8217;s due to the high number of requests they&amp;#8217;re now getting due to the GReader shutdown notice. The product looks really very promising, I like the mobile client and I have all the imaginable customization possibilities I like and liked to have with GReader:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mark as read while scrolling over articles&lt;/li&gt;

&lt;li&gt;mark all as read&lt;/li&gt;

&lt;li&gt;change the order of listing articles (old first)&lt;/li&gt;

&lt;li&gt;day/night mode on the mobile client (GReader client didn&amp;#8217;t even have this) - &amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sure, I&amp;#8217;m also missing some features like &amp;#8220;Search&amp;#8221; and there will come up a couple more when using Feedly for some weeks. Since there&amp;#8217;s a &lt;a href='http://blog.feedly.com/'&gt;team behind which is working hard on improving the service&lt;/a&gt; with the interest to become the best news reader app available, makes hope for new amazing features to come soon.&lt;/p&gt;

&lt;p&gt;As mentioned, one thing that puzzles me a bit is the missing offline capabilities of the Android client, so Feedly team, get that done soon ;). Vote for that feature &lt;a href='https://getsatisfaction.com/feedly/topics/offline_support_for_mobile'&gt;here&lt;/a&gt; if you&amp;#8217;d enjoy that as well.&lt;/p&gt;

&lt;p&gt;So let&amp;#8217;s see in a couple of weeks/months on whether I&amp;#8217;ll really miss Google Reader.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/tx6esYiv2ek" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/03/will-i-really-miss-google-reader</feedburner:origLink></entry>
 
 <entry>
   <title>Mocking Internal Interfaces with Moq</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/UYU2v-FYhRE/mocking-internal-interfaces-with-moq" />
   <updated>2013-03-07T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2013/03/mocking-internal-interfaces-with-moq</id>
   <content type="html">&lt;p&gt;When creating some Class Library you should pay attention to the visibility of its members and have a clear vision of what you&amp;#8217;d like to expose to its users and what on the other side should be hidden. When writing unit tests against such assemblies however, you obviously want to test everything, from the internal members to the externally exposes parts.&lt;/p&gt;

&lt;p&gt;Assume you have a class library named &lt;strong&gt;Base&lt;/strong&gt; containing the following classes and interfaces&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ICommandHandler&lt;/code&gt; - which is a publicly exposed interface&lt;/li&gt;

&lt;li&gt;&lt;code&gt;CommandHandler&lt;/code&gt; - basically its concrete implementation&lt;/li&gt;

&lt;li&gt;&lt;code&gt;IUndoRedoStack&amp;lt;T&amp;gt;&lt;/code&gt; - an interface that is used only internally&lt;/li&gt;

&lt;li&gt;&lt;code&gt;UndoRedoStack&amp;lt;T&amp;gt;&lt;/code&gt; - its concrete implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that I&amp;#8217;m programming exclusively against interaces as that&amp;#8217;s a major requirement for being able to create the necessary isolation for testing each component on its own.&lt;/p&gt;

&lt;h2 id='testing_classes_with_internal_visibility'&gt;Testing Classes with Internal Visibility&lt;/h2&gt;

&lt;p&gt;Lets take a closer look at the &lt;code&gt;CommandHandler&lt;/code&gt; class&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class CommandHandler : ICommandHandler
{
    //...
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When creating a test for the &lt;code&gt;CommandHandler&lt;/code&gt; class you would proceed as follows&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[TestClass]
public class CommandHandlerTest
{
    
    private CommandHandler commandHandler;

    [TestInitialize]
    public void Setup()
    {
        commandHandler = new CommandHandler();
    }

    [TestCleanup]
    public void Teardown()
    {
        commandHandler = null;
    }


    [TestMethod]
    publiic void ShouldExecuteAGivenCommand()
    {
        //the test content
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When you execute such test, it won&amp;#8217;t compile however. A best practice is to place the tests in a separate DLL (I usually name it like &lt;code&gt;Base.UnitTests&lt;/code&gt; if the tested assembly is called &lt;code&gt;Base&lt;/code&gt;) and as such, &lt;code&gt;CommandHandler&lt;/code&gt; won&amp;#8217;t be visible as it has been defined to only have internal visibility. In &lt;a href='http://juristr.com/blog/2013/01/aspnet-mvc-action-methods-testing-against-anonymous-return-types/'&gt;a previous blog post&lt;/a&gt; I already explained on how to overcome this issue, namely by specifying the &lt;code&gt;InternalsVisibleTo&lt;/code&gt; attribute in the tested assembly. Check out that blog post for more details.&lt;/p&gt;

&lt;h2 id='mocking_interfaces_with_internal_visibility_using_moq'&gt;Mocking Interfaces with Internal Visibility using Moq&lt;/h2&gt;

&lt;p&gt;Now, &lt;code&gt;CommandHandler&lt;/code&gt; has a dependency on &lt;code&gt;IUndoRedoStack&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class CommandHandler : ICommandHandler
{
    public CommandHandler(IUndoRedoStack&amp;lt;ICommand&amp;gt; undoRedoStack) 
    {
        //...
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;CommandHandler&lt;/code&gt; has an &lt;code&gt;Execute(command)&lt;/code&gt; method and suppose we&amp;#8217;d like to test the fact that when calling it with a given &lt;code&gt;ICommand&lt;/code&gt; object, that specific object gets added to the &lt;code&gt;undoRedoStack&lt;/code&gt;. We would write&lt;/p&gt;
&lt;pre class='linenums'&gt;
    [TestInitialize]
    public void Setup()
    {
        mockUndoRedo = new Mock&amp;lt;IUndoRedoStack&amp;lt;ICommand&amp;lt;&amp;lt;();
        handler = new CommandHandler(mockUndoRedo.Object);
    }

    [TestMethod]
    public void ShouldAddTheCommandToTheUndoStack()
    {
        //arrange
        var myCommand = new MyTestCommand();

        //act
        handler.Execute(myCommand);

        //assert
        mockUndoRedo.Verify(x =&amp;lt; x.AddItem(myCommand), Times.Once(), "The command should have been added to the undo stack");
    }
&lt;/pre&gt;
&lt;p&gt;When executing the test, it fails with&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Message: Initialization method Base.UnitTests.Command.CommandHandlerTest thre exception.&lt;br /&gt;Castle.DynamicProxy.Generators.GeneratorException:&lt;br /&gt;Castle.DynamicProxy.Generators.GeneratorException: Type Base.Command.IUndoRedoStack&lt;span&gt;&lt;span&gt;Base.Command.ICommand, Base, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&lt;/span&gt;&lt;/span&gt; is not public. Can not create proxy for types that are not accessible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem is the same, the &lt;a href='https://www.nuget.org/packages/Moq'&gt;Moq library&lt;/a&gt; I use for stubbing here, has no visibility on the internal member types and as such we need to add another &lt;code&gt;InternalsVisibleTo&lt;/code&gt; attribute specifically for Moq. The most intuitive thing to do would be&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[assembly: InternalsVisibleTo(&amp;quot;Moq&amp;quot;)]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;but unfortunately that doesn&amp;#8217;t work. Instead you need to add&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[assembly:InternalsVisibleTo(&amp;quot;DynamicProxyGenAssembly2&amp;quot;)]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;which is used internally by Moq to generate proxy classes. Note, as already described by this &lt;a href='http://sonofpirate.blogspot.it/2009/09/my-first-foray-into-unit-testing-with.html' rel='nofollow'&gt;blog post&lt;/a&gt; this only works if your assembly is not strongly-named, otherwise you have to include the assembly&amp;#8217;s PublicKey as well.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[assembly: InternalsVisibleTo(&amp;quot;DynamicProxyGenAssembly2, PublicKey=...&amp;quot;)]&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/UYU2v-FYhRE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/03/mocking-internal-interfaces-with-moq</feedburner:origLink></entry>
 
 <entry>
   <title>Interview with DZone</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/noCL0w62JyU/interview-with-dzone" />
   <updated>2013-03-06T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2013/03/interview-with-dzone</id>
   <content type="html">&lt;p&gt;DZone, where I&amp;#8217;m part as an &lt;a href='/blog/2012/04/joining-dzone-mvb-program/'&gt;MVB&lt;/a&gt;, recently contacted me for an interview for their weekly newsletter edition. Yesterday it &lt;a href='http://java.dzone.com/articles/dev-week-juri-strumpflohner'&gt;got published&lt;/a&gt;. If you&amp;#8217;re interested in their newsletter, the best way is to follow DZone on their &lt;a href='https://www.facebook.com/pages/DZone/259639764711'&gt;Facebook page&lt;/a&gt;. Here&amp;#8217;s the interview in its full length.&lt;/p&gt;

&lt;h2 id='hi_juri_thanks_for_talking_to_us_what_have_you_been_working_on_lately'&gt;Hi Juri! Thanks for talking to us. What have you been working on lately?&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;ve been working on creating a new base architecture for our e-government web applications. Our main focus is on creating compelling web applications for the citizens and as such we wanted to take out the most of the web. About a year ago we therefore decided to start creating single page applications in JavaScript instead of just classic server-side web applications such as ASP.net WebForms. As a consequence I recently dig into the jungle of JavaScript MVC frameworks and started coaching our web devs to create JavaScript rich client apps using those frameworks. In specific we adopted Bitovi&amp;#8217;s JavaScriptMVC framework which is a very nice one, especially for JavaScript beginners. It is based on top of jQuery and provides already a full stack setup, from code generators, a package manager, test automation to code linter and builder. That&amp;#8217;s what it makes it a smaller entry barrier for newbies which don&amp;#8217;t want to bother with AMD, RequireJS, JS linters, builders etc. Unfortunately it isn&amp;#8217;t as popular as Backbone or Angular, but its recent developments with CanJS make some hope in that direction as well. Most recently I was also a technical reviewer of a book about web application development with JavaScriptMVC which will be published soon.&lt;/p&gt;

&lt;h2 id='what_has_most_excited_you_in_the_world_of_html5_and_javascript_recently'&gt;What has most excited you in the world of HTML5 and JavaScript recently?&lt;/h2&gt;

&lt;p&gt;There were many exciting developments that happened last year. When talking about HTML5 one is for sure that the HTML5 definition has been finally completed and is now ready for review. Other than that I think that every single project that emerges in the field of HTML5 and JavaScript development is a small exciting moment. Those projects make the entire scene richer and more valuable. One that has to be mentioned is for sure TodoMVC which is the only point of orientation in this jungle of MVC frameworks in the JavaScript world, a well curated and hugely educative project.&lt;/p&gt;

&lt;p&gt;Since I&amp;#8217;m working mainly in a world dominated by Microsoft technologies, I also really welcomed Microsoft’s investment into JavaScript as a first-class language for Win8 development. I&amp;#8217;m not yet sure how much success it will have, but it has a positive side-effect for our web devs as Microsoft will invest into the language which ultimately results in better dev tools (which partially has become true already with VS2012) and language enhancements and tools like TypeScript. Proper development tools are a factor of major importance and the lack of such tools is the first point I often heard criticising by &amp;#8220;classic&amp;#8221; web devs. But that&amp;#8217;s not entirely true. I&amp;#8217;ve been using the Chrome dev tools now for over a year intensively and it is amazing how fast they evolved. With proper extensions you have even two-way synchronization of source code changes and live browser reloading. Such evolutions, together with great tools like Sublime or Brackets are another exciting development for me.&lt;/p&gt;

&lt;h2 id='what_does_the_next_year_hold_for_web_apps'&gt;What does the next year hold for web apps?&lt;/h2&gt;

&lt;p&gt;2012 was definitely the year when JavaScript as a web programming language started to really emerge, with all the libraries and MVC frameworks that came out. A quick look at GitHub&amp;#8217;s language stats explains it all. Still, many web devs look with some skepticism at this evolution, probably because they first got in touch with JavaScript under different circumstances. In high school, JavaScript was taught as a scripting language for adding dynamic behavior to a static HTML page, not as a fully capable programming language. I think that 2013 has the potential to let JavaScript loose this kind of negative connotation and push itself further from just being a temporary hype to being the way modern web applications should be developed. Major improvements in development tools will help. Before-mentioned evolutions in the Chrome-integrated devtools and projects like Brackets look very promising and will make the life of web devs a lot easier. Beside the evolution of JavaScript “Harmony” this year, I’m also particularly excited about how the mobile web will evolve, especially hybrid mobile applications. PhoneGap or Apache Cordova started with ambitious goals in 2012 and I’m curious how its story continues.&lt;/p&gt;

&lt;h2 id='do_you_have_a_favorite_blogger'&gt;Do you have a favorite blogger?&lt;/h2&gt;

&lt;p&gt;Actually I do follow a lot of bloggers that cover quite a wide range of different topics. I can hardly tell a favorite one, it really depends what I’m currently interested in. At the moment, for instance, I do really appreciate the work done by Addy Osmani. It is just amazing, starting from his presentations and videos, his GitHub projects like TodoMVC and now Yeoman, to his open source books about Backbone Fundamentals or JavaScript Design Patterns. He does an amazing job in the field of evangelizing web technologies, obviously with the help from other amazing people like Paul Irish or Sindre Sorhus. Beside those, there&amp;#8217;s also Alex Young&amp;#8217;s DailyJS of course and Peter Cooper&amp;#8217;s weekly newsletters like HTML5 Weekly or JavaScript Weekly, all of them an absolute must for every serious JavaScript dev and web dev.&lt;/p&gt;

&lt;h2 id='you_practice_yoseikan_budo__could_you_tell_us_a_little_bit_about_how_you_got_started_does_it_trickle_into_other_aspects_of_your_life'&gt;You practice Yoseikan Budo &amp;#8211; could you tell us a little bit about how you got started? Does it trickle into other aspects of your life?&lt;/h2&gt;

&lt;p&gt;Sure, I started to practice Yoseikan about 13 years ago. Actually already as a child I always admired martial arts practitioners and started to imitate and study their techniques. Only about when I was 14 years old I had the chance to then practice it by myself and that was when I discovered Yoseikan Budo. I immediately loved it, mainly because of its variety of concepts and the way it is being taught. You receive a complete training in martial arts, very much like the old Samurai, techniques which emerge from Sumo, Judo or Aikido to Karate and Kendo. It never really gets boring, but instead you have the possibility to continuously discover and learn new things. And yes, it definitely trickles into other aspects of my life. I can just confirm what many say: it helps to keep your balance. For me its combination of physical activity and the concentration needed for executing certain techniques, is the absolute best way to mentally relax from my day to day work in front of the computer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks, Juri!&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/noCL0w62JyU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/03/interview-with-dzone</feedburner:origLink></entry>
 
 <entry>
   <title>The Coaching Architect</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/8m3nZV-eJ5I/the-coaching-architect" />
   <updated>2013-02-12T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2013/02/the-coaching-architect</id>
   <content type="html">&lt;p&gt;In this talk, &lt;a href='https://twitter.com/RoyOsherove'&gt;Roy Osherove&lt;/a&gt; speaks about how to become a better coach. A nice talk highlighting some of my personal principles I try to follow every day. Coaching others is a nice thing if you like it, but it also needs to be learned.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;iframe src='http://www.youtube.com/embed/uvwW_CRmWmo' allowfullscreen='true' frameborder='0' height='500' width='750'&gt; &lt;/iframe&gt;
&lt;h3 id='tldr'&gt;TL;DR&lt;/h3&gt;

&lt;p&gt;Ok&amp;#8230;, so &lt;a href='#conclusion'&gt;jump here&lt;/a&gt; then.&lt;/p&gt;

&lt;h2 id='talk_notes'&gt;Talk Notes&lt;/h2&gt;

&lt;p&gt;Here are my notes I took during the talk.&lt;/p&gt;

&lt;h3 id='problem'&gt;Problem&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;for some people, the definition of an architect is to make things right, to make sure everything goes well; to do things in the best way possible&lt;/li&gt;

&lt;li&gt;lot of architects fail because they cannot get their message across&lt;/li&gt;

&lt;li&gt;architect is a type of leader (in the area of design, architecture,&amp;#8230;)&lt;/li&gt;

&lt;li&gt;wishes (feeling they&amp;#8217;ll never come true): that team does practice TDD,&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='you_are_the_bottleneck'&gt;You are the Bottleneck&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;leader: one that is a bottleneck; a person to ask, to get answers&lt;/li&gt;

&lt;li&gt;being an architect makes you by definition a bottleneck&lt;/li&gt;

&lt;li&gt;problem: you never have time to learn new things, to create new stuff because you have become a bottleneck&lt;/li&gt;

&lt;li&gt;if you&amp;#8217;re asked to create a framework, don&amp;#8217;t do it if not absolutely needed. Instead, try to teach devs how to do it s.t. they get more independent. Otherwise you create another layer of ice between your mates&lt;/li&gt;

&lt;li&gt;Wrong: &amp;#8221;I&amp;#8217;m the only one that can do it/knows how to do it&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='role_of_a_leader'&gt;Role of a leader&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;make yourself unneeded (to remove yourself as bottleneck)&lt;/li&gt;

&lt;li&gt;create people around you with your knowledge, don&amp;#8217;t just be someone that provides guidance&lt;/li&gt;

&lt;li&gt;if you work with a team and after your work they didn&amp;#8217;t learn anything new, you failed, you missed the point of why you&amp;#8217;re there, what you get paid for&lt;/li&gt;

&lt;li&gt;grow the team that you have into the &lt;strong&gt;team you want to have&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;creating a self-organizing team, doesn&amp;#8217;t mean you get fired &amp;#8216;cause you&amp;#8217;re no more needed:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;By growing others to not need you, you will always be wanted, appreciated and highly valuable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id='leadership_is_tough'&gt;Leadership is tough&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&amp;#8220;I want it to solve it yourself&amp;#8221;; this doesn&amp;#8217;t mean you&amp;#8217;re not doing your job, on the contrary, you&amp;#8217;re teaching them how to solve it on their own, hence, you help them to grow and get better&lt;/li&gt;

&lt;li&gt;coach them to learn, otherwise they&amp;#8217;ll always come back to you and ask for that solution&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='how_to_grow_people__learning'&gt;How to grow people - Learning&lt;/h3&gt;

&lt;p&gt;Observations have shown that there are periods of slow learning followed by periods of very quick learning. The reason for such &lt;strong&gt;ravines before the fast growth&lt;/strong&gt; are because we first need to &amp;#8220;unlearn&amp;#8221; what we knew before in order to be able to acquire new knowledge and try something new. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when switching programming language: initially stupid, but then - knowing different programming languages - you know different kind of patterns, different viewpoints which make you more productive; teach you to think about a problem from various angles&lt;/li&gt;

&lt;li&gt;when starting with TDD. Initially you&amp;#8217;re awfully slow and you seem to not move ahead. But once you got it, your performance and quality of code will increase drammatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;To grow the team, we must first realize we can do this ourselves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mentoring others needs to be learned&amp;#8230;in fact, it might be uncomfortable initially. But in the end, the process of mentoring is a learning process for both, the mentor and the coached person.&lt;/p&gt;

&lt;h3 id='time'&gt;Time&lt;/h3&gt;

&lt;p&gt;Common symptoms: Others will do the task much slower than myself&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The key is to make time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are different kind of modes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;survival mode -&lt;/strong&gt; most teams are here; there is never time, to learn or practice new things; not to do TDD, not to write unit tests etc&amp;#8230;this is a self-perpetuating mode: since you never have time to do TDD, you don&amp;#8217;t write unit tests and hence your code quality will drammatically reduce, introducing new bugs which again take time to fix etc&amp;#8230;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;learning mode -&lt;/strong&gt; having enough time to learn and practice new things and actually using that time properly. &lt;em&gt;That&amp;#8217;s the stage where you can be a coach.&lt;/em&gt;&lt;br /&gt;Make time: increase tasks by at least 50% in order to create space to practice something new (i.e. Unit Testing).&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;self-organizing mode -&lt;/strong&gt; when doing enough learning, people will start solving their own problems and hence get &amp;#8220;self-organizing&amp;#8221;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='triangle_of_quality'&gt;Triangle of Quality&lt;/h3&gt;

&lt;p&gt;Goal is to not only have two of them, but all three: features, time and quality.&lt;/p&gt;

&lt;p&gt;Again, same rule, try to avoid being the bottleneck. You&amp;#8217;ll never be able to review all the code of your peers and as such, you have to teach them how to do it by themselves (shared code ownership).&lt;/p&gt;

&lt;p&gt;How do we lose quality? Dilemma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write tests, or get it done? Answer: Let it fix quickly and get the thing done. Feeling = good&lt;/li&gt;

&lt;li&gt;Another thing happening? Again, write tests or get done?? Last time? -&amp;gt; fix quickly -&amp;gt; so continue that way; Feeling = good; Result: year later: code sucks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But, &amp;#8220;the project is going to take 3 weeks without unit tests and 4 weeks with unit tests&amp;#8230;&amp;#8221;&lt;br /&gt;There is &lt;strong&gt;no&lt;/strong&gt; choice, this &lt;strong&gt;is the way things are done&lt;/strong&gt;. It&amp;#8217;s the same as saying &amp;#8220;the car costs $20,000 without wheels and $30,000 with them&amp;#8221;.&lt;br /&gt;&lt;strong&gt;Stand up for the values you believe you&amp;#8217;re right.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id='understand_why_behaviors_dont_work'&gt;Understand why behaviors don&amp;#8217;t work&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;For each behavior, The world is perfectly designed for that behavior to happen (Influencer - the power to change anything)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are different reasons why people may not follow certain behaviors.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Personal&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Motivation&lt;/li&gt;

&lt;li&gt;Ability&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Social&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Motivation&lt;/li&gt;

&lt;li&gt;Ability&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Environmental&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Motivation&lt;/li&gt;

&lt;li&gt;Ability&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Social motivation&lt;/strong&gt; are the people that draw you into a certain action. This is strongly related to group membership. As such, creating a support group might be helpful in convincing people to acquire certain behaviors (like doing TDD).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environmental ability&lt;/strong&gt; define the infrastructure around you, i.e. having an automated build server that executes the test you write in the process of performing TDD.&lt;br /&gt;&lt;strong&gt;Environmental motivation&lt;/strong&gt; on the other hand is strongly related to rewards. For instance, people might get rewarded for being able to quickly ship a task. As such, others, writing unit tests and thus shipping a bit more slowly, might get the feeling that their work isn&amp;#8217;t As such, doing a good job by writing automated tests for your code seem not to be appreciated.&lt;/p&gt;

&lt;h3 id='common_language'&gt;Common Language&lt;/h3&gt;

&lt;p&gt;The words we use when we promise something. Saying what you want to do, meaning it and to actually make it true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We need&amp;#8230;&lt;/li&gt;

&lt;li&gt;I could&amp;#8230;&lt;/li&gt;

&lt;li&gt;Why doesn&amp;#8217;t someone&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of them give you a way out, a &amp;#8220;permission&amp;#8221; to not do it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I will&amp;#8230;by&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a commitment of something real. Moreover if people have a problem saying it, you&amp;#8217;ll immediately know there might be problems (due to time constraints or whatever). So you can react on that. It helps to raise problems that might exist inside a team.&lt;/p&gt;

&lt;p&gt;But attention, you can make people to &lt;strong&gt;only commit to things that are under their own control&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id='conclusion'&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t be a bottleneck&lt;/strong&gt;, &lt;strong&gt;coach&lt;/strong&gt; the people around you. When people come to you about a problem, challenge them in order to help them learn and grow: &amp;#8220;What are you going to do about it?&amp;#8221;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Know how learning works&lt;/strong&gt; and how you can &lt;strong&gt;allocate time&lt;/strong&gt; in order to create spaces for learning and for moving people out of &amp;#8220;survival mode&amp;#8221; into &amp;#8220;learning mode&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Consider also potential problems that hinder the adopton of new practivces and their potential &lt;strong&gt;personal, social or environmental barriers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Also employ &lt;strong&gt;common language&lt;/strong&gt; which leads to more clear commitments.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/8m3nZV-eJ5I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/02/the-coaching-architect</feedburner:origLink></entry>
 
 <entry>
   <title>DZone MVB Goodies Box</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/7heqa60DbaY/dzone-mvb-goodies-box" />
   <updated>2013-02-10T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2013/02/dzone-mvb-goodies-box</id>
   <content type="html">&lt;p&gt;Yesterday morning I received a nice little box with a DZone label on it. Seems like they sent it to me as part of the &lt;a href='/blog/2012/04/joining-dzone-mvb-program/'&gt;MVB program&lt;/a&gt; I recently joined. What a surprise! Opening the package&amp;#8230;&lt;/p&gt;

&lt;p&gt;&amp;#8230;unveiled a nice letter:&lt;/p&gt;
&lt;div class='row-fluid'&gt;
  &lt;div class='span6'&gt;
    &lt;blockquote&gt;
      Dear Juri,&lt;br /&gt;&lt;br /&gt;
      
      Congratulations! As one of our top contributors we're sending you this package as a way to thank you for everything you do for DZone.&lt;br /&gt;&lt;br /&gt;
      We ended this year with over 650,000 members, more than 700 MVBs and an audience over 3 million strong. 2012 was...
    &lt;/blockquote&gt;
  &lt;/div&gt;
  &lt;img class='span6' src='/blog/assets/imgs/dzonethankletter.jpg' /&gt;
&lt;/div&gt;
&lt;p&gt;and looots of nice little goodies.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/dzonegoodiesoutlined.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Two nice DZone Refcardz about HTML5 WebSockets and Design Patterns, a DZone mug, a developer T-Shirt, a Tizen 8GB Flash Memory, a Manning Early Access Program discount, an iPad Mini Golden Ticket (for having the chance to win an iPad mini) and last but not least, Inter-Cubicle Ballistic Missile:&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/missiles.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;The result: a hard fight against my girl&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/girlmissilefight.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;So I&amp;#8217;d like to &lt;strong&gt;thank DZone&lt;/strong&gt; for the very nice and kind surprise. I&amp;#8217;m glad to be part of the MVB program and I hope I can provide some contributions this year as well.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/7heqa60DbaY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/02/dzone-mvb-goodies-box</feedburner:origLink></entry>
 
 <entry>
   <title>Test Your App Under Slow Network Speeds</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/zTVRn8nBim8/test-your-app-under-slow-network-speeds" />
   <updated>2013-02-01T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2013/02/test-your-app-under-slow-network-speeds</id>
   <content type="html">&lt;p&gt;I guess that I don&amp;#8217;t have to start talking about the importance of testing in the software development process. There are couple of different kind of tests which I&amp;#8217;m not going to mention now, but generally speaking a good test should verify the correct implementation of the business requirements but also test the software on its boundaries and edge cases.&lt;/p&gt;

&lt;h2 id='from_a_users_perception'&gt;From a User&amp;#8217;s Perception&lt;/h2&gt;

&lt;p&gt;Beside automated tests, often a good indicator might also be the personal perception when using the software. Sounds strange, but &lt;strong&gt;how does it feel&lt;/strong&gt; to use the application. Is it fluid, responsive or rather laggy and inconvenient to use. These kind of indicators are often hard to objectively define but they count a lot and might contribute more to the overall user satisfaction than you might actually think.&lt;/p&gt;

&lt;p&gt;Couple of days ago I got inspired by a Tweet between &lt;a href='https://twitter.com/addyosmani'&gt;Addy Osmani&lt;/a&gt; and &lt;a href='https://twitter.com/sindresorhus'&gt;Sindre Sorhus&lt;/a&gt;:&lt;/p&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/addy_sindre_tweetnetspeed.png' /&gt;
    &lt;figcaption&gt;&lt;a href='https://twitter.com/sindresorhus/status/291537387975229440'&gt;Tweet&lt;/a&gt; between Addy and Sindre about speed throttling tools&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id='do_you_test_your_application_under_different_network_speeds_how_often'&gt;Do you Test your Application under Different Network Speeds?? How often?&lt;/h2&gt;

&lt;p&gt;I can just remember to have done it once because it was an explicit non-functional requirement from our customer as there where people connecting through 56k modems(!!). Typically when developing mobile application this is an absolute must because mobile connections are highly vulnerable in terms of network connection failures or speed differences. As such, depending on your user&amp;#8217;s &lt;a href='http://www.clearinternetservice.org/'&gt;internet service provider&lt;/a&gt; and/or the availability or absense of broadband mobile networks, he might get quite different experiences when using your application.&lt;/p&gt;

&lt;p&gt;Modern web applications provide a lot of possibilities for bandwidth optimizations, especially also considering HTML5 additions like the different browser storage mechanisms. I&amp;#8217;m not going into too much details here but rather I&amp;#8217;d like to quickly show how you can test your application under potentially poor network conditions.&lt;/p&gt;

&lt;h2 id='how_to_simulate_different_network_types'&gt;How to Simulate Different Network Types&lt;/h2&gt;

&lt;h3 id='on_windows'&gt;On Windows&lt;/h3&gt;

&lt;p&gt;There are several tools available for windows. Probably the simplest approach is to use &lt;a href='http://www.fiddler2.com/fiddler2/'&gt;Fiddler2&lt;/a&gt;, a tool which you should have installed anyway as a web developer. Just download and start it. In the menu, there&amp;#8217;s an entry called &amp;#8220;Rules&amp;#8221;, open it and navigate to &amp;#8220;Performance&amp;#8221;. There you should see an item called &lt;strong&gt;&amp;#8220;Simulate Modem Speeds&amp;#8221;&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/fiddler2modemspeed.png' /&gt;
    &lt;figcaption&gt;Fiddler2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This will simulate a modem like network speed which allows you to test and fine-tune your webapp under more extreme, inconvenient situations.&lt;br /&gt;Actually there&amp;#8217;s also a &lt;a href='http://fiddlerdelayext.codeplex.com/'&gt;Fiddler plugin&lt;/a&gt; which lets you add a delay in ms to any kind of response. I did not test that one in depth, though.&lt;/p&gt;

&lt;h3 id='on_osx'&gt;On OSX&lt;/h3&gt;

&lt;p&gt;OSX has a tool called &lt;strong&gt;Network Link Conditioner&lt;/strong&gt; which allows you to do a similar job. To install it you need to first download XCode which is freely available in the App Store market. Once installed&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open XCode&lt;/li&gt;

&lt;li&gt;Navigate the menu XCode &amp;gt; Open Developer Tool &amp;gt; More Developer Tools. This will open Apple&amp;#8217;s website&lt;/li&gt;

&lt;li&gt;Download the &amp;#8220;Hardware IO Tools for XCode&amp;#8221;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src='/blog/assets/imgs/hardwareIoTools.png' /&gt;
  &lt;figcaption&gt;Download the Hardware IO Tools&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Once downloaded, open the package and install the &amp;#8220;Network Link Conditioner.prefPane&amp;#8221; tool&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/hardwaretools.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8230;which will automatically be installed on your preference pane. Here you go&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/netlinkconditioner.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Just select the desired speed option and activate it. The nice thing about this tool is that you have already a bunch of configurations at hand.&lt;/p&gt;

&lt;h3 id='other_tools'&gt;Other tools&lt;/h3&gt;

&lt;p&gt;I have to admit that I did not perform an in-depth research about other possible tools. Here are just some other potentially interesting ones I encountered.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://www.charlesproxy.com/'&gt;Charlesproxy&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://dev.opera.com/articles/view/robohydra-a-new-testing-tool-for-client-server-interactions/'&gt;RoboHydra&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://ws.apache.org/commons/tcpmon/'&gt;TCPMon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to add yours in the comment section.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/zTVRn8nBim8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/02/test-your-app-under-slow-network-speeds</feedburner:origLink></entry>
 
 <entry>
   <title>ASP.net MVC Action Methods: Testing Against Anonymous Return Types</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/9ZBo-MlPP4c/aspnet-mvc-action-methods-testing-against-anonymous-return-types" />
   <updated>2013-01-18T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2013/01/aspnet-mvc-action-methods-testing-against-anonymous-return-types</id>
   <content type="html">&lt;p&gt;I don&amp;#8217;t use dynamic types regularly, but there are always again situations when they come in quite handy. Here is one example of testing an MVC controller&amp;#8217;s return value.&lt;/p&gt;

&lt;p&gt;You might encounter the situation where you want to test the returned value of an ASP.net MVC controller. For instance you might have the following action method:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public JsonResult GetById(long id)
{
    var person = personRepository.GetById(id);
    return Json(person, JsonRequestBehavior.AllowGet);
}&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id='testing_an_action_method'&gt;Testing an Action Method&lt;/h2&gt;

&lt;p&gt;Then a corresponding simple test method could might look like this&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[TestMethod]
public void ShouldReturnAPersonWhenPassingAValidId()
{
    //Act
    var controllerData = personController.GetById(3);
    var person = controllerData.Data as Person;

    //Assert
    Assert.AreEqual(&amp;quot;Juri&amp;quot;, person.Firstname);
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When invoking the controller&amp;#8217;s action method you get the returned ActionResult. The actual data of interest is wrapped in its according &lt;code&gt;Data&lt;/code&gt; property.&lt;/p&gt;

&lt;h2 id='testing_against_anonymous_types'&gt;Testing against Anonymous Types&lt;/h2&gt;

&lt;p&gt;It gets more interesting when you return anonymous types as in this dummy example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public JsonResult CalculateValue()
{
    return Json(new { Sum = 10 }, JsonRequestBehavior.AllowGet);
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;How do you verify that the returned object&amp;#8217;s property &lt;code&gt;Sum&lt;/code&gt; contains the value 10??&lt;/strong&gt; Reflection would be one possibility, but with the &lt;strong&gt;dynamic types&lt;/strong&gt; it&amp;#8217;s even easier.&lt;/p&gt;

&lt;p&gt;But caution, because &lt;em&gt;anonymous types are internal&lt;/em&gt;, you need to add the &lt;code&gt;InternalsVisibleTo&lt;/code&gt; attribute on the tested assembly, s.t. the test project can access its internal objects. Assume you have a project &amp;#8220;AspMvcFrontEnd&amp;#8221; and a corresponding test project called &amp;#8220;AspMvcFrontEnd.Tests&amp;#8221; and that the project name corresponds to the produced assembly name. Then you would have to add the following line &lt;strong&gt;to the &lt;code&gt;AssemblyInfo.cs&lt;/code&gt; of the assembly you&amp;#8217;re testing, that is the one hosting the controllers&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[assembly: InternalsVisibleTo(&amp;quot;AspMvcFrontEnd.Tests&amp;quot;)]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The corresonding test can then be written in quite a simple form like this (note the definition of the dynamic type):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[TestMethod]
public void ShouldReturnAnAnonymousTypeWithSumEq10()
{
    //Act
    dynamic obj = controller.CalculateValue().Data;

    //Assert
    Assert.AreEqual(10, obj.Sum, &amp;quot;the sum should be eq to 10&amp;quot;);
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Quite an elegant approach in contrast to a solution by using reflection.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/9ZBo-MlPP4c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/01/aspnet-mvc-action-methods-testing-against-anonymous-return-types</feedburner:origLink></entry>
 
 <entry>
   <title>How to Stay Up To Date On Web Technology</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/s1ZtuSZ2R7E/how-to-stay-up-to-date-on-web-technology" />
   <updated>2013-01-11T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2013/01/how-to-stay-up-to-date-on-web-technology</id>
   <content type="html">&lt;p&gt;The web is evolving extremely fast, especially in the recent years I have the feeling that it really got up to speed. Just think about JavaScript two years ago compared to today. The same holds for the browser vendors. Hence as a web developer you have to keep yourself up to date on the current web technologies. This is important for being able to make your evaluations on what is just trendy and what has future.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a nice slideshow from Chris Coyier about how to stay up to date on web technology.&lt;/p&gt;
&lt;script class='speakerdeck-embed' src='//speakerdeck.com/assets/embed.js' async='true' data-id='5112451026bf013092b722000a1d8877'&gt; &lt;/script&gt;
&lt;h2 id='my_personal_suggestions'&gt;My personal suggestions&lt;/h2&gt;

&lt;p&gt;Here are some of my experiences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;be social -&lt;/strong&gt; yep, also on the web, so &lt;a href='/blog/2012/02/dont-rant-become-social-and-contribute/'&gt;&amp;#8220;don&amp;#8217;t rant, become social and contribute&amp;#8221;&lt;/a&gt;. There are so many nice places, like &lt;a href='http://stackoverflow.com'&gt;StackOverflow&lt;/a&gt;, &lt;a href='http://news.ycombinator.com/'&gt;Hackernews&lt;/a&gt;, GitHub,&amp;#8230; Participate &amp;#8594; discuss &amp;#8594; contribute &amp;#8594; learn&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;share -&lt;/strong&gt; &amp;#8230;what you created, your experiences, difficulties. Create your own blog to do so, it helps a lot in internalizing and reflecting about stuff&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;follow great people -&lt;/strong&gt; &amp;#8230;on their blogs, Twitter, GitHub,&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='resources_to_get_started'&gt;Resources to Get Started&lt;/h2&gt;

&lt;p&gt;Here are some starting points mentioned in the presentation and updated with some of mine&lt;/p&gt;

&lt;h3 id='websites_and_blogs'&gt;Websites and Blogs&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://css-tricks.com'&gt;css-tricks.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://csswizardry.com'&gt;csswizardry.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://smashingmagazine.com'&gt;smashingmagazine.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://bricss.net'&gt;bricss.net&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://cognition.happycog.com'&gt;cognition.happycog.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://24ways.org'&gt;24ways.org&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://net.tutsplus.com'&gt;net.tutsplus.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://tympanus.com/codrops'&gt;tympanus.com/codrops&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://blog.webplatform.org'&gt;blog.webplatform.org&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://html5doctor.com'&gt;html5doctor.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://html5rocks.com'&gt;html5rocks.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://paulirish.com'&gt;paulirish.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://addyosmani.com'&gt;addyosmani.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://zomigi.com'&gt;zomigi.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://adactio.com'&gt;adactio.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://estelle.github.com'&gt;estelle.github.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.nczonline.net/'&gt;nczonline.net/&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://thecssninja.com'&gt;thecssninja.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.stubbornella.org'&gt;stubbornella.org&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://rmurphey.com/'&gt;rmurphey.com/&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://shoptalkshow.com'&gt;shoptalkshow.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://railscasts.com'&gt;railscasts.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://5by5.tv/webahead'&gt;5by5.tv/webahead&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://theindustry.cc'&gt;theindustry.cc&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://nonbreakingspace.tv'&gt;nonbreakingspace.tv&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://thisdeveloperslife.com/'&gt;thisdeveloperslife.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://5by5.tv/bigwebshow'&gt;5by5.tv/bigwebshow&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://theeastwing.net'&gt;theeastwing.net&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://build-podcast.com'&gt;build-podcast.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://unmatchedstyle.com/bizcraft'&gt;unmatchedstyle.com/bizcraft&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='on_twitter'&gt;On Twitter&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://twitter.com/elijahmanor'&gt;@elijahmanor&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/leaverou'&gt;@leaverou&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/miketaylr'&gt;@miketaylr&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/divya'&gt;@divya&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/rwd'&gt;@rwd&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/cowboy'&gt;@cowboy&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/davidwalshblog'&gt;@davidwalshblog&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/perishable'&gt;@perishable&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/simurai'&gt;@simurai&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://twitter.com/scottjehl'&gt;@scottjehl&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://twitter.com/addyosmani'&gt;@addyosmani&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='weekly_editions'&gt;Weekly Editions&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://web-design-weekly.com'&gt;web-design-weekly.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://css-weekly.com'&gt;css-weekly.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://javascriptweekly.com'&gt;javascriptweekly.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://html5weekly.com'&gt;html5weekly.com&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://statuscode.org/'&gt;statuscode.org&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://responsivedesignweekly.com'&gt;responsivedesignweekly.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obviously, feel free to follow me as well :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/s1ZtuSZ2R7E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/01/how-to-stay-up-to-date-on-web-technology</feedburner:origLink></entry>
 
 <entry>
   <title>Transformer TF101 meets Jelly Bean powered by CyanogenMod</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/TI8QtcKlmu0/transformer-tf101-meets-jelly-bean-powered-by-cyanogenmod" />
   <updated>2013-01-06T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2013/01/transformer-tf101-meets-jelly-bean-powered-by-cyanogenmod</id>
   <content type="html">&lt;p&gt;During the Christmas holidays I found a bit of time to upgrade my old (but still nicely working) Nexus One to CyanogenMod 7 and I&amp;#8217;m really happy about that. Today I decided to give my Asus Transformer TF101 a go as well.&lt;/p&gt;

&lt;p&gt;The problem is that apparently the TF101 doesn&amp;#8217;t get the update to Jelly Bean and I definitely didn&amp;#8217;t want to miss it, so &lt;a href='http://www.cyanogenmod.org/'&gt;CM&lt;/a&gt; is the best available option. Unfortunately it turned out that rooting and flashing the Transformer TF101 isn&amp;#8217;t as smooth as I thought and it involved quite a lot of reading through forums till I managed to get it working on my device. As such, this post is intended to provide you with the right information in order to save you some time (and nerves) while upgrading to CyanogenMod.&lt;/p&gt;

&lt;h2 id='preface'&gt;Preface&lt;/h2&gt;

&lt;p&gt;Before continuing with this post here, please read through the official &lt;a href='http://wiki.cyanogenmod.org/index.php?title=Install_CM_for_tf101'&gt;CyanogenMod installation instructions for the TF101&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; By following the instructions presented by this page you device gets rooted which voids your device&amp;#8217;s warranty, may cause data loss or potential other damage. I&amp;#8217;m &lt;strong&gt;not responsible&lt;/strong&gt; in any way with such side effects but it is &lt;strong&gt;at your own risk&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id='specs_used_for_this_setup'&gt;Specs used for this setup&lt;/h3&gt;

&lt;p&gt;The upgrade has been performed on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asus Transformer TF101&lt;/li&gt;

&lt;li&gt;Kernel/firmware version 9.2.1.27&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;by using a &lt;em&gt;Win7 x64&lt;/em&gt; setup for rooting the device and flashing ClockworkMod.&lt;/p&gt;

&lt;h2 id='some_basics'&gt;Some Basics&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Boot into recovery:&lt;/strong&gt; Switch off your device. Then press &lt;kbd&gt;Volume DOWN&lt;/kbd&gt;+&lt;kbd&gt;Power button&lt;/kbd&gt; till you see the boot logo, then press &lt;kbd&gt;Volume UP&lt;/kbd&gt; again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter APX mode:&lt;/strong&gt; Switch off your device, connect it to your computer and press &lt;kbd&gt;Volume UP&lt;/kbd&gt;+&lt;kbd&gt;Power button&lt;/kbd&gt;.&lt;/p&gt;

&lt;h2 id='preparation_download_cm_and_gapps_package'&gt;Preparation: Download CM and GApps Package&lt;/h2&gt;

&lt;p&gt;Before starting it&amp;#8217;s good to download the necessary files and immediately place them on the devices internal storage (or sdcard mount) s.t. we have them ready when we need them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href='http://goo.im/devs/RaymanFX/downloads/CyanogenMod-10'&gt;Download&lt;/a&gt; the latest (unofficial) CM 10 version (I used cm_tf101-v6).&lt;/li&gt;

&lt;li&gt;&lt;a href='http://goo.im/gapps'&gt;Download&lt;/a&gt; the Google Apps package for Jelly Bean v 4.1.2, that is &amp;#8220;gapps-jb-20121011-signed.zip&amp;#8221;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that this is not an &lt;strong&gt;official CM version&lt;/strong&gt; but one build by some XDA developer from the CM&amp;#8217;s GitHub repository. See &lt;a href='http://forum.xda-developers.com/showthread.php?t=1858295'&gt;this forum entry&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After downloading the above mentioned files, copy them over to your device. If you have &lt;a href='http://www.howtogeek.com/125769/how-to-install-and-use-abd-the-android-debug-bridge-utility/'&gt;adb installed&lt;/a&gt; and your device connected via USB debugging this should be as easy as&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;adb push cm_tf101-v6.zip /sdcard/&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As of writing this post there is no &lt;strong&gt;official stable Jelly Bean CM10&lt;/strong&gt; release or release candidate. Hence in this installation I used an unofficial one. You might get and check the &lt;a href='http://get.cm/?device=tf101'&gt;CM download page for the TF101&lt;/a&gt;, however.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://forum.xda-developers.com/showthread.php?t=1858295'&gt;CyanogenMod 10 - Gierdo&amp;#8217;s Nightly Builds&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://plus.google.com/+CyanogenMod/posts/UhCMjr739TY'&gt;CyanogenMod&amp;#8217;s Google+ post about JB&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.androidauthority.com/eee-pad-transformer-tf101-android-4-1-stable-cyanogenmod-10-cm10-unofficial-115537/'&gt;How to upgrade TF101 to Jelly Bean&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.androidauthority.com/eee-pad-transformer-tf101-clockworkmod-recovery-6-touch-recovery-112408/'&gt;Upgrade to ClockworkMod 6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='rooting_and_installing_clockworkmod'&gt;Rooting and Installing ClockworkMod&lt;/h2&gt;

&lt;p&gt;The official &lt;a href='http://wiki.cyanogenmod.org/index.php?title=Install_CM_for_tf101'&gt;CM TF101 wiki page&lt;/a&gt; suggests the use of &lt;strong&gt;Wheelie&lt;/strong&gt; for loading ClockworkMod (a custom recovery) onto the Transformer. That approach &lt;strong&gt;didn&amp;#8217;t work for me&lt;/strong&gt;, however. When placing my Transformer into APX mode and after executing the mentioned command (see CM wiki entry), I always got&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wheelie did not detect a device in APX mode.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I googled quite a lot and there are lots of entries on the XDA forums with one-click root&amp;amp;flash approaches, however most of them didn&amp;#8217;t work as well. What you need to pay attention to is the &lt;strong&gt;kernel version (firmware)&lt;/strong&gt; you have installed. I had version &lt;strong&gt;9.2.1.27&lt;/strong&gt; while many of the root utilities are for older firmware versions which might also be the reason why they didn&amp;#8217;t work.&lt;/p&gt;

&lt;h3 id='1click_transformer_root_worked'&gt;&amp;#8220;1-Click Transformer Root&amp;#8221; worked!!&lt;/h3&gt;

&lt;p&gt;After a while I finally found the &lt;a href='http://forum.xda-developers.com/showthread.php?t=1689193'&gt;&lt;strong&gt;1-Click Transformer Root&lt;/strong&gt;&lt;/a&gt; which finally worked. You need Windows 7 (don&amp;#8217;t know if Win8 works as well) for executing the root processes, however.&lt;/p&gt;

&lt;p&gt;The tool makes rooting extremely easy, just follow the steps below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure you connect your running Transformer device to your computer. Also verify that you have USB debugging enabled in your settings.&lt;/li&gt;

&lt;li&gt;Just download the file and run the &amp;#8220;1-Click Transformer Root.bat&amp;#8221;&lt;/li&gt;

&lt;li&gt;Follow the instructions given by the bat file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your Transformer will boot multiple times and by the end your device should be rooted successfully.&lt;/p&gt;

&lt;p&gt;In order to then &lt;strong&gt;install the custom recovery&lt;/strong&gt; (i.e. ClockworkMod) you have to again start the &amp;#8220;1-Click Transformer Root.bat&amp;#8221; which now will present several options under which point 3 says &amp;#8220;Install CWM recovery&amp;#8221;. Choose that one and proceed. It should install &lt;em&gt;Rogue XM Recovery 1.5.0&lt;/em&gt; (CWM-based Recovery v5.0.2.8).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t use the ROM manager&lt;/strong&gt; for flashing ClockworkMod. See &lt;a href='http://forum.xda-developers.com/showthread.php?t=1671598'&gt;here&lt;/a&gt; for further details.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;(Note if you aren&amp;#8217;t able to download the file, just contact me as I should still have it somewhere)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id='installing_cm'&gt;Installing CM&lt;/h2&gt;

&lt;p&gt;If you successfully flashed ClockworkMod with the method mentioned before, then the Transformer should now be booted into recovery mode. The next steps involve&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating a Nandroid backup&lt;/li&gt;

&lt;li&gt;wiping the data&lt;/li&gt;

&lt;li&gt;installing the CM from zip&lt;/li&gt;

&lt;li&gt;installing the gapps package from zip&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Follow the installation instructions on the official &lt;a href='http://wiki.cyanogenmod.org/index.php?title=Install_CM_for_tf101'&gt;CM wiki page for the TF101&lt;/a&gt; for these steps.&lt;/p&gt;

&lt;h3 id='some_sidenotes'&gt;Some Sidenotes&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Nandroid backup -&lt;/strong&gt; If it gives you an error when backing up &lt;code&gt;/data&lt;/code&gt; try to verify whether there is enough space for the backup. In my case I had to delete the Dropbox cache. You may also want to change the backup location to the internal memory rather than to the SD card (which on the Transformer is just a virtual partition). &lt;a href='https://play.google.com/store/apps/details?id=com.google.android.diskusage&amp;amp;hl=en'&gt;DiskUsage&lt;/a&gt; is a nice Android app for analyzing the used space of your memory.&lt;/p&gt;

&lt;h2 id='up_and_running'&gt;Up and running&lt;/h2&gt;

&lt;p&gt;After successfully completing the steps before everything should be up and running.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/cm_jellybean_screenshot.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;So far the increase in speed is impressing, however if I manage I&amp;#8217;ll write a follow-up post with some more infos after using the ROM for a couple of days/weeks.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/TI8QtcKlmu0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2013/01/transformer-tf101-meets-jelly-bean-powered-by-cyanogenmod</feedburner:origLink></entry>
 
 <entry>
   <title>Retrospective 2012</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/3P5qItNEn-k/retrospective-2012" />
   <updated>2012-12-31T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2012/12/retrospective-2012</id>
   <content type="html">&lt;p&gt;Yes we&amp;#8217;re still &lt;a href='https://www.google.com/search?q=21.12.2012'&gt;alive&lt;/a&gt; ;) No jokes apart, it&amp;#8217;s time for a year retrospective.&lt;/p&gt;

&lt;p&gt;Normally, a retrospective consists more or less about asking the following three questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What did we do well?&lt;/li&gt;

&lt;li&gt;What did we do wrong?&lt;/li&gt;

&lt;li&gt;What could be improved?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a year recap, let&amp;#8217;s change it a bit.&lt;/p&gt;

&lt;h2 id='what_did_2012_bring'&gt;What did 2012 bring?&lt;/h2&gt;

&lt;p&gt;2012 was a successful year. Beside relocating to a new home together with my girlfriend I also managed to finish my exam to the &lt;a href='/blog/2012/10/2nd-dan-yoseikan-budo/'&gt;2nd Dan in Yoseikan Budo&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='new_blog_hosting_and_style'&gt;New Blog Hosting and Style&lt;/h3&gt;

&lt;p&gt;I didn&amp;#8217;t even recognize, but when browsing through the year recap posts of past years, one point was always a restyle of my blog.&lt;/p&gt;

&lt;p&gt;This year (actually &lt;a href='/blog/2012/09/im-relocating-my-domain-site-and-blog/'&gt;already in September&lt;/a&gt;), after about six years on Blogger, I completely changed the way of how my blog is being hosted and constructed, namely by using a static site generator, &lt;strong&gt;Jekyll&lt;/strong&gt;, hosted on GitHub. A couple of days ago I then renewed the style and overall appearance of the site as well. So, &lt;strong&gt;why the change and why the restylings?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;..because I &lt;strong&gt;like to have full control of what is going on&lt;/strong&gt;. While Blogger is a nice service with lots of customizations, its main focus is on allowing the average user to quickly build a blog with predefined templates and so on&amp;#8230;Customizations are not the focus, while Jekyll is simply &lt;em&gt;blogging for hackers&lt;/em&gt; ;)&lt;/li&gt;

&lt;li&gt;2nd, because I like nicely styled pages. For me, the &lt;strong&gt;page design is at least as important as good features and functionalities&lt;/strong&gt;. For many devs, CSS is something that frontend designers have to care about. But that&amp;#8217;s not entirely true. IMHO good web developers should know how CSS works, in-depth. What is definitely not their job is to make a good overall design by combining the right colors etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, the current design has been written from ground up by myself, obviously with the help of &lt;a href='http://twitter.github.com/bootstrap/'&gt;Bootstrap&lt;/a&gt; (and my girlfriend which had the role of combining the right colors, you know ;) ). The focus was to keep it simple with major importance on facilitating the reading of the posts itself as that&amp;#8217;s what the blog is for. So, I hope you enjoy it and as always, feedback is welcome!&lt;/p&gt;

&lt;h3 id='lots_of_javascript_coding'&gt;Lots of JavaScript Coding&lt;/h3&gt;

&lt;p&gt;This year was intensive JavaScript programming year. At work I introduced single-page JavaScript applications to our .Net developers. So instead of constructing the front-end server-side with ASP.net WebForms we switched over to creating our front-end layer with &lt;a href='http://javascriptmvc.com'&gt;JavaScriptMVC&lt;/a&gt; and a &amp;#8220;backend&amp;#8221; layer in ASP.net MVC exposing &lt;a href='/blog/2012/10/lessions-learned-dont-expose-ef-entities-to-the-client-directly/'&gt;JSON REST&lt;/a&gt; endpoints.&lt;/p&gt;

&lt;p&gt;I think JavaScript is ready and with all the tools in place and the amazing whole of libraries like jQuery, Modernizr etc people should really start to adopt this methodology. In the end, that&amp;#8217;s the language of the web which people have been trying to avoid so far as it was simply not usable. But still, out of this year&amp;#8217;s experience, the most hindering part which makes it quite tough initially is the lack of knowledge about available tools and this impression in devs&amp;#8217; mind of JavaScript not being a fully valuable language.&lt;/p&gt;

&lt;h3 id='my_top_blogs_and_news_resources'&gt;My Top Blogs and News Resources&lt;/h3&gt;

&lt;p&gt;I read tons of blogs and news which all get bundled for me by Google Reader. The ones that I probably read most and which come to my mind right now, are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://javascriptweekly.com/'&gt;JavaScriptWeekly&lt;/a&gt; and &lt;a href='http://html5weekly.com/'&gt;HTML5Weekly&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://dailyjs.com/'&gt;DailyJS&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.appliness.com/'&gt;Appliness&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Twitter (the stuff posted by the people I follow)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='conferences_1st_qcon_in_london_and_jsday_verona'&gt;Conferences: 1st QCon in London and JSDay (Verona)&lt;/h3&gt;

&lt;p&gt;Yep, this year was &lt;a href='/blog/2012/04/qcon-london-my-personal-recap/'&gt;my 1st QCon conference&lt;/a&gt; in London. It was amazing, with great speakers! And London was great as well btw. I actually returned to London for holidays a couple of month ago with my girlfriend. Really nice.&lt;/p&gt;

&lt;p&gt;In May I then attended the JSDay in Verona. The focus there was JavaScript development (server and client-side) as you might have guessed, with some very great guys around GitHub, NodeJitsu and even Crockford was there!&lt;/p&gt;

&lt;h2 id='so_what_about_2013'&gt;So, what about 2013?&lt;/h2&gt;

&lt;p&gt;You probably noticed that I&amp;#8217;m currently totally into JavaScript. So from that point of view I think that &lt;strong&gt;JavaScript will get more established&lt;/strong&gt; once new tools arrive. It&amp;#8217;s impressing to just see how fast the Chrome Dev tools (tip: use the Chrome Canary Channel!) get &lt;a href='/blog/2012/08/know-your-tools-become-javascript-power/'&gt;new&lt;/a&gt; &lt;a href='/blog/2011/08/chrome-developer-tools-12-tricks-to/'&gt;features&lt;/a&gt; and how they get better and better each day. And then - beside big players like Microsoft pushing the JavaScript market (see Win8 development and TypeScript) - there are really nice projects by Adobe like &lt;a href='http://brackets.io/'&gt;Brackets&lt;/a&gt;, but also the efforts they put into PhoneGap. So I&amp;#8217;m curious how this evolves in 2013.&lt;/p&gt;

&lt;p&gt;What I&amp;#8217;m curious as well is how the whole &lt;strong&gt;mobile HTML5 hybrid application development&lt;/strong&gt; evolves. At work we developed a prototype using PhoneGap and JavaScriptMVC. It works, but especially things like smooth transitions (especially on Android Gingerbread and lower) give the feeling of not being ready yet.&lt;/p&gt;

&lt;p&gt;So for 2013 I hope to again learn some new stuff, to be able to teach others great things, to get better in JavaScript development, I hope to maybe find the time to do some &lt;a href='/blog/tags/#Android'&gt;native Android development&lt;/a&gt; again and of course I&amp;#8217;m looking forward to attend some good conferences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I wish a Happy New Year 2013&lt;/strong&gt; and thanks for everyone who&amp;#8217;s following me.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/3P5qItNEn-k" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2012/12/retrospective-2012</feedburner:origLink></entry>
 
 <entry>
   <title>Gist: My New Devbook</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/HPrF0yEDPvA/gist-my-new-devbook" />
   <updated>2012-12-18T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2012/12/gist-my-new-devbook</id>
   <content type="html">&lt;p&gt;I always had the idea of having some kind of organized store, some kind of very simple knowledge base where I could memorize interesting stuff around software development which I encounter i my day-to-day business. A wiki wasn&amp;#8217;t suitable as it should be centered mainly around code, but still you should have the possiblity to add your text-based notes or a collection of links.&lt;/p&gt;

&lt;h2 id='code_notebook_aka_devbook_was_born'&gt;Code Notebook aka Devbook was born&lt;/h2&gt;

&lt;p&gt;When I started with my studies at the university about 7 years ago, we learned Java from ground up. And to be honest it was the first real programming language I learned, with all its concepts around object oriented programming and so on. Even though I had already created my personal utilities with VB and VBA at that time&amp;#8230;That was when I started &lt;strong&gt;Code Notebook&lt;/strong&gt;, a project to incorporate my need to store my code snippets and at the same time a very nice project for being able to directly apply the learned stuff.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/codenotebookjava.png' /&gt;
    &lt;figcaption&gt;1st version of Devbook, my 1st Java Swing client&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It was a Java Swing desktop client which at that time was based on a MS Access DB. The latter turned out to be one of the biggest limitations, but hey&amp;#8230;it worked for me at that time, and we haven&amp;#8217;t been introduced to &amp;#8220;real&amp;#8221; DBs at that time. But it had already some cool features like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real time search&lt;/li&gt;

&lt;li&gt;starring&lt;/li&gt;

&lt;li&gt;labelling of items for easy organization of codes&lt;/li&gt;

&lt;li&gt;generation of a set of static HTML pages out of &amp;#8220;public&amp;#8221; snippets which could then be easily put on a webserver for sharing with others - &amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='eclipse_rcp_clients'&gt;Eclipse RCP Clients&lt;/h3&gt;

&lt;p&gt;Then there came the time for &lt;a href='/blog/tags/index.html#RCP'&gt;Eclipse and its RCP platform&lt;/a&gt; and &lt;a href='/blog/tags/#jFace'&gt;everything related to it&lt;/a&gt;. That port of Code Notebook to Eclipse was purely experimental and all-in-all a playground for me to experiment with the RCP platform. From an architectural point of view an amazing construct with its plugin architecture and decoupled messaging system. From a programming perspective&amp;#8230;puh&amp;#8230;a steep learning curve!&lt;/p&gt;

&lt;h3 id='the_fascination_for_rich_web_clients'&gt;The Fascination for Rich Web Clients&lt;/h3&gt;

&lt;p&gt;Code Notebook worked just great and I used it a whole lot. But then came the time when I got fascinated for the web and the possibility to create rich client (GMail-like) web applications. I started to play around with GWT and it was when &lt;a href='http://www.mydevbook.com/'&gt;Devbook&lt;/a&gt;, the evolution of Code Notebook for the web, was born.&lt;/p&gt;
&lt;figure&gt;
    &lt;a href='/blog/assets/imgs/devbook_list.png'&gt;&lt;img src='/blog/assets/imgs/devbook_list.png' width='50%' /&gt;&lt;/a&gt;
    &lt;a href='/blog/assets/imgs/devbook_detail.png'&gt;&lt;img src='/blog/assets/imgs/devbook_detail.png' width='50%' /&gt;&lt;/a&gt;
    &lt;figcaption&gt;Devbook - a web based rich client powered by GWT and App Engine&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The client was written in GWT and hosted on Google App Engine. That was also the time when &lt;a href='/blog/tags/#GWT'&gt;my series of posts&lt;/a&gt; about it emerged on my blog, &lt;a href='/blog/2010/03/gwt-button-with-image-and-text/'&gt;some of which turned out to be a real success&lt;/a&gt; (based on the number of visitors).&lt;/p&gt;

&lt;p&gt;Unfortunately Devbook mainly remained an experimental project. I heavily used it for my personal needs, but due to time constraints (at university/work) I never really opened it up, but it remained in - what you could call - private beta.&lt;/p&gt;

&lt;h2 id='github_gists'&gt;GitHub Gists&lt;/h2&gt;

&lt;p&gt;&lt;a href='https://gist.github.com'&gt;GitHub Gists&lt;/a&gt; have existed already for a while and I also used them occasionally. But so far it never seemed quite complete in what it offered. A couple of days ago, GitHub &lt;a href='https://github.com/blog/1276-welcome-to-a-new-gist'&gt;announced a new release of Gist, a complete rewrite&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='https://f.cloud.github.com/assets/2/4907/259773c0-432e-11e2-869a-1da894bf0bd0.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;At it looks awesome in my opinion. It really incorporates now many things I&amp;#8217;ve always wanted and which in part I already implemented in the Devbook GWT client: it is centered around code (having a fully functional git repo under each gist), it has social features (sharing with others through commenting) and it is also flexible enough to not only place code, but also simply textual information (in the form of markdown gists).&lt;br /&gt;But read it yourself on &lt;a href='https://github.com/blog/1276-welcome-to-a-new-gist'&gt;their blog post&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='looking_back'&gt;Looking Back&lt;/h2&gt;

&lt;p&gt;That said, I guess &lt;strong&gt;Devbook&lt;/strong&gt; is now really obsolete. So far I never found a valuable alternative that really met my needs, but now I guess I&amp;#8217;ve found it. We&amp;#8217;ll see. &lt;strong&gt;So was it a waste of time, given that it never really went online?&lt;/strong&gt; Absolutely not. Looking back it was an awesome learning experience:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Notebook&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java programming&lt;/li&gt;

&lt;li&gt;experimenting with MVC like code architectures on top of Java Swing&lt;/li&gt;

&lt;li&gt;customization of standard library Swing lists (see the snippet list)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Notebook RCP&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eclipse RCP platform&lt;/li&gt;

&lt;li&gt;plugin architectures and decoupling possibilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Devbook GWT&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Web Toolkit and the Google App Engine cloud platform&lt;/li&gt;

&lt;li&gt;Spring Web framework&lt;/li&gt;

&lt;li&gt;Hibernate (together with GAEs data store)&lt;/li&gt;

&lt;li&gt;generally, developing rich ajax clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, enjoy Gist and keep sharing code!&lt;/p&gt;

&lt;h3 id='update'&gt;Update&lt;/h3&gt;

&lt;p&gt;A new app has been released: &lt;a href='http://www.gistboxapp.com/'&gt;GistBox&lt;/a&gt;. This is exactly the thing I always wanted to arrive ultimately but never had the time to realize it. Amazing piece of work.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/HPrF0yEDPvA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2012/12/gist-my-new-devbook</feedburner:origLink></entry>
 
 <entry>
   <title>Cerego - Learn Anything, Everywhere</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/wKb7bXFBASM/cerego-learn-anything-everywhere" />
   <updated>2012-12-17T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2012/12/cerego-learn-anything-everywhere</id>
   <content type="html">&lt;p&gt;It&amp;#8217;s now roughly 2 years I&amp;#8217;m out of university. While also at may day-to-day job I cannot and don&amp;#8217;t want to stop learning and getting better, the time at the university was probably the most intense in terms of studying and learning. As a dev I&amp;#8217;m continuously seeking for automation possibilities, so also to what regards my studying system.&lt;/p&gt;

&lt;p&gt;Already at the first years of my bachelor study period I started to think about how I could automate my learning process. I mean, it&amp;#8217;s always nearly the same. You have a given problem and you have to verify whether your brain has a good answer for it.&lt;/p&gt;

&lt;h2 id='the_approach'&gt;The Approach&lt;/h2&gt;

&lt;p&gt;I basically needed some kind of indicator that - while studying - continuously told me the %-age of stuff I already knew. There are two prerequisites, though:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;have a good set of notes&lt;/li&gt;

&lt;li&gt;be honest to yourself about how much you know&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The automation basically consisted in having a table of two columns: &lt;strong&gt;one containing a question, some buzzword and the 2nd column giving some hints or the solution itself&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At that time I put it down in a simple Excel sheet for putting down the stuff, normally already during the lectures itself, so there was no big overhead in having to create that list.&lt;/p&gt;

&lt;h2 id='the_qa_mode'&gt;The Q&amp;amp;A Mode&lt;/h2&gt;

&lt;p&gt;Well ok, so far so good, but where&amp;#8217;s the automation?? The automation consisted in having a program ask me the questions. In the Excel spreadsheet I had a really tiny VBA script which when switching to Q&amp;amp;A mode started to hide the column with the solution hints and started to randomly select some questions and present them to me. I answered the question for myself and then clicked the &amp;#8220;Check&amp;#8221; button which showed me my solution hints to check whether I was right/wrong. I then obviously had to rate myself on whether I was satisfied with my answer and click the corresponding &amp;#8220;ok&amp;#8221; or &amp;#8220;wrong&amp;#8221; button. At the end of each round I then had the % of known vs. wrong answers. When I reached 100% I was ready for the exam.&lt;/p&gt;

&lt;h3 id='hey_these_are_flash_cards'&gt;Hey, these are Flash Cards&lt;/h3&gt;

&lt;p&gt;Yep :). But at that time I didn&amp;#8217;t knew them. That was later when I found a flash-card app for iOS which allowed to select a Google Spreadsheet document to import the question and answers, exactly like in my original system.&lt;/p&gt;

&lt;p&gt;Just search the Android or Apple Store for the term &amp;#8220;Flash Cards&amp;#8221; and I&amp;#8217;m sure you&amp;#8217;ll find dozens of it.&lt;/p&gt;

&lt;h2 id='cerego__learning_made_easy'&gt;Cerego - Learning made easy&lt;/h2&gt;

&lt;p&gt;Recently Cerego appeared on my Twitter feed. And while I&amp;#8217;m no more actively using the Flash Card system as I don&amp;#8217;t have the need right know, I&amp;#8217;m always curious in new interesting ways of improving my learning.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cerego’s mission is to transform information into lasting knowledge. Its approach combines proven learning science with cloud technology to bring breakthrough learning solutions to a rapidly expanding global market for learning languages and other core domains of knowledge.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href='http://cerego.com/'&gt;Cerego&lt;/a&gt; is invite-only so far, but yesterday I got my invitation and immediately tried it out.&lt;/p&gt;

&lt;h3 id='find'&gt;Find&lt;/h3&gt;

&lt;p&gt;The interesting thing about Cerego is that it has already social features build-in (a must). That means you can find courses created by others &lt;figure&gt;
	&lt;img class='noborder' src='/blog/assets/imgs/findcourses.png' /&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;h3 id='learn'&gt;Learn&lt;/h3&gt;

&lt;p&gt;That means you can even learn things like the ASL alphabet. &lt;figure&gt;
	&lt;img class='noborder' src='/blog/assets/imgs/aslalphabet.png' /&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;h3 id='create'&gt;Create&lt;/h3&gt;
&lt;figure&gt;
  &lt;img class='noborder' src='/blog/assets/imgs/newcourse_details.png' /&gt;
&lt;/figure&gt;
&lt;p&gt;Creating new courses is as easy as&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uploading a couse image&lt;/li&gt;

&lt;li&gt;specifying the details like title, description and giving it some tags&lt;/li&gt;

&lt;li&gt;specifying whether it is intended to be public or private&lt;/li&gt;

&lt;li&gt;entering the questions + answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The editor for entering the questions is very handy. You just enter the question, &lt;kbd&gt;Tab&lt;/kbd&gt; the corresponding answer, &lt;kbd&gt;Enter&lt;/kbd&gt; and the focus will jump downwards to continue entering the next one. Win! &lt;figure&gt;
	&lt;img class='noborder' src='/blog/assets/imgs/newcourse_questions.png' /&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;h2 id='give_it_a_try'&gt;Give it a try!&lt;/h2&gt;

&lt;p&gt;If you&amp;#8217;re keen on learning new things, give it a try and &lt;a href='http://cerego.com'&gt;request an invite&lt;/a&gt;! It&amp;#8217;s free.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/wKb7bXFBASM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2012/12/cerego-learn-anything-everywhere</feedburner:origLink></entry>
 
 <entry>
   <title>Programming ASP.net MVC4 by J. Chadwick, T. Snyder and H. Panda</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/LtbfMzxL6m4/programming-aspnet-mvc4" />
   <updated>2012-12-14T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2012/12/programming-aspnet-mvc4</id>
   <content type="html">&lt;p&gt;This is one of the recent books I got from O&amp;#8217;Reilly. It is probably the most comprehensive and detailed one I&amp;#8217;ve encountered so far regarding ASP.net MVC development. More than 400 pages, from the very basics of the MVC pattern, client-side JavaScript and Mobile web development, application architecture to successfully deploying an ASP.net MVC application in production.&lt;/p&gt;
&lt;figure&gt;
    &lt;a href='http://oreillynet.com/pub/reviewproduct/874' rel='nofollow'&gt;&lt;img src='/blog/assets/imgs/coverprogrammingaspnet.gif' /&gt;&lt;/a&gt;
    &lt;figcaption&gt;Book cover; click to see other reviews&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id='for_beginners_and_experts'&gt;For Beginners and Experts&lt;/h2&gt;

&lt;p&gt;First of all, the book is very nicely structured and can be suggested to both, total ASP.net MVC beginners as well as to ASP.net MVC experts. Obviously, the latter will skip the initial chapters. Those mainly deal with the very fundamentals like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MVC design pattern&lt;/li&gt;

&lt;li&gt;setup of an MVC application&lt;/li&gt;

&lt;li&gt;core concepts like routing and authentication&lt;/li&gt;

&lt;li&gt;how the model, view and controller are implemented in ASP.net MVC4 (including details about RAZR engine&amp;#8230;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also the chapter &amp;#8220;ASP.net MVC for Web Forms Developers&amp;#8221; aims at providing an upgrade-path for Web Forms developers by explaining the differences, advantages and disadvantages.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;span&gt;&amp;#8230;&lt;/span&gt; for all of their commonality and similarities, the architecture and goals that drive the ASP.NET MVC and Web Forms Frameworks are fundamentally very different.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For the experts, on the other side, there are topics about&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;parallel, asynchronous and real-time data operations&lt;/li&gt;

&lt;li&gt;caching&lt;/li&gt;

&lt;li&gt;continuous quality control - &amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='a_little_insight'&gt;A Little Insight&lt;/h2&gt;

&lt;p&gt;Here a little insight in some of the topics mentioned in the book.&lt;/p&gt;

&lt;h3 id='web_application_architecture'&gt;Web Application Architecture&lt;/h3&gt;

&lt;p&gt;The book also dedicates an entire chapter to &amp;#8220;web application architecture&amp;#8221; treating topics and suggesting best practices related to the logical and physical design of the application.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src='/blog/assets/imgs/webapp_logicalarchitecture.png' /&gt;
    &lt;figcaption&gt;A high-level architectural view of a potential web application's logical structure from the book&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The chapter also mentions more commonly known best practices like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IoC (Inversion of Control) -&lt;/strong&gt; by describing the core concepts and differences to the Factory or Service locator pattern. Moreover the most common IoC libs are listed and it is highlighted how they nicely integrate into the MVC platform by using the MVC &lt;a href='&amp;quot;http://msdn.microsoft.com/en-us/library/system.web.mvc.dependencyresolver(v=vs.98'&gt;DependencyResolver class&lt;/a&gt;.aspx&amp;#8221;)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;SOLID -&lt;/strong&gt; class design principle&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;DRY principle&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table width='100%'&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src='/blog/assets/imgs/dependency_direct.png' /&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src='/blog/assets/imgs/dependency_factory.png' /&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src='/blog/assets/imgs/dependency_ioc.png' /&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;All of the concepts are nicely underlined with proper examples.&lt;/p&gt;

&lt;h3 id='javascript_and_clientside_templating_techniques'&gt;JavaScript and Client-Side Templating Techniques&lt;/h3&gt;

&lt;p&gt;For the sake of completeness, the book also enters into the (now more and more popular) client-side JavaScript development techniques. As such it treats topics like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;client-side validation with jQuery Validation&lt;/li&gt;

&lt;li&gt;client-side template engines (using the very popular Mustache engine)&lt;/li&gt;

&lt;li&gt;responding to ajax requests (with JSON)&lt;/li&gt;

&lt;li&gt;custom JSON model binder&lt;/li&gt;

&lt;li&gt;JSONP and how to add support for ASP.net MVC controllers&lt;/li&gt;

&lt;li&gt;CORS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also mentions a &lt;a href='http://juristr.com/blog/2012/10/lessions-learned-dont-expose-ef-entities-to-the-client-directly/'&gt;lessons learned&lt;/a&gt; which I experienced by myself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The other major drawback to working with complex objects is that they may be heavy or challenging to work with via JavaScript. A good practice to help avoid these challenges is to create a special, lightweight version of the entity called a data transfer object (DTO) that is more easily converted into JSON.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id='quality_control'&gt;Quality Control&lt;/h3&gt;

&lt;p&gt;The quality control part goes into the details for constructing a proper &lt;strong&gt;logging system&lt;/strong&gt; by describing on how to catch exceptions in an MVC environment, how to signal the user what happened up to building up a health monitoring system. It then enters into the topic of &lt;strong&gt;automated testing&lt;/strong&gt;, mentioning the kind of automated tests (Unit, Integration, Acceptance Tests), and their corresponding characteristics. Nice examples are also provided on how to test an ASP.net MVC model/controller and how you can keep your tests clean by factoring out duplicated code. The chapter concludes by describing on how to setup a fully functional &lt;strong&gt;automated build environment&lt;/strong&gt; with TFS.&lt;/p&gt;

&lt;h2 id='conclusion_and_rsum'&gt;Conclusion and Résumé&lt;/h2&gt;

&lt;p&gt;There&amp;#8217;s a lot more in the book than I could write here. It also talks about the new &lt;strong&gt;Web Api&lt;/strong&gt;, about &lt;strong&gt;security topics&lt;/strong&gt;, &lt;strong&gt;caching&lt;/strong&gt; as well as &lt;strong&gt;advanced data access&lt;/strong&gt; patterns. I really couldn&amp;#8217;t imagine anything that has been left out right now.&lt;br /&gt;That said, I guess by reading this post you should now have quite a good knowledge about whether this book is for you as well as how deep your knowledge is by reading through some of the buzz-words I mentioned. Personally I can really just suggest it to every .Net web developer as it treats all of the currently actual topics in a very detailed, clear and understandable manner.&lt;/p&gt;

&lt;p&gt;(Also do not miss the appendix on &amp;#8220;Best Practices&amp;#8221;!)&lt;/p&gt;

&lt;p&gt;&lt;a href='http://oreilly.com/bloggers/?cmp=ex-orm-blgr-juri-strumpflohner'&gt;&lt;img src='http://cdn.oreilly.com/bloggers/blogger-review-badge-200.png' alt='' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/LtbfMzxL6m4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2012/12/programming-aspnet-mvc4</feedburner:origLink></entry>
 
 <entry>
   <title>HowTo: Subscribe to Failed TFS Builds</title>
   <link href="http://feedproxy.google.com/~r/juristrumpflohner/~3/_txDOickFIM/howto-subscribe-to-failed-tfs-builds" />
   <updated>2012-11-23T00:00:00-08:00</updated>
   <id>http://juristr.com/blog/2012/11/howto-subscribe-to-failed-tfs-builds</id>
   <content type="html">&lt;p&gt;When you use a build server it is a must to get notified in case of build failures. Microsoft&amp;#8217;s Team Foundation server has different possibilities to achieve this: using the Build Notification Tool or through so-called Alerts.&lt;/p&gt;

&lt;p&gt;One of the prerequisites is the installation of the latest Team Foundation Power tools. You should find them easily by just &lt;a href='https://www.google.it/search?q=Install+Team+Foundation+Power+Tools&amp;amp;oq=Install+Team+Foundation+Power+Tools'&gt;googling&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='build_notification_tool'&gt;Build Notification Tool&lt;/h2&gt;

&lt;p&gt;The build notification tool is a rather small windows tool that lets you subscribe to your different TFS builds.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/buildnotificationtool_subscriptions.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;You then get notified with IM messenger like notifications.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/buildnotificationtool.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;The tool is very beta however. Most often it has quite some delays in the notifications and there are a couple of bugs in the subscription dialog. The little red/green icon in the taskbar immediately notifies you about any problems in your builds.&lt;/p&gt;

&lt;h2 id='tfs_alerts'&gt;TFS Alerts&lt;/h2&gt;

&lt;p&gt;Another possibility is to use the TFS alerts to get notified via email. Normally you can just right-click on the project of your team project and open the project alerts dialog.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/simplealertdialog.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;There you can register yourself for any &lt;strong&gt;build quality change&lt;/strong&gt;. That might just work fine for you. However, if you&amp;#8217;d like to get &lt;strong&gt;notified only for failing builds&lt;/strong&gt; then you have to define a separate alert definition.&lt;/p&gt;

&lt;h3 id='create_failed_build_alert_definition'&gt;Create Failed Build Alert Definition&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; So far I&amp;#8217;ve not found a way to achieve this in VS2012.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To create a custom alert definition for only failing builds you have to open VS2010 (with installed TFS power tools) and go to the menu &lt;code&gt;Team &amp;gt; Alerts Explorer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/alertsexplorer_menu.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;That should open the Alerts Explorer view where you can see all of the defined alerts.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/alertexplorer_window.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Click on the &amp;#8220;New Alert&amp;#8221; button in the toolbar.&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/alertexplorer_createnewdialog.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Then define the condition for being notified. For instance&lt;/p&gt;

&lt;p&gt;&lt;img src='/blog/assets/imgs/alertexplorer_alertdefinition.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Save it and it should work then.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/juristrumpflohner/~4/_txDOickFIM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://juristr.com/blog/2012/11/howto-subscribe-to-failed-tfs-builds</feedburner:origLink></entry>
 
 
</feed>
