<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Robert Greiner</title>
 <link href="http://robertgreiner.com/atom.xml" rel="self"/>
 <link href="http://robertgreiner.com"/>
 <updated>2019-07-29T02:01:03+00:00</updated>
 <id>http://robertgreiner.com</id>
 <author>
   <name>Robert Greiner</name>
   <email>robert@robertgreiner.com</email>
 </author>

 
 <entry>
   <title>Thriving in Adversity</title>
   <link href="http://robertgreiner.com/2018/07/thriving-in-adversity/"/>
   <updated>2018-07-09T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2018/07/thriving-in-adversity</id>
   <content type="html">&lt;p&gt;When I was a kid, my dad owned a powder coating business. For those not familiar, powder coating is where you spray electrostatically charged colored powder onto metal and bake it in a large 450-degree oven that is about the size of a kitchen. During the 30 minutes of baking, the powder bonds to the metal, resulting in a much better finish than traditional paint provides. It’s an exciting process, and there is some neat equipment involved, but it’s arduous work.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2018/powder-coating-spraying.jpg&quot; alt=&quot;Powder Coating Spraying&quot; title=&quot;Powder Coating Spraying&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the summertime, I’d have to carry metal furniture in and out of the oven on metal hooks (you can’t touch the chair going in, or it will mess up the powder, and you can’t touch it coming out because you’ll get burned.) It was so hot in the oven that the sweat behind your ears would singe as you walked in the oven to retrieve your items. Brutal!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2018/powder-coating-oven.jpg&quot; alt=&quot;Powder Coating Oven&quot; title=&quot;Powder Coating Oven&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;All of this for minimum wage (paid cash at the end of the week like everyone else) while my friends were off playing video games, sleeping in, and vacationing all summer.&lt;/p&gt;

&lt;p&gt;This was the worst job I ever had, by far. However, the lessons I learned during these summers have paid enormous dividends:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;I decided early on that I was not cut out for manual labor and decided to go to college.&lt;/li&gt;
  &lt;li&gt;I have a strong work ethic. An air-conditioned desk job seems easy compared to toiling away in the heat.&lt;/li&gt;
  &lt;li&gt;I can make decisions quickly, I’m not sure if this is actually correlated, but when stuff hits the fan in the oven, you had to act, or people would get hurt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At the time, I really hated working at my dad’s shop. Looking back, I wouldn’t give up the experience. The hard-earned lessons of manual labor have benefited me immeasurably in my life and would be difficult to reproduce any other way.&lt;/p&gt;

&lt;p&gt;Unfortunately, these lessons were learned &lt;em&gt;unintentionally&lt;/em&gt;. They happened by accident without any kind of deliberate thought put into the process. As a result, I could have easily gone through all of that work with no benefit to my life.&lt;/p&gt;

&lt;p&gt;When you find yourself in a suboptimal situation, at work or life, you might as well get something out of it for your troubles. Usually, these situations offer up a level of growth, learning, or wisdom that you would be unable to achieve any other way.&lt;/p&gt;

&lt;p&gt;I’ll leave you with a quote from &lt;strong&gt;&lt;a href=&quot;https://www.amazon.com/Obstacle-Way-Timeless-Turning-Triumph/dp/1591846358&quot;&gt;The Obstacle is the Way&lt;/a&gt;&lt;/strong&gt; an excellent book for learning how to thrive in the face of adversity:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“In life, it doesn’t matter what happens to you or where you came from. It matters what you do with what happens and what you’ve been given. And the only way you’ll do something spectacular is by using it all to your advantage.” - Ryan Holiday, The Obstacle is the Way&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Onward.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;Image sources: &lt;a href=&quot;http://www.aspirasi-ndp.com/wp-content/uploads/2018/02/1142196-pc_spraying.jpg&quot;&gt;spray&lt;/a&gt; and &lt;a href=&quot;https://www.powdercoatingplanet.com/images/User_images/user_4133/Blog/How_to_Build_A_Powder_Coating_Oven/BLOG-LOGO.jpg&quot;&gt;oven&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Human and Golf Course Architecture</title>
   <link href="http://robertgreiner.com/2018/06/human-and-golf-course-architecture/"/>
   <updated>2018-06-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2018/06/human-and-golf-course-architecture</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;“Narrow fairways bordered by long grass make for bad golfers. They do so by destroying the harmony and continuity of the game, and in causing a stilted and cramped style, destroying all freedom of play.” - Alister Mackenzie, &lt;em&gt;The Spirit of St. Andrews&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Narrow fairways bordered by long grass make for bad golfers.&lt;/p&gt;

&lt;p&gt;As an amateur golfer and leader of people, this quote resonates. Golf and life and leadership are non-deterministic, complicated, and hard. There is no need to create systems that artificially constrict the growth and progress of other humans.&lt;/p&gt;

&lt;p&gt;This quote encourages me to design systems that allow people to thrive by defining and then focusing on the end goal. In golf, that is to hole-out. At work, it’s to find the intersection of fulfillment, growth, and productivity.&lt;/p&gt;

&lt;p&gt;Creating more complicated and challenging conditions for others, intentionally or not, will ultimately result in frustration.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Foundations of Financial Independence</title>
   <link href="http://robertgreiner.com/2017/10/foundations-of-financial-independence/"/>
   <updated>2017-10-30T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2017/10/foundations-of-financial-independence</id>
   <content type="html">&lt;p&gt;Here are some slides I put together for a recent talk outlining the keys to Financial Independence. This is something I’ve been pursuing for a few years and thought I’d share my thoughts on the topic. If you have any questions or want to discuss further, feel free to drop me a line.&lt;/p&gt;

&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/sTJ0LJ7S7buAcw?startSlide=2&quot; width=&quot;595&quot; height=&quot;485&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;
&lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/robertgreiner/foundations-of-financial-independence&quot; title=&quot;Foundations of financial independence&quot; target=&quot;_blank&quot;&gt;Foundations of Financial Independence&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;//www.slideshare.net/robertgreiner&quot; target=&quot;_blank&quot;&gt;Robert Greiner&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Sabbatical</title>
   <link href="http://robertgreiner.com/2016/10/sabbatical/"/>
   <updated>2016-10-18T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2016/10/sabbatical</id>
   <content type="html">&lt;p&gt;I’ve regularly been posting articles - at least once per month - since 2010.  This year, a few things came up that took my attention away from creating content to help technical folks get more out of their career.  Firstly, I went through a particularly challenging promotion cycle that required a deliverable which consumed all of my free time.  Next, I have been trying to re-balance my family and career commitments to be more present at home - kids grow up way too fast, it’s not fair.  As a result, I haven’t posted since April of this year and do not plan on creating another post until 2017.&lt;/p&gt;

&lt;p&gt;Thanks for reading and see you next year.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2016/drummer.jpg&quot; alt=&quot;Drummer&quot; title=&quot;Sabbatical&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Alternative to Arguing</title>
   <link href="http://robertgreiner.com/2016/04/alternative-to-arguing/"/>
   <updated>2016-04-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2016/04/alternative-to-arguing</id>
   <content type="html">&lt;p&gt;Sometimes you’re right, and you know it.  Unfortunately, we live in a world where those around us may not know what we know.  Worse than that (by an order of magnitude), others around us may intellectually know they are wrong - or you are right - and fight you regardless; out of spite, or fear, or anger, or whatever.&lt;/p&gt;

&lt;p&gt;At the end of the day, all of the logic and data in the world won’t always win others over to your way of thinking, especially if they didn’t come to their current set of conclusions using facts and logic to begin with.&lt;/p&gt;

&lt;p&gt;When something like this happens in your world, you have two choices.  First, you can dig in deeper, fighting with more logic, facts, figures, and eloquent arguments.  Or, instead, you can work to understand the alternate &lt;em&gt;perspective&lt;/em&gt; and change your communication approach to suit your audience.  The latter may take more time, energy, and patience than you would like to expend, but is ultimately more effective in the long run.&lt;/p&gt;

&lt;p&gt;One of the keys to cultivating solid relationships is the ability to identify these situations and intentionally adjust your approach when you think it will lead to a better result.  This practice takes a lifetime (and then some) to master, but is worth the journey to improve on over time.&lt;/p&gt;

&lt;p&gt;Next time you feel the other side digging in, don’t respond in kind.  Instead, adjust and look to address a potential deeper issue.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How To Drastically Reduce Your PowerPoint File Size</title>
   <link href="http://robertgreiner.com/2016/01/how-to-reduce-powerpoint-file-size/"/>
   <updated>2016-01-19T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2016/01/how-to-reduce-powerpoint-file-size</id>
   <content type="html">&lt;p&gt;I just tried to email a PowerPoint I was working on to a colleague for some feedback and realized, to my horror, that the file size was over 80MB.  Obviously, that won’t do.&lt;/p&gt;

&lt;p&gt;After digging around, I came to the conclusion that the massive amount of images I was using in the file had to be the issue.  Going through and manually resizing each image seemed like too much of a chore though, certainly there had to be a better way.  Luckily, there is!&lt;/p&gt;

&lt;p&gt;In PowerPoint 2016 for Mac do the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Click on an image - any image will do&lt;/li&gt;
  &lt;li&gt;Select “Picture Format”&lt;/li&gt;
  &lt;li&gt;Select “Compress Pictures”&lt;/li&gt;
  &lt;li&gt;Select the picture quality from the dropdown&lt;/li&gt;
  &lt;li&gt;Ensure “Delete cropped areas of pictures” is selected&lt;/li&gt;
  &lt;li&gt;Choose to perform this action on the selected image(s) or all of them&lt;/li&gt;
  &lt;li&gt;Click OK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2016/outlook-mac.png&quot; alt=&quot;Resize files PowerPoint Mac&quot; title=&quot;How to reduce the file size of your PowerPoint presentation in Mac&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And there you have it.  After doing this one simple step, my file size went from over 80MB to around 7MB.  Not too shabby.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wooden Blocks</title>
   <link href="http://robertgreiner.com/2016/01/people-arent-wooden-blocks/"/>
   <updated>2016-01-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2016/01/people-arent-wooden-blocks</id>
   <content type="html">&lt;p&gt;I was listening to a &lt;a href=&quot;https://www.manager-tools.com/&quot;&gt;Manager Tools&lt;/a&gt; podcast over the weekend and they shared a great Civil War era poem by &lt;a href=&quot;https://gist.github.com/robertgreiner/8eb5066d1996cd01adf5&quot;&gt;Stephen Vincent Benet&lt;/a&gt; that applies  very broadly to project management and leadership.  In fact, they list it as their favorite quote on management.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you take a flat map&lt;br /&gt;
And move wooden blocks upon it strategically,&lt;br /&gt;
The thing looks well, the blocks behave as they should.&lt;br /&gt;
The science of war is moving live men like blocks.&lt;br /&gt;
And getting the blocks into place at a fixed moment.&lt;br /&gt;
But it takes time to mold your men into blocks&lt;br /&gt;
And flat maps turn into country where creeks and gullies&lt;br /&gt;
Hamper your wooden squares. They stick in the brush,&lt;br /&gt;
They are tired and rest, they straggle after ripe blackberries,&lt;br /&gt;
And you cannot lift them up in your hand and move them.&lt;br /&gt;
It is all so clear in the maps, so clear in the mind,&lt;br /&gt;
But the orders are slow, the men in the blocks are slow&lt;br /&gt;
To move, when they start they take too long on the way -&lt;br /&gt;
The General loses his stars, and the block-men die&lt;br /&gt;
In unstrategic defiance of martial law&lt;br /&gt;
Because still used to just being men, not block parts.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/John_Brown%27s_Body_(poem\)&quot;&gt;John Brown’s Body by Stephen Vincent Benet&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;All too often, we as leaders or project managers or directors tend to treat our projects and direct reports like wooden blocks on a flat map.  At the end of the day, the &lt;em&gt;tweaks&lt;/em&gt; made to “get everything back in alignment” look good on paper, but ultimately spell out failure when the practicality of reality collides with what was originally planned.  The allure of shrinking the critical path by 10% or shifting several tasks “to the left” is extremely difficult to resist.&lt;/p&gt;

&lt;p&gt;I’m just as guilty of this behavior as anyone else I’ve met.  Hopefully, in the future, I can think back on this poem to remind myself that executing projects is exponentially more challenging than we would like to think it is.&lt;/p&gt;

&lt;p&gt;The people you’re leading are not wooden blocks.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DiSC</title>
   <link href="http://robertgreiner.com/2016/01/DiSC/"/>
   <updated>2016-01-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2016/01/DiSC</id>
   <content type="html">&lt;p&gt;I spent the first several years of my career as a software developer with an incorrect understanding of my default behavioral tendencies.  I thought because I was a programmer and loved being a programmer, that must mean I’m introverted - I mean, aren’t we all?  I also (incorrectly) thought that, because I’m a programmer, I was highly detail oriented since writing code seemed so much more low-level than anything else I had ever done.  Every time I found myself in a situation where I needed to exert effort to drill down into the details of a task, or felt drained after spending too much time alone, I became frustrated and couldn’t figure out what was wrong.&lt;/p&gt;

&lt;p&gt;It wasn’t until I started in consulting and was introduced to the &lt;a href=&quot;http://www.predictiveindex.com/the-predictive-index&quot;&gt;Predictive Index&lt;/a&gt; that I finally realized what was going on.  I’m not detail oriented, not even a little bit.  I’m highly dominant/action-oriented and, more confusingly for me at the time, I’m extroverted.  In fact, I’m more than one standard deviation strong in most of my behavioral tendencies (which means I’m pretty predictable).&lt;/p&gt;

&lt;p&gt;It was around this time that I realized the power of behavioral assessments.  Not because they are a 100% correct picture of a human being that will help you fully understand their motives and feelings (not true), but because they help give me a &lt;strong&gt;vocabulary&lt;/strong&gt; with which to understand myself and make sense of the actions people take in the workplace.  Now, when I’m coaching others on my team, I can tell them that they are a “Low-D” and might need to intentionally step outside of their comfort zone when having difficult conversations - especially when dealing with “High-D”s.  And, more importantly, help them understand the triggers that cause them tension and proactively modify their behaviors when they encounter different situations.&lt;/p&gt;

&lt;p&gt;Because behavioral assessments, and their associated vocabulary, have helped me so much in my career, I’m planning on writing several posts around behavior, specifically in the workplace, over the next year and wanted to start off with a foundational post about my favorite personal assessment tool: &lt;a href=&quot;https://en.wikipedia.org/wiki/DISC_assessment&quot;&gt;DiSC&lt;/a&gt; (pronounced “disk”).  DiSC has helped me become a better employee, leader, and even husband and I hope that some of the information I share here will help you as well.  Let’s get started.&lt;/p&gt;

&lt;h3 id=&quot;disc-overview&quot;&gt;DiSC Overview&lt;/h3&gt;

&lt;p&gt;There are several behavioral assessments, most with a great deal of research behind them.  I’ve taken most of them and my results are largely the same across the spectrum.  However, my favorite is DiSC.  I like DiSC because it focuses on &lt;em&gt;behavior&lt;/em&gt;.  And, after all, behaviors are what’s important in the workplace.  &lt;em&gt;I don’t care if you think my idea is stupid, I just want you do do it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Simply put, DiSC characterizes the behavioral profile of an individual - describing how you generally behave, in aggregate - across four areas: &lt;strong&gt;Dominant&lt;/strong&gt;, &lt;strong&gt;Influential&lt;/strong&gt;, &lt;strong&gt;Steady&lt;/strong&gt;, and &lt;strong&gt;Conscientious&lt;/strong&gt; (some people use Compliant here).  These four archetypes compliment and oppose each other in different ways and are typically outlined as a quadrant.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2016/DiSC.png&quot; alt=&quot;DiSC&quot; title=&quot;DiSC Quadrant&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To be “High” in any one of these areas means you tend to exhibit the associated behaviors when you are in your default mode, and it will take conscious effort to behave counter to them.  On the other hand, being “Low” in an area means you do the opposite.&lt;/p&gt;

&lt;p&gt;I’ll outline a quick description of each type here.  Note that these are fairly general and very few people fully fit into one specific type, but rather should be considered on the “spectrum” of behavior.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Dominant&lt;/strong&gt; - Direct and Action Oriented.  Sometimes can be seen as aggressive and can steamroll people if they aren’t careful.  Impatient.  Think Captain Kirk.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Influential&lt;/strong&gt; - Extroverted and impulsive.  Busy bodies with great ideas but have trouble following through.  Loves drama and being the center of attention.  Craves group settings.  Your typical salesman who has never met a stranger.  Think Muhammad Ali.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Steady&lt;/strong&gt; - Stable and supportive.  Seeks harmony and avoids confrontation.  Sometimes sensitive because they have high levels of empathy.  Think Mother Teresa.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Conscientious&lt;/strong&gt; - Cautious and careful.  Calculating and by the book. Strives to follow the rules and always has her facts straight.  Think Dr. Spock.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if you’ve never taken a behavior test before, you could probably identify the area (or areas) that you trend towards more often than not.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“But, why is this important?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m so glad you asked.&lt;/p&gt;

&lt;p&gt;The key benefit in understanding your personality, and the tendencies of those around you, is that you can work to &lt;strong&gt;adjust your behaviors to accommodate who you are interacting with&lt;/strong&gt;.  Ultimately, this is the best way to excel in your relationships with others, making you more successful in every area of your life.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Don't Be This Type of Leader</title>
   <link href="http://robertgreiner.com/2015/11/leadership-worst-practices/"/>
   <updated>2015-11-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/11/leadership-worst-practices</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2015/MichaelScott.png&quot; alt=&quot;Michael Scott&quot; title=&quot;Michael Scott - Bad Manager&quot; class=&quot;left&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve been re-watching &lt;a href=&quot;http://www.nbc.com/the-office&quot;&gt;The Office&lt;/a&gt; with my wife over the past several months, starting from the beginning and working through all of the episodes.  One thing that struck me this time around, much more so than last time, is how Michael’s actions adversely affect the team around him.  Maybe I’m more sensitive to this type of thing now that I’m a manager, but it’s clear from watching any episode how horrible of an environment Michael is creating.  As I sit through each episode, and experience Michael’s antics first hand through the eyes of another employee, I can’t help but wonder if I’m guilty of some of the same types of behaviors (hopefully, on a much less extreme level).&lt;/p&gt;

&lt;p&gt;A lot has been written about the qualities that any great leader should have. It’s equally important to occasionally look at the flip side of the coin - the qualities that all poor leaders seem to share and the consequences that they suffer as a result. As a leader, you will make mistakes - this much is inevitable. But how you handle such issues and the way that you react in such a high-stakes environment will go a long way towards dictating how others see you and, ultimately, the type of work they’re willing to do for you.&lt;/p&gt;

&lt;h3 id=&quot;expectations-and-realistic-expectations-are-two-different-things&quot;&gt;Expectations and Realistic Expectations Are Two Different Things&lt;/h3&gt;

&lt;p&gt;As a leader, a certain part of your job involves dealing directly with clients as a type of intermediary between your team and the people you’re actually doing work for. It’s one thing to SAY “Oh, sure - we’ll definitely be able to get that big project that we haven’t technically started yet done by end of business Tuesday, no problem.” It’s another thing to actually do it. Yet time and again, far too many leaders fall into the trap of promising anything and everything under the sun to clients in order to appease them and keep them happy, all at the ultimate expense of the people doing the lion’s share of the hard work in the first place.&lt;/p&gt;

&lt;p&gt;Part of success in this avenue involves keeping communications open and honest with your team at all times. They know what it is possible to do while still meeting a certain quality expectation. Your job as a leader is to take that and present it to the client in a realistic way in order to both keep them happy AND manage their own expectations at the exact same time. If you tell your six person team that you just promised the client something that is essentially impossible to keep them satisfied, you’re looking at six people who are probably going to start polishing their resume when they get home tonight.&lt;/p&gt;

&lt;h3 id=&quot;do-what-i-say-and-not-what-i-do&quot;&gt;Do What I Say and Not What I Do&lt;/h3&gt;

&lt;p&gt;If you want to be seen as the type of leader you’ve always dreamed that you could be, you need to get better at more than just delegating responsibility. You need to ACT like a leader and present yourself in that way. People will do what you tell them to by virtue of the position you hold to a certain extent, but this will only carry you so far. You need to treat people with the utmost respect and be willing to accept responsibility as the “face” of the team if something goes wrong. You don’t want people to do what you tell them to just because you’ve told them to do it - you want them to legitimately follow you of their own free will, like an army following a general into battle.&lt;/p&gt;

&lt;h3 id=&quot;youre-not-just-the-leader-of-the-team---youre-a-part-of-the-team&quot;&gt;You’re Not Just the Leader of the Team - You’re a Part of the Team&lt;/h3&gt;

&lt;p&gt;When people ascend to the position of leader, a lot of times they think that by virtue of their new job title one of the “perks” of such a position is essentially “more money for less work.” Grabbing hold of this mentality and refusing to let go is yet another really efficient way to completely shatter team morale, causing a lot of grief and stress in the process. If anything, being a leader means that you need to work harder than ever. You’re still a valuable member of the team and still need to lend a helping hand wherever possible, but you also have the added responsibility of interacting directly with clients on the team’s behalf at the exact same time. It’s about more than just delegating responsibility - it’s about actively contributing. Never ask a subordinate to do something that you wouldn’t be more than willing to do yourself or you will absolutely regret it sooner rather than later.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Continuous Integration with Docker</title>
   <link href="http://robertgreiner.com/2015/10/example-docker-deployment-pipeline/"/>
   <updated>2015-10-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/10/example-docker-deployment-pipeline</id>
   <content type="html">&lt;p&gt;One of the several benefits of using &lt;a href=&quot;http://docker.com&quot;&gt;containers&lt;/a&gt; centers around your ability to build a container at the development stage, and promote it through each environment to production.  This strategy keeps environments consistent throughout each environment, and allows close-to-production testing to be done earlier.  Coupling this benefit with your existing Continuous Integration pipeline will provide a more consistent deployment process from beginning to end.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2015/DockerWorkflow.png&quot; alt=&quot;Docker CI Workflow&quot; title=&quot;Docker CI Workflow&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Developer commits code to version control&lt;/li&gt;
  &lt;li&gt;Continuous Integration tool (Jenkins) triggers on check-in, tests the changes, and builds a Docker Image&lt;/li&gt;
  &lt;li&gt;Jenkins submits new version of Image to Registry&lt;/li&gt;
  &lt;li&gt;Docker Container is built and executed on QA server for testing&lt;/li&gt;
  &lt;li&gt;Testing begins in Non-Prod / Prod environments&lt;/li&gt;
  &lt;li&gt;Container is promoted to Staging server after successful tests&lt;/li&gt;
  &lt;li&gt;Container is promoted to “Blue” Production environment (non-live) after successful tests&lt;/li&gt;
  &lt;li&gt;Container is promoted to “Green” Production release, after successful tests, and is live&lt;/li&gt;
  &lt;li&gt;User access new functionality&lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 <entry>
   <title>Eight Steps to Transform Your Organization</title>
   <link href="http://robertgreiner.com/2015/09/leading-change-kotter-eight-steps/"/>
   <updated>2015-09-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/09/leading-change-kotter-eight-steps</id>
   <content type="html">&lt;p&gt;Change is hard, really hard.  Most days, I can barely muster the willpower to floss my teeth - even after &lt;a href=&quot;http://tinyhabits.com/&quot;&gt;deliberately placing the floss right next to my toothbrush&lt;/a&gt;.  There are all sorts of things I &lt;em&gt;should&lt;/em&gt; be doing everyday that I just don’t, even though I know - intellectually - that my life will be better as a result.&lt;/p&gt;

&lt;p&gt;Organizational change is even harder, orders of magnitude harder.  It requires lots of people to adopt new behaviors, policies, procedures, etc. that are all significantly more difficult than flossing.  Not to mention that all of this change  has to be coordinated and executed at the same time across multiple sub-organizations while everyone trusts that moving away from the &lt;em&gt;status quo&lt;/em&gt; won’t negatively impact their ability to provide for their families.&lt;/p&gt;

&lt;p&gt;Yet, there are times in our organizational lives where change &lt;strong&gt;must happen&lt;/strong&gt; to continue thriving - or even surviving - in the current environment.  This begs the question: &lt;em&gt;“How do we maximize the probability of successfully effecting change in an organization?&lt;/em&gt;”  I’m so glad you asked.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;https://hbr.org/2007/01/leading-change-why-transformation-efforts-fail&quot;&gt;Leading Change: Why Transformation Efforts Fail&lt;/a&gt;, John Kotter outlines 8 steps to transform an organization.  These steps, along with common pitfalls, serve as a guiding framework to help enable change throughout an organization, regardless of size.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2015/Kottersteps.jpeg&quot; alt=&quot;Kotter - 8 steps to transform your organization&quot; title=&quot;Kotter - 8 steps to transform your organization&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;While these steps may seem straightforward on paper, they can be time consuming and difficult to achieve, regardless of the organizational environment you are in.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The most general lesson to be learned from the more successful cases is that the change process goes through a series of phases that, in total, usually require a considerable length of time. Skipping steps creates only the illusion of speed and never produces a satisfying result. A second very general lesson is that critical mistakes in any of the phases can have a devastating impact, slowing momentum and negating hard-won gains. Perhaps because we have relatively little experience in renewing organizations, even very capable people often make at least one big error. - Kotter HBR&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kotter also outlines eight errors that are commonly made during each phase of the process:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error 1: Not Establishing a Great Enough Sense of Urgency&lt;/strong&gt; - this first error accounts for “Over 50%” of change effort failures.  Organizations can further improve their chances of success here by creating a sense of urgency out of a crisis or poor performance in the marketplace.  However, even if the conditions are right for a change, it still takes the right leadership.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A paralyzed senior management often comes from having too many managers and not enough leaders. Management’s mandate is to minimize risk and to keep the current system operating. Change, by definition, requires creating a new system, which in turn always demands leadership. Phase one in a renewal process typically goes nowhere until enough real leaders are promoted or hired into senior-level jobs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Error 2: Not Creating a Powerful Enough Guiding Coalition&lt;/strong&gt; - Without enough people supporting the change at all levels of the organization, chances of success approach zero.  Over time, a change effort should see an increase in support for the change - and not the opposition.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Efforts that don’t have a powerful enough guiding coalition can make apparent progress for a while. But, sooner or later, the opposition gathers itself together and stops the change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Error 3: Lacking a Vision&lt;/strong&gt; - There’s already so much inertia within organizations that it’s vital to communicate the change in a clear, understandable, and persuasive way.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A useful rule of thumb: If you can’t communicate the vision to someone in five minutes or less and get a reaction that signifies both understanding and interest, you are not yet done with this phase of the transformation process.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Error 4: Undercommunicating the Vision by a Factor of Ten&lt;/strong&gt; - If you aren’t absolutely sick of communicating the same message over and over again, you probably aren’t communicating enough.  A few emails and town hall meetings just won’t cut it.&lt;/p&gt;

&lt;p&gt;When communicating, think - &lt;strong&gt;message&lt;/strong&gt;, &lt;strong&gt;medium&lt;/strong&gt;, &lt;strong&gt;frequency&lt;/strong&gt;, and &lt;strong&gt;behaviors&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Communication comes in both words and deeds, and the latter are often the most powerful form. Nothing undermines change more than behavior by important individuals that is inconsistent with their words.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Error 5: Not Removing Obstacles to the New Vision&lt;/strong&gt; - Organizations are configured to persist the &lt;em&gt;status quo&lt;/em&gt;.  This isn’t necessarily a bad thing - after all, this is what has made the company so successful in the first place.  On that same note, when change is needed, parts of the organization will act as a blocker instead of an enabler.  This needs to be addressed swiftly.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In the first half of a transformation, no organization has the momentum, power, or time to get rid of all obstacles. But the big ones must be confronted and removed. If the blocker is a person, it is important that he or she be treated fairly and in a way that is consistent with the new vision. Action is essential, both to empower others and to maintain the credibility of the change effort as a whole.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Error 6: Not Systematically Planning for, and Creating, Short-Term Wins&lt;/strong&gt; - Success builds momentum, and momentum leads to greater success.  Define shorter-term wins (and celebrate them!) during your change initiative to make sure you are creating a virtuous cycle.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Real transformation takes time, and a renewal effort risks losing momentum if there are no short-term goals to meet and celebrate. Most people won’t go on the long march unless they see compelling evidence in 12 to 24 months that the journey is producing expected results. Without short-term wins, too many people give up or actively join the ranks of those people who have been resisting change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Error 7: Declaring Victory Too Soon&lt;/strong&gt; - When you start celebrating your small wins, make sure you aren’t declaring outright victory.  Declaring victory too soon can immediately derail your initiative.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;After a few years of hard work, managers may be tempted to declare victory with the first clear performance improvement. While celebrating a win is fine, declaring the war won can be catastrophic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Error 8: Not Anchoring Changes in the Corporation’s Culture&lt;/strong&gt; - once you have a pattern of success, ensure the trend continues.  This is key around continued communication and succession planning.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In the final analysis, change sticks when it becomes “the way we do things around here,” when it seeps into the bloodstream of the corporate body. Until new behaviors are rooted in social norms and shared values, they are subject to degradation as soon as the pressure for change is removed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Facilitating change within an organization is much more difficult than we realize.  Taking a pragmatic - and patient - approach through the steps Kotter outlines above will increase our chances of successfully realizing the change we want and need within our organizations.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>EnterpriseOps</title>
   <link href="http://robertgreiner.com/2015/08/enterprise-ops/"/>
   <updated>2015-08-27T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/08/enterprise-ops</id>
   <content type="html">&lt;p&gt;Organizations today are constantly looking for a &lt;em&gt;silver bullet&lt;/em&gt; to cure all of their technology woes so they can deliver their products to market faster and cheaper than ever before.  Typically, this treasure hunt takes the form of a single technology and is described in the broadest terms possible: &lt;em&gt;cloud computing&lt;/em&gt;, &lt;em&gt;continuous delivery&lt;/em&gt;, &lt;em&gt;microservices&lt;/em&gt;, &lt;em&gt;virtualization&lt;/em&gt;, and on and on.&lt;/p&gt;

&lt;p&gt;As we all come to find out, expecting any one of these technology strategies or tools to solve all of our delivery problems will only be met with disappointment.  Yet, we still persist, hunting for that &lt;em&gt;one thing&lt;/em&gt; that will change the game for us.  This phenomenon is repeated so frequently across every industry that Gartner created a &lt;a href=&quot;https://en.wikipedia.org/wiki/Hype_cycle&quot;&gt;Hype Cycle&lt;/a&gt; to plot where the year’s most popular technologies sit on a curve.  Spoiler Alert: if you’re  exploring wearables, 3D printing, IoT, or Big Data, you have a long road ahead of you.&lt;/p&gt;

&lt;p&gt;The main reason organizations are continually frustrated with single-solution technologies and their ineffectiveness in “fixing” everything can be summed up in a single word: &lt;strong&gt;myopia&lt;/strong&gt;.  Organizations have an expectation that a shiny new technology will do more for them than it was designed for - potentially leading down a path of poor design decisions in the future as they try to fit a square peg into a round hole.  New technologies released today are geared towards solving a specific problem and should be treated as a tool alongside several others in a belt - similar to how craftsman have multiple tools to effectively handle any job.&lt;/p&gt;

&lt;p&gt;As the technology landscape continues to evolve, new tools and strategies are widening to solve targeted and specific problems instead of a one-size-fits-all solution.  Organizations are accustomed to adopting a single solution - like SQL Server - and modifying their processes to work within the confines of that particular technology.  However, scale requirements have shifted and we can no longer meet the market’s demands with a single server that requires ever increasing resources to be added to it.  We’ve hit the limit, and must find another way.  This is why tools like MongoDB, Redis, and ElasticSearch were built, to solve the monolithic server issue and allow for a more horizontally scalable architecture.  However, these are not fix-all solutions and treating them as such will only lead to disappointment and unmet expectations.&lt;/p&gt;

&lt;p&gt;Instead of focusing on a single-solution, organizations should consider a framework/platform to guide them through improving their entire technology stack end-to-end.  This framework spans across multiple areas of the organization: from how custom software is built (Automation), to how functionality is exposed to the enterprise (Messaging), and everything is packaged up and hosted for consumption (Platform).  This approach is much bigger than Dev or Ops or even DevOps - it’s a new focus around &lt;strong&gt;EnterpriseOps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2015/EnterpriseOps.png&quot; alt=&quot;EnterpriseOps&quot; title=&quot;EnterpriseOps - Joining Continuous Delivery, Containerization, and Microservices&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Focusing on EnterpriseOps will help widen the scope of what the organization focuses on and doesn’t require fully committing to a single technology.  Instead, a framework can be used to &lt;em&gt;meet specific organizational or delivery goals&lt;/em&gt; through the adoption (or not) of several different technologies designed to work within a larger architecture.  This approach allows the enterprise to use the right tool for the job, instead of relying on the same tired old hammer to complete complex projects.&lt;/p&gt;

&lt;p&gt;When attempting to improve your organization’s software development and delivery processes, it is important to keep a holistic view of the plan-build-test-deploy-run cycle.  At the end of the day, there is no single technology that can singlehandedly help you meet the ever increasing demands of your customers.  Rather, a more complete focus on how the enterprise operates will help your organization realize long term benefits.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fixing "Couldn't Create a New Partition" Error When Installing Windows 10</title>
   <link href="http://robertgreiner.com/2015/08/windows-10-couldnt-create-a-new-partition/"/>
   <updated>2015-08-25T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/08/windows-10-couldnt-create-a-new-partition</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;we couldn’t create a new partition or locate an existing one&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I got this error over the weekend while trying to upgrade one of my computers to Windows 10.  I was using a bootable USB built with the [Media Creation Tool(http://windows.microsoft.com/en-us/windows-10/media-creation-tool-install).&lt;/p&gt;

&lt;p&gt;Everything started up fine, but when I tried to install Windows 10 on a specified partition, I got an error: &lt;em&gt;we couldn’t create a new partition or locate an existing one”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It turns out, Windows tries to create a few partitions on the primary hard drive (the one you booted from) to support the installation of Windows.  However, the installer won’t create said partitions on a removable device - which is what I had set as my primary boot device.&lt;/p&gt;

&lt;p&gt;To solve this issue, I removed all of the boot devices - except my hard drive - from the BIOS menu and restarted.  As my computer was rebooting, I loaded the quick boot menu and selected my USB device.  After that, I was able to install Windows like normal.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My RSS Workflow</title>
   <link href="http://robertgreiner.com/2015/07/my-rss-workflow/"/>
   <updated>2015-07-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/07/my-rss-workflow</id>
   <content type="html">&lt;p&gt;In my early years as a programmer, I spent more time consuming RSS feeds than actually doing real work and practicing my craft.  This lead to a period  where I wasn’t growing as much as I wanted to or knew I was capable of.  Over time, I realized how much time I was wasting reading - instead of doing - and decided I needed a change.&lt;/p&gt;

&lt;p&gt;Since then, I’ve evolved an RSS workflow that helps me consume great content without drowning in the vast ocean of information generated by the world every day.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Browse headlines for all of my RSS feeds through &lt;a href=&quot;http://feedly.com&quot;&gt;Feedly&lt;/a&gt;.  Typically, this is done on my iPhone while I wait in line at Chipotle, the grocery store, or the bank.&lt;/li&gt;
  &lt;li&gt;Long-press feeds that pique my interest to send to &lt;a href=&quot;http://instapaper.com&quot;&gt;Instapaper&lt;/a&gt;.  I don’t read the article at this time, I just save it for later.&lt;/li&gt;
  &lt;li&gt;Repeat for a given period of time.  Usually one week.&lt;/li&gt;
  &lt;li&gt;Find a quiet place and consume all of the articles saved over the past several days.  I try to do this every Saturday.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’ve found this to be a much more approachable way to consume RSS.  Do I occasionally miss items? Yes.  But, not nearly as many as I would by ignoring RSS in the first place.&lt;/p&gt;

&lt;p&gt;On any given week, I consume 20-30 great articles in batch mode.  I feel like I stay well read in the goings on in my industry and various other areas I’m interested in.  Best of all, this technique stays out of my way and allows me to get the work done that matters.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Evolution of Software Architecture</title>
   <link href="http://robertgreiner.com/2015/06/evolution-of-software-architecture/"/>
   <updated>2015-06-19T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/06/evolution-of-software-architecture</id>
   <content type="html">&lt;p&gt;I came across this great overview of each software architecture trend since the 1990’s.  I remember fondly (and sometimes not) dealing with systems in each of these areas - each having their own array of benefits and challenges.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2015/SoftwareArchitecture.png&quot; alt=&quot;Evolution of Software Architecture&quot; title=&quot;The Evolution of Software Architecture&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you can’t feed a team with two pizzas, it’s too large. That limits a task force to five to seven people, depending on their appetites — Jeff Bezos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/@benorama/the-evolution-of-software-architecture-bd6ea674c477&quot;&gt;Source - @benorama&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Chess, Not Checkers</title>
   <link href="http://robertgreiner.com/2015/05/chess-not-checkers/"/>
   <updated>2015-05-28T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/05/chess-not-checkers</id>
   <content type="html">&lt;p&gt;The first few years of my career were relatively straightforward.  I came to work every day, grabbed my new user stories or defects and started working.  Most of what I developed was in a vacuum and I rarely had to worry about my code changes affecting anyone else’s part of the system.  Mostly, I was playing Checkers - a fast paced, reactionary game where the object is speed and there’s not much strategy involved.&lt;/p&gt;

&lt;p&gt;However, as time progressed and I gained more responsibilities in my day-to-day work, I learned (the hard way in most cases) that almost everything I did somehow affected someone else.  Even more importantly, I learned that my decisions had direct and lasting impacts on the rest of my team.  I could no longer handle my work life day-to-day like before.  My straightforward game of Checkers switched to a more complex game of Chess without me even knowing it.&lt;/p&gt;

&lt;p&gt;This is a common problem people at all levels of leadership face.  The key is to recognize when the game has changed and adjust your strategy accordingly.  How, You ask?  In &lt;a href=&quot;http://www.amazon.com/Chess-Not-Checkers-Elevate-Leadership/dp/1626563942&quot;&gt;&lt;em&gt;Chess Not Checkers: Elevate Your Leadership Game&lt;/em&gt;&lt;/a&gt; Mark Miller outlines four key strategies, loosely based on Chess, to help you re-frame your thinking as a leader.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Bet on Leadership&lt;/strong&gt; - &lt;em&gt;Growing leaders grow organizations&lt;/em&gt;.  Investing in leadership is the single most important thing your organization should be doing, whether you’re a dev team of 3 or a Fortune 100 company.  The leadership “bench” you establish will help instill the culture and cadence the rest of the organization follows.  If you get this wrong, you’ll find yourself wondering why it’s so difficult to get things done, and  live in constant disappointment that everything takes much longer to complete than expected.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Act as One&lt;/strong&gt; - &lt;em&gt;Alignment multiplies impact&lt;/em&gt;.  In Chess, one bishop is worth 3 points, but two bishops together are worth 7.  Having a clear vision and direction for an organization will ensure everyone is marching towards the same goal.  Organizational structure will act as a multiplier (division of labor) instead of a drag (communication complexity).  It’s always better to focus chunks of your resources on a few, high value, goals instead of spreading them too thin and trying to do everything at random.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Win the Heart&lt;/strong&gt; - &lt;em&gt;Engagement energizes effort&lt;/em&gt;.  Understanding the strengths and weaknesses of each member of your team and pointing them towards the right objectives will help foster motivation.  Thought workers are not interchangeable cogs in a machine and the more individualism you give your team members, the harder they will work.  They’ll also be happier and more creative.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Excel at Execution&lt;/strong&gt; - &lt;em&gt;Greatness hinges on execution.&lt;/em&gt;  Putting systems in place to actually deliver value is vital.  The best plans, tactics, strategies, and visions in the world mean nothing if the actual work doesn’t get done.  Setting goals, measuring results, and striving to constantly improve are  the cornerstones of executing well.  Get this wrong, and the rest of the gains listed above fall apart.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I really enjoyed &lt;em&gt;Chess Not Checkers&lt;/em&gt;.  It’s told in a fictional story narrative and contains some great nuggets of wisdom that any leader at any level could benefit from.  Best of all, it makes you aware of the deadly process of playing Checkers (which we’re all guilty of) when you should be playing Chess.  Failure to recognize and address this shift in your professional life could have drastic consequences.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Five Qualities of People-Focused Leaders</title>
   <link href="http://robertgreiner.com/2015/04/effective-leadership-through-effective-relationships/"/>
   <updated>2015-04-27T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/04/effective-leadership-through-effective-relationships</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;When you’re in a relationship, if you are aware of a problem, it’s your responsibility to make a concerted effort to make a positive change. - John Maxwell&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was reading &lt;a href=&quot;http://www.amazon.com/People-Person-Effective-Leadership-Relationships/dp/0781448433&quot;&gt;&lt;em&gt;Be a People Person: Effective Leadership Through Effective Relationships.&lt;/em&gt;&lt;/a&gt; by John Maxwell over the weekend.  The “big idea” of &lt;em&gt;Be a People Person&lt;/em&gt; centers around getting the most out of those around you in work, family, and social life, by improving your interpersonal relationships.&lt;/p&gt;

&lt;p&gt;At the end of the day, the effort of a single person (you) doesn’t scale well.  To achieve remarkable results, you must rely on those around you.  Unfortunately, people don’t work effectively together by default.  As a result, a large chunk of your effort as a leader should be spent on relationships in order to achieve the results you’re looking for.&lt;/p&gt;

&lt;p&gt;According to Maxwell, there are five qualities leaders possess who excel at building relationships with those around them:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Encourage&lt;/strong&gt; others - In short, you don’t build great relationships with those who have a negative attitude towards you or your accomplishments.  Encouraging those around you will not only build trust, but it will give them the confidence they need to succeed when times get tough.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Appreciate&lt;/strong&gt; others - Humans crave appreciation.  Recognizing the importance of those around you and communicating their value to the team will pay huge dividends in the future.  Appreciating others can take the form of giving credit for suggestions, correcting grievances, providing encouragement, and asking for the opinion of others.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Forgive&lt;/strong&gt; others - When we look back at mistakes we made in the past, we typically view our actions through the filter of &lt;em&gt;intent&lt;/em&gt;.  After all, we didn’t mean to criticize so harshly.  However, when we look at the actions of others, we judge through &lt;em&gt;behavior&lt;/em&gt;.  This allows us to easily jump to the conclusion that the negative actions of others were somehow done on purpose.  However, this is rarely the case.  Giving those around you the benefit of the doubt when something doesn’t go as planned will help you focus on what’s important and not waste time/energy fighting over things that don’t matter.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Listen&lt;/strong&gt; to others - People want to be heard.  If you have to make a tough decision, especially one that some of those around you disagree with, it’s important to ensure everyone has an opportunity to voice their point-of-view before moving on.  It’s much easier to get buy-in from your team after everyone has been heard, regardless if they fully agree or not.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Understand&lt;/strong&gt; others - &lt;a href=&quot;http://en.wikipedia.org/wiki/Peter_Drucker&quot;&gt;Peter Drucker&lt;/a&gt; says “60 percent of all management problems are a result of faulty communications.”  Taking the time to understand those around you will help avoid feelings of disappointment and resentment when navigating tense situations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These five areas serve as the foundation for leading others.  Success here can turn good leaders into great leaders through bringing out the best in the people on your team.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Maybe You Shouldn’t Schedule That Meeting</title>
   <link href="http://robertgreiner.com/2015/03/meeting/"/>
   <updated>2015-03-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/03/meeting</id>
   <content type="html">&lt;p&gt;I read an interesting article on HBR last week &lt;a href=&quot;https://hbr.org/2015/03/do-you-really-need-to-hold-that-meeting&quot;&gt;outlining a framework for deciding whether or not to schedule a meeting&lt;/a&gt;.  The quality of articles like this tend to vary anywhere between exceptionally helpful to common sense to a complete waste of time.  The thing that stood out to me the most about HBRs article was the author outlined a framework for how to handle communication outside of meetings.  This is an effective method that, if followed, should still result in the same level of communication (or better), but keeps everyone’s time from being wasted.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2015/meeting-decision-tree.png&quot; alt=&quot;Meeting decision Tree&quot; title=&quot;Meeting decision tree&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There is a ton of good information here, and I don’t want to simply re-hash what is in the article, so I will include some color commentary here and you should go check out the &lt;a href=&quot;https://hbr.org/2015/03/do-you-really-need-to-hold-that-meeting&quot;&gt;full article&lt;/a&gt; right after reading this post.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Schedule time to think/work&lt;/strong&gt; - this is something we simply don’t do enough of as part of our busy workdays.  Blocking off time on your calendar to tackle something specific is an effective way to make sure you are working on what’s important.  It also ensures you aren’t distracted trying to accomplish the same work as part of a different meeting.  Don’t have time on your calendar this week?  Try scheduling some time in a couple of weeks and be pleasantly surprised when you “find” some time later on - your future self will thank you.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Leverage asynchronous communication&lt;/strong&gt; - Just because you have something important to say, and have a few minutes to say it, doesn’t mean you need to call a meeting.  After all, others may be busy trying to get work done, don’t bug them if you don’t have to.  Instead, use IM or email or text to start the dialog and let your colleagues respond on their own time.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;You probably don’t need to have a meeting&lt;/strong&gt; - sometimes you do, most of the time you don’t.  Are there ways to get the same level of communication across (or better) without requiring everyone to be in the same place at the same time?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Prepare&lt;/strong&gt; - if you do end up scheduling that meeting, be sure to prepare.  Put an effective agenda, schedule it for half to two-thirds of the time you think you will need, and &lt;a href=&quot;http://robertgreiner.com/2012/10/manage-your-meeting-size/&quot;&gt;manage the meeting size&lt;/a&gt; to reduce complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Taking some up-front time to decide whether or not to hold a meeting can pay huge dividends in the future.  If you can avoid one meeting per week 80% of the year, you can save a &lt;em&gt;full week&lt;/em&gt; of waste.  Imagine what you could accomplish with an extra week each year to focus on your goals.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://hbr.org/2015/03/do-you-really-need-to-hold-that-meeting&quot;&gt;Image Source - HBR&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The New DevOps</title>
   <link href="http://robertgreiner.com/2015/02/the-new-devops/"/>
   <updated>2015-02-09T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/02/the-new-devops</id>
   <content type="html">&lt;p&gt;My first five years as a software engineer, I worked primarily with a particular programming language.  I had some responsibilities around testing and deployment scripts, but mostly I just worked with code and code-related activities.  The following five years have been much different - there are entire projects that would have gone undelivered if I wasn’t able to provide support in some area of Operations - networking, databases, operating systems, etc.&lt;/p&gt;

&lt;p&gt;The development landscape has changed over the past several years.  The lone-gunman programmer going off in a corner for months to deliver functionality has been replaced by &lt;a href=&quot;http://en.wikipedia.org/wiki/Agile_software_development&quot;&gt;development teams delivering business value every few weeks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A similar shift has recently occurred in the area of Operations.  Developers used to be responsible only for writing and (hopefully) testing their code.  Infrastructure, networking, operating systems, RAM, CPU, power, and similar topics were someone else’s problem.&lt;/p&gt;

&lt;p&gt;Today, the landscape has again shifted to a more collaborative model merging development and operations (DevOps).  Developers need to know much more about the operational components of their software - especially around network programming, services development, and continuous deployment.  Likewise, the developer’s IT counterpart needs to know much more about development - especially around infrastructure automation (Chef/Puppet), automated testing, and continuous deployment - I recently read a resume for an operations candidate that listed &lt;a href=&quot;https://www.chef.io/chef/&quot;&gt;Ruby as one of the core skills&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As time progresses, the lines between developers and operations specialists will continue to blur, resulting in an ever increasing need for collaboration and communication between groups.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2015/DevOps.png&quot; alt=&quot;DevOps Infographic&quot; title=&quot;DevOps = some dev - some ops&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.appdynamics.com/devops/part-dev-part-ops/&quot;&gt;Source - AppDynamics&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Growth</title>
   <link href="http://robertgreiner.com/2015/01/growth/"/>
   <updated>2015-01-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/01/growth</id>
   <content type="html">&lt;p&gt;The US economy has been growing. According to &lt;a href=&quot;http://news.morningstar.com/stockReturns/CapWtdSectorReturns.html&quot;&gt;Morningstar&lt;/a&gt;, if you are in Healthcare, your industry enjoyed a 20% increase in 2014. Technology and Real Estate grew over 17% and Financial Services grew over 10% in the same period. These are some great numbers and if you work in one of these sectors, take a few moments to congratulate yourself on a job well done.&lt;/p&gt;

&lt;p&gt;This also means that if you work as an individual contributor at Sony, Yahoo!, Qualcomm, Basecamp, or a startup 18 months out of Y Combinator and you haven’t improved your skills by 17% in 2014, then you are actually a drain on your company’s success. Either those around you have to grow more to make up for the difference, or your organization as a whole underperforms the industry.&lt;/p&gt;

&lt;p&gt;If you run a team, the same principle holds, only the effects are magnified by the number of your direct reports. Can you point to an area where you saved 17% of your budget, increased productivity by 17%, booked 17% more sales, or improved the capabilities of your team by 17% or more? If your team didn’t achieve these levels of growth and you are in the Technology sector, then you are lagging behind - even if you grew by 15% last year, it wasn’t enough.&lt;/p&gt;

&lt;p&gt;In this era, where everyone in the world is obsessed with improving themselves, take some time to assess whether or not you are improving at a rate that is greater than your industry. Otherwise, your competitors will slowly steal away your customers and market share. Maybe not all at once, say, 5% this year and 7% the next. Being &lt;em&gt;content&lt;/em&gt; with your current position, with the expectation that you will still be doing the same work 10 years from now is a delusion. The market is growing and so should you.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Executive Presence</title>
   <link href="http://robertgreiner.com/2015/01/executive-presence/"/>
   <updated>2015-01-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2015/01/executive-presence</id>
   <content type="html">&lt;p&gt;I had an opportunity to read a few books over the holiday break, and the best one by far, was &lt;a href=&quot;http://www.amazon.com/Executive-Presence-Missing-Between-Success-ebook/dp/B00FJ350MQ/&quot;&gt;&lt;em&gt;Executive Presence: The Missing Link Between Merit and Success&lt;/em&gt;&lt;/a&gt; by Sylvia Ann Hewlett.  In short &lt;em&gt;Executive Presence&lt;/em&gt; shows how having all the right qualifications and results in your job does not guaranty advancement in your organization.  In fact, you may be demonstrating one or more behaviors that are fully undermining your ability to promote, even if they are not directly related to the results you achieve.&lt;/p&gt;

&lt;h2 id=&quot;my-favorite-point&quot;&gt;My Favorite Point&lt;/h2&gt;

&lt;p&gt;It turns out, leadership isn’t as much about what you do, but rather &lt;em&gt;how you look while you are doing it&lt;/em&gt;.  This means that most of the characteristics that your co-workers assign to you are subjective by nature and are influenced in ways that are unexpected.  How many stories have we heard of bosses giving vague feedback to their directs around how they need to “be more assertive” only to have them over correct and now need to “be more vulnerable”.&lt;/p&gt;

&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;

&lt;p&gt;According to Hewlett, executive presence is made up of three key pillars: how you act (Gravitas), how you speak (Communication), and how you look (Appearance).  Showing aptitude in these areas will send a signal to others that you have what it takes to take on a high level of responsibility and be successful.&lt;/p&gt;

&lt;h3 id=&quot;gravitas---how-you-act&quot;&gt;Gravitas - How You Act&lt;/h3&gt;
&lt;p&gt;Gravitas is the most important pillar of Executive Presence.  However, if you were to ask several working professionals today, most would have a hard time quantifying what exactly it means to have Gravitas.  Luckily, Hewlett has our back here.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Confidence&lt;/strong&gt; - leaders demonstrate confidence through “grace under fire”.  With the economic events that have transpired over the last 5-7 years, employees, shareholders, and consumers want to see their leaders behave in a calm-and-collected way, especially in the face of adversity.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Decisiveness&lt;/strong&gt; - the ability to &lt;em&gt;make the tough decision&lt;/em&gt; and fight back when others challenge you is key in a leader’s ability to demonstrate decisiveness.  A good example of this, whether you agree with her or not, is &lt;a href=&quot;http://money.cnn.com/2013/02/25/technology/yahoo-work-from-home/&quot;&gt;Marissa Mayer’s decision to revoke remote working privileges at Yahoo&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Integrity&lt;/strong&gt; - As Knowledge Worker jobs continue to replace those of the Factory Worker and information becomes more broadly distributed, integrity plays a key role in a leader’s ability to be effective.  The public is placing increased demands on companies and holding them accountable to their actions more than ever before.  A leader who demonstrates integrity will more easily earn - and keep - the trust of those around her.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Emotional Intelligence&lt;/strong&gt; - The ability to control one’s emotions and act with empathy around others is a key skill in being an effective leader.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;communication---how-you-speak&quot;&gt;Communication - How You Speak&lt;/h3&gt;
&lt;p&gt;The next crucial ability for leaders to demonstrate solid Executive Presence is centered around Communication.  If you want your ideas to be heard by others, you need to be able to communicate it in a way that they understand and resonates with those you need to persuade.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Superior Speaking Skills&lt;/strong&gt; - Your ability to speak well is the single most important skill that dictates how people perceive your intelligence and ability to lead others.  In the past, poor orators have completely destroyed the goodwill they built up with those that follow them.  Don’t be one of those leaders.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ability to Command a Room&lt;/strong&gt; - People don’t grant you their attention for long, you ability to keep others engaged and focused on what you are talking about will increase the likelihood that you are &lt;em&gt;heard&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Assertiveness&lt;/strong&gt; - Similar to Decisiveness above, being assertive in addressing concerns sends a signal that you know what you are talking about and are confident in a decision/action.  Even if you don’t know the answer to something, own it immediately and move on.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ability to Read a Room&lt;/strong&gt; - Understanding how the people in the room are responding to your ideas is vital to succeed as a communicator.  Sometimes, you need to adjust your message (or stop talking altogether) depending on how much support you are getting in a conversation.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Sense of Humor * Ability to Banter&lt;/strong&gt; - Everyone makes mistakes, your ability to shrug them off - or even joke about them - will improve the perception others have of your communication abilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;appearance---how-you-look&quot;&gt;Appearance - How You Look&lt;/h3&gt;
&lt;p&gt;While appearance was rated as the &lt;em&gt;least significant&lt;/em&gt; aspect of Executive Presence, the data show how poor appearance characteristics can rule you out of leadership opportunities before you’ve even had a chance to show others how awesome you are.   While a positive appearance must be maintained throughout your leadership career, &lt;strong&gt;understand that perceptions of poor appearance can act as a roadblock to getting ahead&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Being Polished and Groomed&lt;/strong&gt; - this signals to others that you care about your success.  Most people view interactions with a poorly groomed colleague as disrespectful.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fit/Slim&lt;/strong&gt; - The perception of “vitality” elicits trust from those around you, they will believe that you have the wherewithal to handle issues that come your way.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Appropriate wardrobe choices&lt;/strong&gt; - Whether you work on Wall Street or Silicon Valley, there is an &lt;em&gt;accepted&lt;/em&gt; look for your work attire.  Understanding what is acceptable and dressing to fit will ensure your appearance isn’t a limiting factor in your future success.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In order for your voice to be heard, you must first be in a position where people will listen to you.  If you are at a point in your career where you are delivering solid results, but just can’t seem to get to the next level, &lt;em&gt;Executive Presence&lt;/em&gt; could be the missing link.  Regardless of where you are in your career or even to what level of leadership you aspire to, &lt;em&gt;Executive Presence&lt;/em&gt; can serve as a helpful guide to ensure you can bridge the gap between merit and success.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fixing upload issues with Microsoft Office Upload Center.</title>
   <link href="http://robertgreiner.com/2014/12/fixing-pending-upload-issues-with-microsoft-office-upload-center/"/>
   <updated>2014-12-07T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/12/fixing-pending-upload-issues-with-microsoft-office-upload-center</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Sorry we couldn’t open &amp;lt;FileName&amp;gt;.pptx&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My preferred way to work with Microsoft Office and SharePoint is to map a network drive to my client’s SharePoint site and treat the files as if they were on my local drive.  Microsoft actually does a solid job syncing the files and simultaneous collaboration with my co-workers is seamless.  I’m happy when I can edit files as the same time as my team and every time I save my document gets backed up on the server and I automatically get the latest updates.&lt;/p&gt;

&lt;p&gt;Recently, I ran into an issue with SharePoint where my saved changes in PowerPoint were not getting automatically uploaded to the server.  Either PowerPoint would go in “offline mode” or the application would just stop responding.  When I examined the Microsoft Office Upload Center (or Document Cache, depending on which version of Office/Windows you are running), I noticed that all of my local changes were “pending” upload.&lt;/p&gt;

&lt;p&gt;After doing a few hours of digging, I finally figured out what the problem was.  My antivirus application - ESET Smart Security 8 - was blocking the Microsoft Office Upload Center from connecting to my client’s SharePoint site.  To resolve this issue, I simply disabled protocol filtering for PowerPoint and Microsoft Office Upload Center.  The steps below should work for you regardless of which version of MS Office and ESET you are running.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/ESET_Config.png&quot; alt=&quot;ESET Smart Security 8 Protocol Filtering&quot; title=&quot;Update Protocol Filtering options in ESET Smart Security 8&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Open the ESET GUI&lt;/li&gt;
  &lt;li&gt;Click “Settings”&lt;/li&gt;
  &lt;li&gt;Click “Advanced Settings”&lt;/li&gt;
  &lt;li&gt;Search for “Protocol Filtering” (under “Web and Email”)&lt;/li&gt;
  &lt;li&gt;Click “Excluded Applications”&lt;/li&gt;
  &lt;li&gt;Check “MSOSYNC.exe” - I also checked PowerPoint for good measure.&lt;/li&gt;
  &lt;li&gt;Save, close, and everything should be working&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are having this same issue, I understand your frustration.  This was a horrible problem to deal with and I’m glad it’s behind me.  Hopefully this helps.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Micro-Applications With AWS Lambda</title>
   <link href="http://robertgreiner.com/2014/11/micro-applications-with-aws-lambda/"/>
   <updated>2014-11-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/11/micro-applications-with-aws-lambda</id>
   <content type="html">&lt;p&gt;At this year’s &lt;a href=&quot;https://reinvent.awsevents.com/&quot;&gt;Amazon Web Services re:Invent&lt;/a&gt; conference, AWS unveiled their second compute service - &lt;a href=&quot;http://aws.amazon.com/lambda/&quot;&gt;Lambda&lt;/a&gt;.  AWS Lambda is a PaaS-like service that runs discrete chunks of code in response to a given event - without needing to manage any of the underlying compute resources.  Lambda responds to a wide range of events within your AWS infrastructure within milliseconds of their occurrence and completely removes the need for inefficient polling as you wait for resources to change.&lt;/p&gt;

&lt;p&gt;Lambda will fundamentally change the way applications are built in the future by allowing developers to shift from a single application to multiple event-based Micro-Applications.  Today, traditional software development consists of three main components: Functions, Interactions, and Data.  Functions are core business logic, Data holds business state, and the Interactions are the events that tie the two together.  Lambda exists at the intersection of Functions, Interactions, and Data by responding to particular events within your AWS infrastructure and executing a code tailored to that specific event.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/AWS_Lambda_Interactions.png&quot; alt=&quot;Functions, Events, and Data&quot; title=&quot;Traditional software development paradigm&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With the new paradigm shift that Lambda introduces, your applications turn from single source code solutions (i.e. .NET solution/project) into multiple event based Micro-Applications that consist of the core building blocks of functionality required to run your application.  This allows for the entire suite of back-end services in your application to scale in a huge way since they are individual, discrete components backed by the complete power of AWS EC2.&lt;/p&gt;

&lt;p&gt;In the example below, three Lambda applications are run to extract metadata from a photo and write it to DynamoDB (based off of an S3 event), calculate trending data and write to DynamoDB (based off of a Dynamo event from the data inserted in the first step), and finally notify the end user of trending data based on their photo (based off of the second Dynamo insert).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/AWS_Lambda_Workflow.png&quot; alt=&quot;AWS Lambda Workflow&quot; title=&quot;AWS Lambda Workflow&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Lambda also decouples your application from the compute resources required to run it.  AWS handles all of this, so you no longer have to worry about managing the infrastructure, monitoring, and logging programatically - it’s all done for you.&lt;/p&gt;

&lt;p&gt;AWS offers unique pricing for Lambda functionality based on the number of requests run paired with execution time for a given block of memory.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;$0.20 per million requests&lt;/li&gt;
  &lt;li&gt;$0.00000021 per 100 milliseconds at 128MB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are interested in getting started with Lambda, you can sign up for the Preview &lt;a href=&quot;http://aws.amazon.com/lambda/preview/&quot;&gt;here&lt;/a&gt;.  AWS is gracious enough to offer 3.2 million seconds of execution and 1 million requests as part of the Free Tier.  What are you waiting for?  It’s time to experience a new way to build applications.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Presentation Slides: Internet of Things</title>
   <link href="http://robertgreiner.com/2014/10/internet-of-things-presentation-slides/"/>
   <updated>2014-10-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/10/internet-of-things-presentation-slides</id>
   <content type="html">&lt;p&gt;Last weekend, I &lt;a href=&quot;http://www.slideshare.net/robertgreiner/fin-fest-2014-internet-of-things-and-apis&quot;&gt;co-presented a talk&lt;/a&gt; on the Internet of Things at a company sponsored conference.  According to the 2014 &lt;a href=&quot;http://www.gartner.com/technology/research/methodologies/hype-cycle.jsp&quot;&gt;Gartner Hype Cycle&lt;/a&gt;, IoT is at the very peak of “Inflated Expectations” - essentially making any use of the term “Internet of Things” immediately useless.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Peak of Inflated Expectations:&lt;/strong&gt; Early publicity produces a number of success stories — often accompanied by scores of failures. Some companies take action; many do not. -Gartner&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/2014-hype-cycle.jpg&quot; alt=&quot;2014 Gartner Hype Cycle&quot; title=&quot;IoT Hype Cycle&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In our talk, Brian and I try to simplify IoT down to it’s &lt;em&gt;verticals&lt;/em&gt; - connected home, security, remote control for life (phone), etc.  We also dive into how IoT applications work at their core and outline a potential architecture for development.&lt;/p&gt;

&lt;p&gt;The presentation slides are included below, please feel free to reach out and let me know what you think.&lt;/p&gt;

&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/40467381&quot; width=&quot;510&quot; height=&quot;420&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;
&lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/robertgreiner/fin-fest-2014-internet-of-things-and-apis&quot; title=&quot;Fin fest 2014 - Internet of Things and APIs&quot; target=&quot;_blank&quot;&gt;Fin fest 2014 - Internet of Things and APIs&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;//www.slideshare.net/robertgreiner&quot; target=&quot;_blank&quot;&gt;Robert Greiner&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Talk Slides: Distributed Computing, the CAP Theorem, and How to Improve System Architectures</title>
   <link href="http://robertgreiner.com/2014/09/distributed-computing-architecture-cap-theorem-talk/"/>
   <updated>2014-09-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/09/distributed-computing-architecture-cap-theorem-talk</id>
   <content type="html">&lt;p&gt;Lots of companies - especially in the non-startup world - are starting to look closely at upgrading their legacy systems to the “next generation” - services, scalability, NoSQL, etc.  Most of these systems have existed, in some form or fashion, for decades and are beginning to impede the business’ ability to handle new customer demands - especially around time-to-market and ultra-slow workloads that are experiencing poor performance.&lt;/p&gt;

&lt;p&gt;Whether you are creating a new, distributed, architecture or simply improving an existing slow process, there are complexity concerns that you will have to deal with.  It’s better to understand these issues up-front and make accommodations for them before you get blindsided in the middle of a long-term project.&lt;/p&gt;

&lt;p&gt;In the talk below, Nathan and I discussed some of the basics around distributed computing, architecture, and storage and introduce some of the issues and constraints around creating the next-generation architecture for your organization that will sustain you through the next decade.&lt;/p&gt;

&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/38226604&quot; width=&quot;595&quot; height=&quot;485&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;
&lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/robertgreiner/petabytes-and-nanoseconds&quot; title=&quot;Petabytes and Nanoseconds&quot; target=&quot;_blank&quot;&gt;Petabytes and Nanoseconds&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;//www.slideshare.net/robertgreiner&quot; target=&quot;_blank&quot;&gt;Robert Greiner&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>CAP Theorem: Revisited</title>
   <link href="http://robertgreiner.com/2014/08/cap-theorem-revisited/"/>
   <updated>2014-08-14T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/08/cap-theorem-revisited</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;Close to two months ago, I wrote a &lt;a href=&quot;http://robertgreiner.com/2014/06/cap-theorem-explained/&quot;&gt;blog post explaining the CAP Theorem&lt;/a&gt;. Since publishing, I’ve come to realize that my thinking on the subject was quite outdated and is no longer applicable to the real world. I’ve attempted to make up for that in this post.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In today’s technical landscape, we are witnessing a strong and increasing desire to scale systems &lt;em&gt;out&lt;/em&gt; when additional resources (compute, storage, etc.) are needed to successfully complete workloads in a reasonable time frame. This is accomplished through adding additional commodity hardware to a system to handle the increased load. As a result of this scaling strategy, an additional penalty of complexity is incurred in the system. This is where the CAP theorem comes into play.&lt;/p&gt;

&lt;p&gt;The CAP Theorem states that, in a distributed system (a collection of interconnected nodes that share data.), you can only have two out of the following three guarantees across a write/read pair: Consistency, Availability, and Partition Tolerance - one of them must be sacrificed. However, as you will see below, you don’t have as many options here as you might think.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/CAP-overview.png&quot; alt=&quot;CAP Theorem Overview&quot; title=&quot;CAP Theorem Overview&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt; - A read is guaranteed to return the most recent write for a given client.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Availability&lt;/strong&gt; - A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Partition Tolerance&lt;/strong&gt; - The system will continue to function when network partitions occur.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before moving further, we need to set one thing straight. Object Oriented Programming != Network Programming!  There are assumptions that we take for granted when building applications that share memory, which break down as soon as nodes are split across space and time.&lt;/p&gt;

&lt;p&gt;One such &lt;a href=&quot;http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing&quot;&gt;&lt;em&gt;fallacy of distributed computing&lt;/em&gt;&lt;/a&gt; is that networks are reliable. They aren’t. Networks and parts of networks go down frequently and unexpectedly. Network failures &lt;em&gt;happen to your system&lt;/em&gt; and you don’t get to choose when they occur.&lt;/p&gt;

&lt;p&gt;Given that networks aren’t completely reliable, you must tolerate partitions in a distributed system, period.  Fortunately, though, you get to choose what to do when a partition does occur. According to the CAP theorem, this means we are left with two options: Consistency and Availability.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CP&lt;/strong&gt; - Consistency/Partition Tolerance - Wait for a response from the partitioned node which could result in a timeout error. The system can also choose to return an error, depending on the scenario you desire.  Choose Consistency over Availability when your business requirements dictate atomic reads and writes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2014/CAP-CP-full.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/CAP-CP.png&quot; alt=&quot;CAP Theorem Trade-offs CP&quot; title=&quot;CP&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;AP&lt;/strong&gt; - Availability/Partition Tolerance - Return the most recent version of the data you have, which could be stale. This system state will also accept writes that can be processed later when the partition is resolved.  Choose Availability over Consistency when your business requirements allow for some flexibility around when the data in the system synchronizes.  Availability is also a compelling option when the system needs to continue to function in spite of external errors (shopping carts, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2014/CAP-AP-full.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/CAP-AP.png&quot; alt=&quot;CAP Theorem Trade-offs AP&quot; title=&quot;CAP AP&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The decision between Consistency and Availability is a &lt;em&gt;software trade off&lt;/em&gt;. You can choose what to do in the face of a network partition - the control is in your hands. Network outages, both temporary and permanent, are a fact of life and occur whether you want them to or not - this exists outside of your software.&lt;/p&gt;

&lt;p&gt;Building distributed systems provide many advantages, but also adds complexity. Understanding the trade-offs available to you in the face of network errors, and choosing the right path is vital to the success of your application. Failing to get this right from the beginning could doom your application to failure before your first deployment.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>2014 Cloud Scale Challenge</title>
   <link href="http://robertgreiner.com/2014/08/pariveda-solutions-2014-cloud-scale-challenge/"/>
   <updated>2014-08-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/08/pariveda-solutions-2014-cloud-scale-challenge</id>
   <content type="html">&lt;p&gt;How do you get around 20 people to invest crazy amounts of personal time and energy into learning technologies that are important to know, but do not directly impact their day-to-day work lives? Turn it into a competition!&lt;/p&gt;

&lt;p&gt;Over the past several months, eight teams from the &lt;a href=&quot;http://parivedasolutions.com&quot;&gt;Pariveda Solutions&lt;/a&gt; Dallas office have worked tirelessly to design and implement a cloud-based architecture that a perspective client could be interested in, today. Each team had to meet a minimum set of requirements (more on that below), as well as implement their cloud architecture in &lt;strong&gt;both&lt;/strong&gt; AWS and Microsoft Azure.  We called this event the &lt;em&gt;2014 Cloud Scale Challenge&lt;/em&gt; - the first of its kind.&lt;/p&gt;

&lt;p&gt;Last week, we hosted &lt;em&gt;Demo Day&lt;/em&gt; where each team had an opportunity to show the group what they built and try to beat the competition in a measure of cost vs. performance. We had some interesting solutions, approaches, and lessons learned that are outlined below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/2014-cloud-scale-challenge.png&quot; alt=&quot;2014 Cloud Scale Challenge Demo Day&quot; title=&quot;Demo Day&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-rules&quot;&gt;The Rules&lt;/h3&gt;
&lt;p&gt;The goal of this competition was to have each team design a simple E-Commerce application that can process large transaction volumes. This involved creating a suite of services to power the application, as well as a simple front-end to demonstrate functionality. Finally, each team had to come up with their own method of proving performance.&lt;/p&gt;

&lt;p&gt;Each team was required to successfully meet these requirements on &lt;strong&gt;both&lt;/strong&gt; AWS and Azure, but they get to choose which solution to use during the competition. To make things even more interesting, each cloud solution had to consist of &lt;em&gt;at least&lt;/em&gt; three services from each provider (EC2, S3, etc.)&lt;/p&gt;

&lt;h4 id=&quot;user-features---create-a-website-that-performs-the-following-actions&quot;&gt;User Features - Create a website that performs the following actions&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;List products (100+ unique SKUs)&lt;/li&gt;
  &lt;li&gt;Search for a product by name or SKU&lt;/li&gt;
  &lt;li&gt;Create an order&lt;/li&gt;
  &lt;li&gt;Add an item to an existing order&lt;/li&gt;
  &lt;li&gt;Submit order&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;service-slas--the-system-must-handle-the-following-request-volumes&quot;&gt;Service SLAs- The system must handle the following request volumes&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;10,000 concurrent product &lt;em&gt;search&lt;/em&gt; requests (10,000/second)&lt;/li&gt;
  &lt;li&gt;30,000 &lt;em&gt;add item&lt;/em&gt; requests per minute (500+/second)&lt;/li&gt;
  &lt;li&gt;3,000 &lt;em&gt;submit order&lt;/em&gt; requests per minute (50+/second)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;performance-slas&quot;&gt;Performance SLAs&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;All orders and line items must persist to the backing store within 10 seconds of the request&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;OK&lt;/em&gt; response must come within 500 milliseconds of the request&lt;/li&gt;
  &lt;li&gt;Search results must return to the user in less than 1 second&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-scoring&quot;&gt;The Scoring&lt;/h3&gt;
&lt;p&gt;The team that wins must have the best score in two of the three categories above. In the event of a tie, the leading teams must compete with their other solution.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/demo-day-rules.png&quot; alt=&quot;Demo Day Rules&quot; title=&quot;Demo Day Rules&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;technology-choices&quot;&gt;Technology Choices&lt;/h3&gt;
&lt;p&gt;I was surprised to find that the teams were split down the middle between competing with their AWS and Azure solutions. We were right at 50%. Here are the unique technology stack decisions made across the competition.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Azure - PaaS - C# - Windows&lt;/li&gt;
  &lt;li&gt;Azure - PaaS - Node.js - Linux&lt;/li&gt;
  &lt;li&gt;AWS - Java - Linux&lt;/li&gt;
  &lt;li&gt;AWS - Node.js - Linux&lt;/li&gt;
  &lt;li&gt;AWS - Node.js - Windows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three of the teams ended up starting with one technology stack, and then completely pivoting to a different language and OS midway through the competition because they weren’t getting the results they expected.&lt;/p&gt;

&lt;h3 id=&quot;architecture-approaches&quot;&gt;Architecture Approaches&lt;/h3&gt;
&lt;p&gt;As you might expect, the architecture implementation a team ended up with was the key driver of success or failure in this competition. Any software developer on the planet can create a &lt;em&gt;good enough&lt;/em&gt; solution and throw tons of computing power at the problem to meet their performance demands - a strategy that will bankrupt the infrastructure budget of even the largest companies. However, it takes a skilled cloud architect to analyze the various trade-offs each decision incurs and strive to make &lt;em&gt;lots of really good small decisions&lt;/em&gt; to succeed.&lt;/p&gt;

&lt;p&gt;Here’s the AWS architecture that one of the better-performing  teams put together - in both cost and performance.
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/demo-day-architecture.png&quot; alt=&quot;2014 Cloud Scale Challenge Demo Day Architecture&quot; title=&quot;Demo Day Architecture&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;lessons-learned&quot;&gt;Lessons Learned&lt;/h3&gt;
&lt;p&gt;This was my favorite part of the day. Each team had a wealth of knowledge and experience to speak about that didn’t exist just a few months prior to the competition. Everyone unanimously agreed that they are much more comfortable with cloud technologies, and feel confident they could join any cloud-based project and hit the ground running. Mission accomplished.&lt;/p&gt;

&lt;p&gt;In addition, there were some more nuanced lessons learned that are outlined below:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The teams had a unique opportunity to create a solution from scratch: File-&amp;gt;New Project.  This is something that some of them haven’t done in a long time due to working on larger, more established projects.&lt;/li&gt;
  &lt;li&gt;The knowledge gained with one cloud provider (i.e., Azure) does not necessarily help you in the other.&lt;/li&gt;
  &lt;li&gt;Teams that started focusing on Azure’s Platform as a Service (PaaS) tended to use their Azure solution for the competition.&lt;/li&gt;
  &lt;li&gt;Creating a solution that works across both cloud providers with minimal code changes, restricted teams from using services that are unique across a single provider (PaaS on Azure).&lt;/li&gt;
  &lt;li&gt;AWS charges you for the whole hour, even if you spin an EC2 instance up for just a few seconds.&lt;/li&gt;
  &lt;li&gt;The team that had the best raw performance focused intently on the low-level aspects of their solution: frameworks, web servers, operating systems, and programming languages. They didn’t pick what was &lt;em&gt;familiar&lt;/em&gt; to them, they picked what would perform best.&lt;/li&gt;
  &lt;li&gt;Scaling out (adding more machines) is more effective than scaling up (adding more compute resources).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;When we set out to create this competition, our goal was simple. Incentiveize people to get up-to-speed on technology platforms that are desperately needed in the industry.  We didn’t know what the response would be, how applicable the experience would be, or even how many teams would be able to finish.&lt;/p&gt;

&lt;p&gt;At the end of demo day, we felt like the results far exceeded our expectations. The teams impressed us with their tenacity and intuitive problem solving abilities, and there was a high level of excitement and passion around the subject area.&lt;/p&gt;

&lt;p&gt;We consider the 2014 Cloud Scale Challenge an overwhelming success and I can’t wait to see what the teams come up with next year.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fixing Account Sync Errors in Personal Capital</title>
   <link href="http://robertgreiner.com/2014/07/fixing-account-sync-errors-in-personal-capital/"/>
   <updated>2014-07-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/07/fixing-account-sync-errors-in-personal-capital</id>
   <content type="html">&lt;p&gt;I love collecting data about my life.  I track &lt;a href=&quot;https://app.asana.com/&quot;&gt;the things I get done&lt;/a&gt;, &lt;a href=&quot;http://www.myfitnesspal.com/&quot;&gt;the foods I eat&lt;/a&gt;, &lt;a href=&quot;http://www.youneedabudget.com/&quot;&gt;the dollars I spend&lt;/a&gt;, &lt;a href=&quot;https://www.goodreads.com/user/show/12690237-robert-greiner&quot;&gt;the books I read&lt;/a&gt;, and &lt;a href=&quot;https://www.personalcapital.com/&quot;&gt;my net worth&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I recently switched from Mint.com (better for tracking spending) to Personal Capital (better for tracking investments) to more effectively track my investments and make better decisions for the long term.&lt;/p&gt;

&lt;p&gt;When I was making the move to Personal Capital, I found that some of my accounts weren’t syncing properly - Personal Capital said the username/password I was supplying was incorrect.  I knew this couldn’t be the case since (1) I just logged into the account successfully outside of Personal Capital and (2) I use a &lt;a href=&quot;https://agilebits.com/onepassword&quot;&gt;password manager&lt;/a&gt; and was copy/pasting directly into Personal Capital.&lt;/p&gt;

&lt;p&gt;Searching Google offered some help, but not much.  I found other people having trouble connecting their accounts like me, but nothing resolved (folks, this post is for you).  Even so, I figured the problem had to be on my end, since  these were pretty significant financial institutions I was using and I thought there was no way syncing was broken for everyone.&lt;/p&gt;

&lt;p&gt;After trying a few different things, I settled on my password manager.  I’ve had troubles in the past with various websites balking at the length or choice of special-characters 1Password picked for me.&lt;/p&gt;

&lt;p&gt;I changed my password on one of the &lt;em&gt;broken&lt;/em&gt; account links to a strict alphanumeric password under 15 characters (something like &lt;code class=&quot;highlighter-rouge&quot;&gt;Lhfey982DP7Z2FF&lt;/code&gt;) and everything worked.&lt;/p&gt;

&lt;p&gt;I played around with the configuration some more and from what I can tell, Personal Capital is &lt;strong&gt;stripping out characters it doesn’t like from your password&lt;/strong&gt;, and sending the &lt;em&gt;cleaned&lt;/em&gt; password to your financial institution with characters missing - which will make your password incorrect.&lt;/p&gt;

&lt;p&gt;From what I can tell, here are the characters not allowed in your password that Personal Capital won’t warn you about.  The list may be a bit different, but this is probably a safe place to start: &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;/&lt;/code&gt;,  &lt;code class=&quot;highlighter-rouge&quot;&gt;\&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;]&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;[&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you are experiencing the same problem, change your password to something without the characters above and try again.  Hopefully, everything will work out for you.&lt;/p&gt;

&lt;p&gt;In retrospect, a warning on Personal Capital’s side would have been nice, but all my accounts are syncing properly now, so I’m over it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Be The Worst</title>
   <link href="http://robertgreiner.com/2014/06/be-the-worst/"/>
   <updated>2014-06-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/06/be-the-worst</id>
   <content type="html">&lt;p&gt;When I was in college, I took a particularly challenging Probability and Statistics class - most of the subject matter was new to me and it took me all of about five minutes to realize I was severely out of my element.  One day after class, I expressed some frustration because I felt like there was only so much I could learn from the book and online examples, and that limited knowledge alone was insufficient to excel in my class.  Overhearing my complaint, my professor gave me some great advice that I will never forget: &lt;strong&gt;“All you have to do to succeed in this class, or any area of life, is to find a group of people who are smarter than you and start working with them.”&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What do I do when my rate of learning has leveled off?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You have taken the time to learn something new, immersed yourself in the subject matter, practiced diligently for a period of time and look up and see that you are ahead of those around you.  Congratulations on your accomplishment.  Now what?  There are only so many books, blogs, and other resources you can learn from until you reach a point where &lt;em&gt;you must learn new skills from other humans&lt;/em&gt;.  We are social creatures, by nature.  We rely on each other to survive and part of that survival involves learning from each other.  It’s difficult to imagine a world where we all had to learn everything on our own and couldn’t benefit from the knowledge and insight of those around us.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;http://www.amazon.com/Apprenticeship-Patterns-Guidance-Aspiring-Craftsman/dp/0596518382&quot;&gt;Apprenticeship Patterns&lt;/a&gt;, Dave Hoover and Adewale Oshineye outline this very problem and propose a solution [pattern] called &lt;strong&gt;Be the Worst&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea behind being the worst is to surround yourself with people who are better than you in a given area - this will force you into a position where you have room to grow.  Be the worst one around at programming or guitar or soccer.  Over time, the better people around you will cause you to elevate your game, mostly through observation and instruction.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[As] the weakest member of the team, you should be working harder than anyone else. This is because the goal is not to stay the weakest, but to start at the bottom and work your way up. You do this by consciously finding ways to improve and mimicking the stronger [team members] until you are on the same level as the rest of the team. -Apprenticeship Patterns&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of course, there are risks associated with this strategy.  You will, by definition, be the least effective person around.  This means that your contributions will result in a net drag on the team.  Because of this, most teams and organizations won’t put up with you for very long.  You will also force yourself into a sink-or-swim situation with some very real consequences if you don’t improve quickly.  The best solution to mitigate this risk is to &lt;em&gt;outwork the problem&lt;/em&gt; - make &lt;em&gt;being the worst&lt;/em&gt; a temporary solution to solve a larger problem.  Focus on consistent, determined effort to get you from where you are to where you want to be.  If you find yourself getting distressed, you may have bitten off too much and it’s time to scale back a bit.&lt;/p&gt;

&lt;p&gt;Being the worst is a great way to improve your effectiveness in a given subject area quickly.  However, this is a risky strategy that takes concerted effort to constantly improve and ensure you aren’t drowning in the more intense sink-or-swim environment.  Next time you are looking for a way to improve your skills and have exhausted all of the resources currently available, seek out a change in scenery.  Find a team filled with people who are better than you, work hard, and watch yourself grow at a rate you didn’t think was possible.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>CAP Theorem: Explained</title>
   <link href="http://robertgreiner.com/2014/06/cap-theorem-explained/"/>
   <updated>2014-06-18T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/06/cap-theorem-explained</id>
   <content type="html">&lt;h2 id=&quot;note-this-post-is-outdated--you-can-find-the-most-up-to-date-version-here&quot;&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;This post is outdated.  You can find the most up-to-date version &lt;a href=&quot;http://robertgreiner.com/2014/08/cap-theorem-revisited/&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/h2&gt;

&lt;hr /&gt;

&lt;div data-alert=&quot;&quot; class=&quot;alert-box alert round&quot;&gt;
  Note: This post is outdated.  Please find the updated version &lt;a href=&quot;http://robertgreiner.com/2014/08/cap-theorem-revisited/&quot;&gt;here&lt;/a&gt;.  I am intentionally leaving this article here so I do not disrupt other sites linking back to me.
  &lt;a href=&quot;#&quot; class=&quot;close&quot;&gt;&amp;times;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Several years ago, building performance into a software system was simple - you either increased your hardware resources (scale up) or modified your application to run more efficiently (performance tuning). Today, there’s a third option: horizontal scaling (scale out).&lt;/p&gt;

&lt;p&gt;Horizontal scaling of software systems has become necessary in recent years, due to the global nature of computing and the ever-increasing performance demands on applications. In many cases, it is no longer acceptable to run a single server with a single database in a single data center adjacent to your company’s headquarters.  We need truly distributed environments to tackle the business challenges of today.&lt;/p&gt;

&lt;p&gt;Unfortunately, the performance benefits that horizontal scaling provides come at a cost - complexity. Distributed systems introduce many more factors into the performance equation than existed before. Data records vary across clients/nodes in different locations.  Single points of failure destroy system up-time, and intermittent network issues creep up at the worst possible time.&lt;/p&gt;

&lt;p&gt;These concerns of &lt;em&gt;consistency&lt;/em&gt; (C), &lt;em&gt;availability&lt;/em&gt; (A), and &lt;em&gt;partition tolerance&lt;/em&gt; (P) across distributed systems make up what &lt;a href=&quot;http://en.wikipedia.org/wiki/Eric_Brewer_(scientist)&quot;&gt;Eric Brewer&lt;/a&gt; coined as the &lt;strong&gt;CAP Theorem&lt;/strong&gt;.  Simply put, the CAP theorem demonstrates that any distributed system cannot guaranty C, A, and P simultaneously, rather, trade-offs must be made at a point-in-time to achieve the level of performance and availability required for a specific task.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/CAP-overview.png&quot; alt=&quot;CAP Theorem Overview&quot; title=&quot;CAP Theorem Overview&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[C] Consistency&lt;/strong&gt; - All nodes see the same data at the same time.&lt;/p&gt;

&lt;p&gt;Simply put, performing a &lt;em&gt;read&lt;/em&gt; operation will return the value of the most recent &lt;em&gt;write&lt;/em&gt; operation causing all nodes to return the same data. A system has consistency if a transaction starts with the system in a consistent state, and ends with the system in a consistent state. In this model, a system can (and does) shift into an inconsistent state during a transaction, but the entire transaction gets rolled back if there is an error during any stage in the process.&lt;/p&gt;

&lt;p&gt;Typical relational databases are consistent: SQL Server, MySQL, and PostgreSQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[A] Availability&lt;/strong&gt; - Every request gets a response on success/failure.&lt;/p&gt;

&lt;p&gt;Achieving availability in a distributed system requires that the system remains operational 100% of the time. Every client gets a response, regardless of the state of any individual node in the system. This metric is trivial to measure: either you can submit read/write commands, or you cannot.&lt;/p&gt;

&lt;p&gt;Typical relational databases are also available: SQL Server, MySQL, and PostgreSQL. This means that relational databases exist in the &lt;strong&gt;CA&lt;/strong&gt; space - consistency and availability. However, CA is not only reserved for relational databases - some document-oriented tools like ElasticSearch also fall under the CA umbrella.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[P] Partition Tolerance&lt;/strong&gt; - System continues to work despite message loss or partial failure.&lt;/p&gt;

&lt;p&gt;Most people think of their data store as a single node in the network. &lt;em&gt;“This is our production SQL Server instance”&lt;/em&gt;. Anyone who has run a production instance for more than four minutes, quickly realizes that this creates a &lt;em&gt;single point of failure&lt;/em&gt;. A system that is partition-tolerant can sustain any amount of network failure that doesn’t result in a failure of the entire network.  Data records are sufficiently replicated across combinations of nodes and networks to keep the system up through intermittent outages.&lt;/p&gt;

&lt;p&gt;Storage systems that fall under Partition Tolerance with Consistency (CP): MongoDB, Redis, AppFabric Caching, and MemcacheDB. CP systems make for excellent distributed caches since every client gets the same data, and the system is partitioned across network boundaries.&lt;/p&gt;

&lt;p&gt;Storage systems that fall under Partition Tolerance with Availability (AP) include DynamoDB, CouchDB, and Cassandra.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2014/CAP-full.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/CAP.png&quot; alt=&quot;CAP Theorem Trade-offs&quot; title=&quot;CAP Theorem Trade-offs&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Distributed systems allow us to achieve a level of computing power and availability that were simply not available in yesteryears. Our systems have higher performance, lower latency, and near 100% up-time in data centers that span the entire globe. Best of all, the systems of today are run on commodity hardware that is easily obtainable and configurable with costs approaching $0.&lt;/p&gt;

&lt;p&gt;All of this computing power and benefit comes at a price, however. Distributed systems are more complex than their single-network counterparts. There are many more tools and skills that need to be acquired in order to create a truly scalable, high performance system. Understanding the complexity incurred in distributed systems, making the appropriate trade-offs for the task at hand (CAP), and selecting the right tool for the job are all critical skills in a world where computing systems are moving out, not up.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Assembly uses version X which has a higher version than referenced assembly error</title>
   <link href="http://robertgreiner.com/2014/06/assembly-uses-version-which-has-a-higher-version-than-referenced-assembly-error/"/>
   <updated>2014-06-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/06/assembly-uses-version-which-has-a-higher-version-than-referenced-assembly-error</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Assembly ‘YYY, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’ uses ‘Microsoft.WindowsAzure.Storage, Version=4.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ which has a higher version than referenced assembly ‘Microsoft.WindowsAzure.Storage, Version=3.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’	D:\Source...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; the steps below will fix this error regardless of the library you are trying to use.  You should still try the steps below, even if you don’t have an issue with Microsoft.WindowsAzure.Storage.&lt;/p&gt;

&lt;p&gt;I ran into an interesting issue creating a new Microsoft Azure Cloud Services project with a single Worker Role off of an existing project.  The legacy windows application used a NuGet reference to the WindowsAzure.Storage library (4.0.1.0), while the new Worker Role project installed an older version (3.0.3.0) by default.&lt;/p&gt;

&lt;p&gt;As you can imagine, this caused some grief when it came time to build and deploy the application.  Luckily, the fix is fairly simple.  All you need to do is update the project (&lt;code class=&quot;highlighter-rouge&quot;&gt;.csproj&lt;/code&gt;) that contains the older reference to the new version.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/assembly-version-csproj.png&quot; alt=&quot;.NET Assembly Version Error&quot; title=&quot;.NET Assembly Version Error&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps for solving the **Assembly uses version X which has a higher version than referenced assembly&lt;/strong&gt; error:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Right click project&lt;/li&gt;
  &lt;li&gt;Click “Unload”&lt;/li&gt;
  &lt;li&gt;Right click project&lt;/li&gt;
  &lt;li&gt;Click “Edit”&lt;/li&gt;
  &lt;li&gt;Search for &lt;strong&gt;WindowsAzure.Storage&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Update version to 4.0.1.0&lt;/li&gt;
  &lt;li&gt;Save&lt;/li&gt;
  &lt;li&gt;Reload Project&lt;/li&gt;
  &lt;li&gt;Build&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Cloud Benefits</title>
   <link href="http://robertgreiner.com/2014/05/cloud-benefits/"/>
   <updated>2014-05-29T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/05/cloud-benefits</id>
   <content type="html">&lt;p&gt;I was having coffee with a non-technical friend last week, and we got on the topic of cloud computing.  The extent of his knowledge of &lt;em&gt;the cloud&lt;/em&gt; ended at online tools like Mint.com and other services, like a-computer-hosted-at-a-location-other-than-my-work. Not too bad for a start.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/the_cloud.png&quot; alt=&quot;XKCD: The Cloud&quot; title=&quot;XKCD: The Cloud&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After adding a bit of clarifying information around cloud computing, we got into some of the side benefits that some people don’t tend to think about when considering the move to a cloud provider.  This is not an exhaustive list, but more of a conversation starter.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Improved Logistics&lt;/strong&gt; -  The time it takes to order a new server, get the purchase approved, wait for shipping, and, &lt;em&gt;finally&lt;/em&gt;, perform the physical installation can take months. With a cloud solution, you can have your new server in minutes. In a day and age where physical server resources are at a premium - even with VMs - this feature is especially compelling.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reduced Computing and Storage Costs&lt;/strong&gt; - With the cloud, you only pay for what you use, never more. Need a super computer for 24 hours? It’s yours… There are a myriad of new &lt;a href=&quot;http://dropcam.com&quot;&gt;physical products&lt;/a&gt; available to consumers today that would have been cost-prohibitive to produce without the cloud. Cloud services are even making the &lt;a href=&quot;http://aws.amazon.com/solutions/case-studies/bristol-myers-squibb/&quot;&gt;development of new lifesaving pharmaceuticals&lt;/a&gt; cost effective, improving the quality of life across the globe.
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/cloud_costs_chart.png&quot; alt=&quot;Projected Cloud Costs&quot; title=&quot;Chart of projected cloud costs&quot; class=&quot;center&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Reduced Real-Estate Costs&lt;/strong&gt; -  Oh, the servers you needed six months ago finally came in? Great. Where are you going to put them?  Hosting hardware is tedious, let someone else do it for you.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Better Disaster Recovery&lt;/strong&gt; - Most companies will tell you that they have a solid disaster recovery plan. I would wager that most of them don’t. I can’t tell you how many organizations I’ve consulted at, where their “disaster recovery” plan consisted of a few legacy servers in a dusty warehouse in the same county.  Cloud platforms are geographically dispersed in world class data centers all around the world, creating an effective disaster recovery infrastructure for you.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Automatic Data Replication&lt;/strong&gt; - Creating a solid disaster recovery plan is not a trivial task - even if your systems are 100% cloud-based. However, cloud providers like Microsoft Azure make things a bit easier for you by &lt;a href=&quot;http://blogs.msdn.com/b/windowsazurestorage/archive/2011/09/15/introducing-geo-replication-for-windows-azure-storage.aspx&quot;&gt;automatically replicating your data across multiple data centers&lt;/a&gt;.  This is done automatically for you, by default.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Enhanced Security&lt;/strong&gt; - What usually exists as an afterthought in most organizations is baked-in to every layer of a cloud platform. The major cloud providers have super-secure data centers - both virtually and physically - all over the globe with a &lt;a href=&quot;http://aws.amazon.com/compliance/&quot;&gt;robust level of compliance certifications&lt;/a&gt; to ensure that your data is secure at every level.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I am constantly surprised at the rapid pace of development that cloud providers are sustaining. Computing power is rising while &lt;a href=&quot;http://robertgreiner.com/2014/04/cloud-price-wars&quot;&gt;prices are falling&lt;/a&gt;, &lt;a href=&quot;http://robertgreiner.com/2013/11/amazon-web-services-appstream/&quot;&gt;new managed services&lt;/a&gt; are making our lives as product and software developers easier, and the barrier for entry is lowered almost daily.&lt;/p&gt;

&lt;p&gt;The time to start investing in moving to the cloud is now. Whether it is introductory discussions, developer/operations training, or a full readiness assessment. The longer you wait to get started, the further behind you will be when you are forced to make a move due to physical, scale, geographical, or cost constraints.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Personal Styles &amp; Effective Performance</title>
   <link href="http://robertgreiner.com/2014/05/personal-styles-and-effective-performance-review/"/>
   <updated>2014-05-07T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/05/personal-styles-and-effective-performance-review</id>
   <content type="html">&lt;p&gt;I pride myself on being able to make effective decisions, quickly, with few details required.  I am typically unemotional about the decision-making process and rely heavily on my ability to fix whatever problems may arise from a decision that was made too hastily.  I place a heavy emphasis on goals and accomplishments, and strive to move forward on a project in order to achieve my objectives.  In short, I have a &lt;strong&gt;driving&lt;/strong&gt; personality style.  People who share my love for quick decision-making typically describe me as: independent, practical, decisive, and efficient.&lt;/p&gt;

&lt;p&gt;I also tend to ignore how others will &lt;em&gt;feel&lt;/em&gt; about the decisions I make, and will typically leave people out of the decision-making process - when more people are involved in a decision, it results in too many opinions and communication inefficiencies.  However, this can result in unwanted &lt;strong&gt;tension&lt;/strong&gt; between me and others on my team who want their vote to count as equally as mine.  In cases like this, people who share my love for quick decision-making are typically described as: pushy, dominating, tough, and harsh.&lt;/p&gt;

&lt;p&gt;Wait. What?  How is it that 50% of the time, I am applauded for my practical and decisive behaviors, and in the other 50% I’m pushy and harsh?  In short, when I’m not at my best, my behaviors inject &lt;strong&gt;unproductive tension&lt;/strong&gt; into a relationship - especially when I am approaching an interaction from a defensive state of mind.  This tension can cause others to become defensive in their own way which forces the relationship into a vicious cycle.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Tension, which can have either a positive or negative effect on us, is a stimulus that causes us to act rather than to remain inactive… What we may not realize is that while we may be in our comfort zones when we behave in certain ways, we might be creating tension for someone else. - Personal Styles &amp;amp; Effective Performance&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In &lt;a href=&quot;http://www.amazon.com/Personal-Styles-Effective-Performance-Merrill/dp/0801968992&quot;&gt;Personal Styles &amp;amp; Effective Performance&lt;/a&gt;, David Merrill points out that a significant portion of the world’s population has social and behavioral preferences that are &lt;em&gt;different than yours&lt;/em&gt;.  The key to successful and fruitful relationships is to understand the preferences of the people you interact with and adjust your behavior accordingly.  This is called &lt;strong&gt;versatility&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When you succeed with social style, you understand what effects your actions can have on others. You know how to make your behavior say to someone else what you truly intend to say. - Personal Styles &amp;amp; Effective Performance&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/behavioral-descriptions.png&quot; alt=&quot;DiSC behavioral descriptions&quot; title=&quot;Positive and negative descriptions associated with behavioral styles&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A high level of versatility, then, is the key behavioral ingredient that will cause people to describe you using the positive adjectives above, instead of the negative ones.  In my case, one way to act with more versatility as a driver is to take extra time to listen to the perspectives of others and avoid taking action until everyone involved has had a chance to provide input.&lt;/p&gt;

&lt;p&gt;The key to success in personal relationships is not to treat others how you would like to be treated, but rather to &lt;a href=&quot;http://robertgreiner.com/2014/04/the-platinum-rule&quot;&gt;treat others how &lt;em&gt;they&lt;/em&gt; would like to be treated&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>You Need A Budget</title>
   <link href="http://robertgreiner.com/2014/05/you-need-a-budget/"/>
   <updated>2014-05-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/05/you-need-a-budget</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/ynab-rules.png&quot; alt=&quot;YNAB - 4 rules&quot; title=&quot;YNAB&quot; class=&quot;left&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve tried every possible budgeting software and practice in existence - with little to no success.  I’ve used cash envelopes, Mint.com, Quicken, pencil-and-paper, and even the ineffective take-a-quick-look-at-my-checking-account-balance-to-see-if-i-can-afford-this-item method.  To make matters worse, I had my money spread across multiple accounts - emergency fund, car savings, checking, etc. making everything that much more confusing.  I was getting to the point where I thought budgeting just wasn’t for me, I couldn’t seem to wrap my head around it.&lt;/p&gt;

&lt;p&gt;Then, one day I met &lt;a href=&quot;http://ynab.refr.cc/N95TNLK&quot;&gt;You Need a Budget&lt;/a&gt; - or, YNAB.  YNAB is a hyper-usable piece of budgeting software that is &lt;a href=&quot;http://www.youneedabudget.com/method&quot;&gt;built around four easy rules&lt;/a&gt;.  If you only take one thing away from this post, make sure it’s &lt;strong&gt;Rule #4&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Give Every Dollar a Job&lt;/strong&gt; - When you look at your checking account, what is that $1,744.32 balance really telling you?  Can you go buy that rad flat screen you saw at Costco this morning, or do you need those dollars to fund your rent for next month?  Who knows?!  If you’re like me, this is where &lt;em&gt;impulse&lt;/em&gt; wins over clear thinking, which means I end up coming home with the flat screen and a new PS4.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Save for a Rainy Day&lt;/strong&gt; - Plan for the larger, less frequent expenses so you aren’t caught off guard.  This year, I owed my HOA dues, car insurance premiums, taxes, and a couple of additional largeish expenses all in the first four months.  Having some cushion in my budget helped me get through it.  Bruised, but not broken.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Roll with the Punches&lt;/strong&gt; - My &lt;em&gt;least favorite&lt;/em&gt; thing about any budget (except YNAB) is the strict restriction placed on my spending.  If I only allocated $150 for eating out, and I get invited to one-to-many get-togethers, I ended up feeling like a chump when I exceeded my budget.  That’s no way to live life!  With YNAB, you can make &lt;strong&gt;intentional decisions&lt;/strong&gt; to overspend in one category so long as you re-allocate other budgeted money to make up the difference.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Live on Last Month’s Income&lt;/strong&gt; - The money you earn this month should go towards next month’s expenses.  This way, you automatically start each month with all of the dollars you already need.  Now, instead of watching your checking account get dangerously close to $0 each month, you have some built in buffer to finish strong.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;YNAB has helped me get a better handle on my monthly finances - which has been a great help since our daughter was born.  I know exactly where every dollar I spend is going.  I can easily check how much I have left in a given budget category, and I can move things around during the more hectic months.&lt;/p&gt;

&lt;p&gt;Interested in checking out YNAB?  You can get a free 34 day trial and 10% off with &lt;a href=&quot;http://ynab.refr.cc/N95TNLK&quot;&gt;this link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy budgeting.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Platinum Rule</title>
   <link href="http://robertgreiner.com/2014/04/the-platinum-rule/"/>
   <updated>2014-04-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/04/the-platinum-rule</id>
   <content type="html">&lt;p&gt;A few months prior to being married, my then-future-wife and I spent some quality time together looking for a new apartment.  We had already discussed the specifics about what we wanted:  a two bedroom apartment, on the top floor, equidistant from our workplaces, in a nice neighborhood.  Simple, right?&lt;/p&gt;

&lt;p&gt;The first three apartments we looked at weren’t all that great, and usually violated one of the four criteria we had defined before our search began.  Then, we found it.  A classy apartment complex which backs right up to the 18th hole of a golf course.  There was one 3rd floor apartment available with a wonderful view of the fairway, bay windows, two bedrooms, and no crime (according to our tour guide).  It was perfect!&lt;/p&gt;

&lt;p&gt;After the tour, I was ready to put down a deposit immediately on the apartment to ensure it was ours if we wanted it.  After all, it was Saturday and I couldn’t have another almost-married couple coming in and snatching it away from us.  Plus, if we found something better, we could cancel our application and just be out the deposit money.  Win-win.  I hope they have FiOS.&lt;/p&gt;

&lt;p&gt;My fiancée on the other hand, was not so easily convinced.  In her mind, we hadn’t finished looking at all of the apartments on the list she compiled a couple of nights prior.  &lt;em&gt;“What if we find something better?”&lt;/em&gt;  We hadn’t pulled the crime report for the area yet.  &lt;em&gt;“What if we live in a complex full of miscreants?”&lt;/em&gt;  Even though we found something which fitted our criteria, how was she supposed to make a decision in such a short period of time &lt;strong&gt;without having all of the facts&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;At the end of the day, we were both operating our apartment search with behaviors which came natural to us.  I have more of a &lt;a href=&quot;https://www.discprofile.com/what-is-disc/overview/dominance/&quot;&gt;driving&lt;/a&gt; personality.  I like setting and achieving goals, juggling more than I can typically handle, making decisions quickly, competing over everything, and moving at a faster than normal pace - regardless of how the others around me feel.  I’m the type that is prone to take big risks and fail spectacularly.&lt;/p&gt;

&lt;p&gt;My wife, on the other hand, is &lt;a href=&quot;https://www.discprofile.com/what-is-disc/overview/conscientiousness/&quot;&gt;conscientious&lt;/a&gt; by nature.  She is much more methodical and deliberate and doesn’t mind working at a slower pace.  She &lt;strong&gt;values quality and accuracy&lt;/strong&gt;.  She doesn’t like making decisions until all of the facts are present - and would probably prefer to have someone else decide, and simply point out flaws in &lt;em&gt;their&lt;/em&gt; plan.  My wife is the type who will keep people like me from going off the rails.&lt;/p&gt;

&lt;p&gt;We’ve all heard the &lt;em&gt;Golden Rule&lt;/em&gt;, in some variation, at some point in our lives: &lt;em&gt;“Do unto others what you would have them do unto you”&lt;/em&gt;.  By this point in the story, it’s clear this strategy would have been the &lt;strong&gt;wrong&lt;/strong&gt; move.  If I behaved according to my preferences, I would have strong-armed my fiancé into doing what &lt;em&gt;I&lt;/em&gt; wanted to do with little regard to her thoughts or feelings - remember,  I want someone to be direct with me and make decisions quickly.  If I went down this path, we would have likely started the rest of our lives together on the wrong foot - and in an apartment that she hated.  Luckily, I was fortunate enough to take a step back and explain my reasoning on how putting a deposit down would actually give us more options and that nothing was set in stone.&lt;/p&gt;

&lt;p&gt;What I practiced here, although I didn’t know it at the time, is what &lt;a href=&quot;http://www.alessandra.com/products/productdetails.asp?productid=11&quot;&gt;Dr. Tony Alessandra&lt;/a&gt; calls the &lt;strong&gt;Platinum Rule&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Do unto others as &lt;strong&gt;they&lt;/strong&gt; want done unto them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whether we are apartment hunting with our significant other, working with a peer on a budget, or communicating status to our boss, we are much better served if we stop to think about &lt;em&gt;their communication preferences&lt;/em&gt; and adjust ours accordingly.  Accomplishments in all areas of life are predicated on our &lt;em&gt;relationships&lt;/em&gt;.  There is very little we can accomplish on our own, regardless of how smart we are.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;http://www.alessandra.com/products/productdetails.asp?productid=11&quot;&gt;&lt;em&gt;People Smart&lt;/em&gt;&lt;/a&gt; Dr. Alessandra covers the four behavioral types into which all humans fit - based on decades of research.  Dominance, Influence, Steadiness, and Conscientiousness.  You will find out which &lt;em&gt;quadrant&lt;/em&gt; (or, in the case of my wife &lt;em&gt;quadrants&lt;/em&gt;) you fit into and learn how to effectively interact with others, regardless of your individual preferences.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Dominance&lt;/strong&gt; - Assertive, task-focused.  Interested in accomplishing goals and taking charge.  Not afraid to make decisions.  Can be viewed as &lt;em&gt;pushy&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Influence&lt;/strong&gt; - Assertive, people-focused.  “Salesey”.  Optimistic and likes to collaborate.  Accomplishes things through others.  Can be viewed as &lt;em&gt;disingenuous&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Steadiness&lt;/strong&gt; - Passive, people-focused.  Cooperative and dependable.  Focuses on the feelings of others, low drama, humble, stable.  Can be viewed as &lt;em&gt;indecisive&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Conscientiousness&lt;/strong&gt; - Passive, task-focused.  Expert. Emphasizes correctness and quality.  Works at a slower pace than the more dominant type.  Introverted.  Can be viewed as &lt;em&gt;apathetic&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/DiSC.png&quot; alt=&quot;DiSC Behavioral Graph&quot; title=&quot;DiSC&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Understanding your behavioral tendencies and how you react in various situations will go a long way to ensure you remain effective in your relationships, even when you have to work with people who are your behavioral opposite.  I spent a large portion of my career dealing with interpersonal issues the wrong way, focusing on &lt;em&gt;what I wanted&lt;/em&gt; instead of how I could adapt my style to be more accommodating to those around me.&lt;/p&gt;

&lt;p&gt;Positive relationships are built out of practice and hard work.  This is a skill which can be learned and improved upon.  A little bit of personal investment now will pay you large dividends in the future.  &lt;em&gt;People Smart&lt;/em&gt; and DiSC are two great resources to get you started.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Cloud Price Wars</title>
   <link href="http://robertgreiner.com/2014/04/cloud-price-wars/"/>
   <updated>2014-04-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/04/cloud-price-wars</id>
   <content type="html">&lt;p&gt;A few weeks ago, during &lt;a href=&quot;https://cloud.google.com/events/google-cloud-platform-live/&quot;&gt;Google Cloud Platform Live&lt;/a&gt;,  Google introduced a re-branded suite of cloud services at reduced prices - re-entering the cloud space as a major player.  This was the first domino that ushered in an industry-wide reduction in cloud computing costs.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We think cloud pricing should track Moore’s Law, so we’re simplifying and reducing prices for our various on-demand, pay-as-you-go services by 30-85% - Google Cloud Platform Blog&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Shortly after Google Cloud Platform Live, Amazon Web Services announced a &lt;a href=&quot;http://aws.typepad.com/aws/2014/03/aws-price-reduction-42-ec2-s3-rds-elasticache-and-elastic-mapreduce.html&quot;&gt;significant reduction in pricing&lt;/a&gt; as well.  EC2 prices dropped by close to 30% across the board and S3 storage costs were cut as deep as 65%. The graph below is part of a &lt;a href=&quot;http://escience.washington.edu/blog/cloud-economics-visualizing-aws-prices-over-time&quot;&gt;2010 AWS blog post&lt;/a&gt; outlining the decrease in cloud computing costs over time.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/aws-prices-over-time.png&quot; alt=&quot;EC2 prices are shrinking over time&quot; title=&quot;EC2 price graph&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;AWS will even assign a &lt;a href=&quot;https://aws.amazon.com/premiumsupport/trustedadvisor/&quot;&gt;Trusted Advisor&lt;/a&gt; to your account to go over your entire solution and recommend ways to re-provision AWS services to &lt;strong&gt;save you even more money&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you’ve been reading this blog for an extended period of time you know that we reduce prices on our services from time to time, and today’s announcement serves as the 42nd price reduction since 2008. - AWS Blog&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally, Azure entered the price slashing fray and &lt;a href=&quot;http://blogs.msdn.com/b/windowsazure/archive/2014/03/31/microsoft-azure-innovation-quality-and-price.aspx&quot;&gt;announced their own reductions&lt;/a&gt; (and a shiny new management portal) in response to AWS - something Microsoft explicitly cites as a primary driver for the newest round of discounts.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Consistent with our previously announced commitment to match Amazon on prices for commodity services, we are cutting prices on compute by up to 35% and storage by up to 65%. We recognize that economics are a primary driver for some customers adopting cloud, and stand by our commitment to match prices and be best-in-class on price performance. - MSDN Blog&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’ve never seen a service offering before, in any industry, that not only slashes prices regularly, but automatically updates your account to reflect the cheapest possible pricing &lt;strong&gt;without you asking them&lt;/strong&gt;.  I wish my U-verse service worked the same way.&lt;/p&gt;

&lt;p&gt;Cloud  pricing is in a constant move &lt;strong&gt;downward&lt;/strong&gt; resulting in an ever-increasing incentive to move to the cloud.  It is becoming harder and harder to justify purchasing new servers, real-estate, and security just to add additional computing power to a data center - not to mention waiting weeks or months for the hardware to arrive.  Companies entrenched in an &lt;em&gt;on-premises&lt;/em&gt; way of thinking are going to find themselves at a disadvantage as the cloud continues to evolve.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>LinkedIn + Your Network = New Job</title>
   <link href="http://robertgreiner.com/2014/04/use-linkedin-and-your-network-to-find-your-next-job/"/>
   <updated>2014-04-09T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/04/use-linkedin-and-your-network-to-find-your-next-job</id>
   <content type="html">&lt;p&gt;I was helping a close friend look for a new job the other day and came across a pretty interesting LinkedIn feature that matches a job posting with people in your network.  LinkedIn will even show you second-degree connections - &lt;em&gt;people connected to people you are connected with&lt;/em&gt; - that already work at the company you are researching, further improving your chances of landing an awesome job.&lt;/p&gt;

&lt;p&gt;I’m going to outline the step-by-step process I used to ultimately match my friend with a position.  And, to make things a bit more challenging, I will search for a job outside of my current field (software development).  Let’s go with &lt;strong&gt;Marketing Analyst&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;using-your-network-to-find-a-new-job-on-linkedin-in-7-easy-steps&quot;&gt;Using your network to find a new job on LinkedIn in 7 easy steps&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Go to &lt;a href=&quot;http://linkedin.com&quot;&gt;linkedin.com&lt;/a&gt; and select &lt;strong&gt;Jobs&lt;/strong&gt; from the dropdown list next to the search box.&lt;/li&gt;
  &lt;li&gt;Search for anything that closely resembles the job you want.  LinkedIn will do its best to bring in all of the jobs you might be interested in, even if they aren’t an exact word-match.
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/linkedin-job-search-step1.png&quot; alt=&quot;Search for your next job on LinkedIn&quot; title=&quot;LinkedIn job search&quot; class=&quot;center&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Scan the list of jobs and pick one out that looks interesting.&lt;/li&gt;
  &lt;li&gt;View the people in your network that already have jobs where you are looking.&lt;/li&gt;
  &lt;li&gt;Click “View” to learn more about the position.
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/linkedin-job-search-step2.png&quot; alt=&quot;Use your network to land that new job&quot; title=&quot;LinkedIn job search&quot; class=&quot;center&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;If you’re a good fit, &lt;strong&gt;apply&lt;/strong&gt;!&lt;/li&gt;
  &lt;li&gt;Reach out to your network to get an inside track.  Here’s a sample message that I would type if I were looking to make a move.
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2014/linkedin-job-search-step3-full.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/linkedin-job-search-step3.png&quot; alt=&quot;Get an introduction&quot; title=&quot;LinkedIn job search&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I hope this helps you in your quest to find your next job.  While you are hanging out on LinkedIn, feel free to &lt;a href=&quot;https://www.linkedin.com/in/robertgreiner&quot;&gt;connect with me&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Deadlines</title>
   <link href="http://robertgreiner.com/2014/04/deadlines/"/>
   <updated>2014-04-07T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/04/deadlines</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Work expands so as to fill the time available for its completion - Parkinson’s Law&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I remember watching an episode of The Simpsons years ago, where the high-IQ types took over Springfield. One of the first orders of business was to remove the green light from all traffic signals. The thinking here was that, everyone would get to their destination faster since drivers tend to speed through yellow lights to avoid stopping and waiting.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/yellow-light.png&quot; alt=&quot;The Simpsons: No green lights make everyone drive faster.&quot; title=&quot;The Simpsons: Yellow Lights Only&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We engage in similar behaviors in the workplace. &lt;em&gt;“I have all week to get that report done”&lt;/em&gt;. &lt;em&gt;“The system doesn’t go live until Monday, I’ll do all of my testing over the weekend”&lt;/em&gt;.  &lt;em&gt;“Sorry, can’t chat, there’s a code freeze at 5pm and I still have to wrap-up this feature”&lt;/em&gt;. We tend to operate our lives in a &lt;strong&gt;green light&lt;/strong&gt; mode, where everything is fine and we have all the time we could ever need to accomplish a task. Until we don’t, then the panic starts.&lt;/p&gt;

&lt;p&gt;In every area of our lives, &lt;strong&gt;deadlines drive behavior&lt;/strong&gt;. When we have something due soon, our minds become focused on the task at hand.  There is just enough &lt;strong&gt;tension&lt;/strong&gt; created to cause us to act. This can be used to our advantage by creating a series of smart, well thought out, deadlines to help guide desired behavior over the entire life of a project - instead of a single monolithic deadline looming at the end.&lt;/p&gt;

&lt;p&gt;When running a team, set short and reasonable deadlines that lead everyone to a bigger goal. Make cutoff dates clear where no additional updates can be made to the system after a specified point-in-time. Give your testers, and users, and other stakeholders, deadlines to complete their tasks - and be sure to leave some wiggle room for the guy in the back who doesn’t look at &lt;em&gt;anything&lt;/em&gt; until two days before the end of a release.&lt;/p&gt;

&lt;p&gt;Leveraging deadlines in a way that creates productive tension will help teams function effectively, and with more discipline. Frequent deadlines also set better, more realistic, expectations for business stakeholders and you can more easily tell if your project is going off track. I think Professor Frink was onto something here.&lt;/p&gt;

&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/QR10t-B9nYY&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Grit</title>
   <link href="http://robertgreiner.com/2014/04/grit-is-the-key-to-success/"/>
   <updated>2014-04-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/04/grit-is-the-key-to-success</id>
   <content type="html">&lt;p&gt;Every summer before going off to college, I worked with my dad at his &lt;a href=&quot;http://en.wikipedia.org/wiki/Powder_coating&quot;&gt;Powder Coating&lt;/a&gt; business.  For those who aren’t familiar with the trade, a typical day involved carrying metal furniture, car parts, and other widgets on hooks, into and out of a 450-degree oven the size of a standard suburban bedroom.  Most days the sweat on the tips of my ears would start to burn and evaporate every time I made a trip to grab a new chaise lounge or mailbox from the middle of the oven.  I still have a few scars from a careless moment, here and there, where my skin came in contact with a freshly baked piece of metal.&lt;/p&gt;

&lt;p&gt;As you might expect, I didn’t like this job.  It was hard work and I didn’t get paid much.  I had to get up early each morning during my &lt;em&gt;vacation&lt;/em&gt; and slave away, while some of my friends from the neighborhood were sleeping in and swimming all day.&lt;/p&gt;

&lt;p&gt;Looking back, however, I have grown to appreciate the life-lessons imposed upon me during my short and awkward tenure as a blue-collar child laborer.  Not only did I get first-hand experience with what it takes to run a successful small business, but I also developed a solid &lt;em&gt;work ethic&lt;/em&gt;.  My dad taught me &lt;strong&gt;grit&lt;/strong&gt; through blood, sweat, tears, and the occasional burn.&lt;/p&gt;

&lt;p&gt;As it turns out, more and more, &lt;strong&gt;grit&lt;/strong&gt; is being identified as an &lt;a href=&quot;http://www.forbes.com/sites/richkarlgaard/2013/11/27/smarts-in-business-is-not-about-iq/&quot;&gt;&lt;em&gt;essential skill in business&lt;/em&gt;&lt;/a&gt; as the Thought Worker continues to replace the Factory Worker.  Grit is the ultimate replacement and augment to raw intelligence, or IQ.  More and more people are worried about &lt;em&gt;what you have accomplished over the past one, three, or five years&lt;/em&gt; and not where you went to school or your GPA.  &lt;strong&gt;Accomplishment is the new pedigree&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;For example, salespeople who make more calls will almost always outperform salespeople who make fewer calls. That’s no surprise, but here’s the key point: This doesn’t happen just because the act of making more calls mathematically raises the chances of success. There’s much more to it. By facing up to the task of making a call, frequent callers put themselves on a faster learning curve. They discover more rapidly what works and what doesn’t. They’re quicker to learn techniques that overcome rejection. Thus, their success yield will improve–i.e., double the calls, triple the sales. The act of making lots of calls also helps a person learn self-discipline and understand the rewards of delayed gratification. - &lt;a href=&quot;http://www.forbes.com/sites/richkarlgaard/2013/11/27/smarts-in-business-is-not-about-iq/&quot;&gt;Forbes&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Looking back on my career, I can point to some key situations where I’ve had to &lt;em&gt;outwork&lt;/em&gt; a particular problem.  Sometimes, this involved simply sticking through a tough situation until it could be resolved.  Others were more tactical, where I was up against a challenging issue that required some extra effort to solve.  These are moments in life where I couldn’t rely on my IQ or someone else to come bail me out - it was up to me to get through it.  I think that all of the long hours at my dad’s shop helped prepare me for situations like this, and I’m better off for it.  I wish I had the foresight to understand this 15 years ago.&lt;/p&gt;

&lt;p&gt;Grit plays a significant factor in your ability to succeed from your first year of school until the day you retire - and probably after that as well.  Fortunately, it is something that is &lt;em&gt;developed&lt;/em&gt;, you don’t have to be one of the “lucky few” who are born with the gift of grit.  Unfortunately, the only way to get more of it is to work harder - there are no shortcuts.  Work hard at something, get better at it, work even harder, get even better.&lt;/p&gt;

&lt;p&gt;Interested in learning more?  &lt;a href=&quot;http://www.ted.com/talks/angela_lee_duckworth_the_key_to_success_grit&quot;&gt;Here’s a great TED talk by Angela Lee Duckworth&lt;/a&gt; on the role grit plays in how we succeed.&lt;/p&gt;

&lt;iframe src=&quot;http://embed.ted.com/talks/angela_lee_duckworth_the_key_to_success_grit.html&quot; width=&quot;640&quot; height=&quot;360&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Google Says: "Managers Are Important"</title>
   <link href="http://robertgreiner.com/2014/03/google-says-managers-are-important/"/>
   <updated>2014-03-27T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/03/google-says-managers-are-important</id>
   <content type="html">&lt;p&gt;In 2002 - four years after inception - Google decided to perform an experiment.  Restructure the company to be completely flat - No managers!  Theoretically, this change would allow engineers to have complete freedom when developing applications, which in turn, would lead to greater innovation.  While this idea may make sense to some, the experiment only lasted a few short months before being shut down.&lt;/p&gt;

&lt;p&gt;The reason we don’t see a completely-flat Google today is twofold.  Firstly, managers (and other means of organizational structure) reduce the communication complexity that exists in all organizations - the more people or “nodes” you need to connect to, the more difficult communication becomes.  With some hierarchy, you can delegate approving vacations or expense reports, handle interpersonal conflicts, and have more people to deal with day-to-day issues and questions.  As the flatness of the organization approaches zero, the CEO is burdened with too much administrative-trivia and therefore is unable to focus on shaping a vision for the future.&lt;/p&gt;

&lt;p&gt;Secondly, and perhaps just as important, managers have the greatest influence on their direct reports in comparison to anyone else in the company.  This means that your manager has the power to make your life either awesome or miserable.  Great managers stretch their team and help them grow individually and as a group.  Poor managers introduce stress and dysfunction into the professional lives of their direct reports which, more often than not, carries over into their personal lives.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Engineers hate being micromanaged on the technical side,” he
observes, “but they love being closely managed on the career side. - Eric Clayberg (Googler - HBR December 2013)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;According to Google, a good manager:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Is a good coach&lt;/li&gt;
  &lt;li&gt;Empowers the team and does not micromanage&lt;/li&gt;
  &lt;li&gt;Expresses interest and concern for team members’ success and personal well-being&lt;/li&gt;
  &lt;li&gt;Is productive and results-oriented&lt;/li&gt;
  &lt;li&gt;Is a good communicator - listens and shares information&lt;/li&gt;
  &lt;li&gt;Helps with career development&lt;/li&gt;
  &lt;li&gt;Has a clear vision and strategy for the team&lt;/li&gt;
  &lt;li&gt;Has key technical skills that help him or her advise the team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, if you are like me, your initial reaction to this list was “yeah, that makes sense”.  And, while the advice above seems obvious, it carries with it the &lt;em&gt;exact same&lt;/em&gt; rigor and analysis Google puts into every one of their projects.  This means, you now have a concrete set of criteria to judge yourself against and improve upon.  No more guessing about what behaviors are important, the groundwork has already been done for you.&lt;/p&gt;

&lt;p&gt;One of the findings I found most interesting was that &lt;strong&gt;lowest scoring managers improved the most&lt;/strong&gt;.  This is both powerful and encouraging since making a few small adjustments to your management style can significantly improve your skills as a manager, as well as how much your team values you.  You don’t have to change &lt;em&gt;who you are&lt;/em&gt; you only need to focus on &lt;em&gt;what you do&lt;/em&gt; to be successful.&lt;/p&gt;

&lt;p&gt;Managing people is a big deal.  You play a significant role in the success and job satisfaction of your direct reports.  They rely on you to act fairly and help them get better every year.  Google’s research into the topic of &lt;em&gt;what makes a good manager&lt;/em&gt; gives us an actionable framework to assess and improve our skills to ensure our team is happy and we are getting their very best.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href=&quot;http://hbr.org/2013/12/how-google-sold-its-engineers-on-management/ar/1&quot;&gt;How Google Sold Its Engineers on Management - Harvard Business Review - December 2013&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Presentation: An Introduction to Amazon Web Services</title>
   <link href="http://robertgreiner.com/2014/03/introduction-to-amazon-web-services-presentation/"/>
   <updated>2014-03-21T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/03/introduction-to-amazon-web-services-presentation</id>
   <content type="html">&lt;p&gt;In a few short years, cloud computing has gone from being viewed as a &lt;em&gt;luxury&lt;/em&gt; or &lt;em&gt;fancy toy&lt;/em&gt; and emerged as an integral part of the near-term future of companies in every industry.  Enterprises are no longer asking “why cloud?” but rather “how do I get started with a cloud solution?”&lt;/p&gt;

&lt;p&gt;Architecting a cloud solution is vastly different from a typical on-premises application, and it is important to understand the full range of tools and configuration options at your disposal in order to maximize value for your client or company.&lt;/p&gt;

&lt;p&gt;In this presentation, we gave a brief overview of cloud computing and spent some time going into the details of the robust set of offerings that AWS provides their customers.&lt;/p&gt;

&lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/32577923&quot; width=&quot;476&quot; height=&quot;400&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Begin With the End in Mind</title>
   <link href="http://robertgreiner.com/2014/03/begin-with-the-end-in-mind/"/>
   <updated>2014-03-19T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/03/begin-with-the-end-in-mind</id>
   <content type="html">&lt;p&gt;I remember writing a code generator early on in my career to accomplish a very boring programming assignment.  When finished, I was very proud of what I had created. I toiled away several late nights making sure that I accounted for a wide range of potential changes and edge cases.  I took the time to build in an extensible framework and even refactored to a widely used design pattern.  When I was finished, I ran it once to generate the code I needed - and never used it again.&lt;/p&gt;

&lt;p&gt;I spent so much time prematurely optimizing my workload that I never slowed down enough to think about the implications of spending days of hard work, effort, and budget on a throwaway application.  I never stopped - even for a minute - to consider the potential lifespan of what I was building.  I think this is a common problem we face far more often than we should.&lt;/p&gt;

&lt;p&gt;We approach software design with one of two absolute mindsets. First, we imagine a quick-and-dirty throwaway application, or script that is meant to run once, or twice, or a dozen times, and that’s it - delete it before you go home for the evening. On the complete other end of the spectrum, we simply jump right into analysis, planning, or development, and assume that our software will, sort of, &lt;em&gt;live on forever&lt;/em&gt;. There is no middle ground.&lt;/p&gt;

&lt;p&gt;Everything else that humans build, besides software, is designed with a deliberate and predefined lifespan. Cars, airplanes, video game consoles, microwaves, televisions, etc., all have a shelf life, and, most of the time, the manufacturer has already started working on the next version before the initial product has been fully released.&lt;/p&gt;

&lt;p&gt;Whether we want to think about it or not, all software has a finite lifespan. Taking the time to understand how long your application &lt;em&gt;needs&lt;/em&gt; to live can have a profound impact on design trade-offs you make:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Is this something that will become obsolete in 12 months?&lt;/li&gt;
  &lt;li&gt;Are there external factors that could force a significant change in core functionality?&lt;/li&gt;
  &lt;li&gt;Will it need to perform a small set of tasks reliably over the next decade?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re anything like me, you have been operating your entire career without ever asking how long your new application will need to exist before being replaced - not to mention coming up with a plan on how to replace it.  Next time you find yourself designing a new project, &lt;strong&gt;begin with the end in mind&lt;/strong&gt;. Deliberately think about the optimal lifespan of your application and plan accordingly, you’ll be better off for it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Windows Azure IaaS vs. PaaS vs. SaaS</title>
   <link href="http://robertgreiner.com/2014/03/windows-azure-iaas-paas-saas-overview/"/>
   <updated>2014-03-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/03/windows-azure-iaas-paas-saas-overview</id>
   <content type="html">&lt;p&gt;I know a lot of people who talk about getting started with Azure but don’t know where to begin.  They think that Azure “is just Virtual Machines sitting in a data center somewhere”.  But, as you’ll see, Azure has so much more to offer, regardless of your project needs.&lt;/p&gt;

&lt;p&gt;Windows Azure’s compute offerings fall into three main categories: Infrastructure as a Service (IaaS), Platform as a Service (PaaS), and Software as a Service (SaaS).  Let’s take a side-by-side look at each offering compared to the traditional On Premises model.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/AzureServicesOverview.png&quot; alt=&quot;An Overview of Azure Services vs. On Premises&quot; title=&quot;Azure Services Overview&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;infrastructure-as-a-service---azure-virtual-machines&quot;&gt;Infrastructure as a Service - Azure Virtual Machines&lt;/h3&gt;

&lt;p&gt;I will start with IaaS since it is what people are most familiar with.  In short, IaaS gives you a &lt;em&gt;server in the cloud&lt;/em&gt; (virtual machine) that you have complete control over.  With an Azure VM, you are responsible for managing everything from the Operating System on up to the application you are running.&lt;/p&gt;

&lt;p&gt;This mode of operation will feel most like a typical on premises virtual machine where you remote desktop into the server to manage it instead of sitting down in front of a physical keyboard and mouse.&lt;/p&gt;

&lt;p&gt;If you need a solution that requires custom third party software or multiple applications running on a single machine, then IaaS might be for you.  You can learn more about Azure IaaS &lt;a href=&quot;https://www.windowsazure.com/en-us/documentation/articles/virtual-machines-windows-tutorial/#custommachine&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;platform-as-a-service---azure-cloud-services&quot;&gt;Platform as a Service - Azure Cloud Services&lt;/h3&gt;

&lt;p&gt;An Azure Cloud Service consists of two components: your application files (source code, DLLs, etc.) and a configuration file.  Together, these two elements will spin up a combination of &lt;strong&gt;Web Roles&lt;/strong&gt; and &lt;strong&gt;Worker Roles&lt;/strong&gt; to execute your application.  With Cloud Services, Azure handles all of the tedious Operating System details for you, so you can focus on what matters - building a quality application for your users.&lt;/p&gt;

&lt;p&gt;A &lt;em&gt;Web Role&lt;/em&gt; is an Azure VM that is pre-configured as a web server (running IIS) and will automatically have your application loaded on it by the time the server fully spins up.  This will create the public endpoint for your application - usually a website, but it could also be an API or something similar.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Worker Roles&lt;/em&gt; run alongside your Web Roles and are responsible for performing computing functions to support your application.  Typically, the Web Role will accept some sort of user input and queue up an action for the Worker Role to process at a later time.  This allows the Web Roles to be more responsive and to &lt;em&gt;fire-and-forget&lt;/em&gt; tasks to be processed later.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/AzureArchitecture.png&quot; alt=&quot;A sample Azure architecture for a Cloud Services solution&quot; title=&quot;Azure Cloud Services Architecture&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can pre-configure the number of Web and Worker Roles you want to start your application with and &lt;a href=&quot;http://www.windowsazure.com/en-us/documentation/articles/cloud-services-how-to-scale/&quot;&gt;Autoscale&lt;/a&gt; to add or remove additional resources depending on demand.&lt;/p&gt;

&lt;p&gt;You can get started with Cloud Services &lt;a href=&quot;https://www.windowsazure.com/en-us/documentation/articles/cloud-services-how-to-create-deploy/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;platform-as-a-service-light---azure-websites&quot;&gt;Platform as a Service (Light) - Azure Websites&lt;/h3&gt;

&lt;p&gt;Azure Websites are, by far, the easiest, cheapest, and fastest method of getting your application to the cloud.  Websites give you the least amount of configuration control over your application, which is perfect for simple web applications that do not require more complex configurations for scaling and data processing.&lt;/p&gt;

&lt;p&gt;Deploying your application to an Azure Website is mind-numbingly easy.  You can use your favorite IDE or configure source control (Git, GitHub, Bitbucket, CodePlex, TFS, and DropBox) to push to your website and let Azure take care of the rest for you.  Continuous Integration, built in, right out-of-the-box.&lt;/p&gt;

&lt;p&gt;You can even include a MySQL or SQL Server database when provisioning an Azure Website through the Azure Management Portal.  Once your Website has been configured, simply update your Web.config (or similar) with your new database’s credentials, and you are good to go!&lt;/p&gt;

&lt;h3 id=&quot;software-as-a-service---basecamp-salesforce-office-365-azure-websites&quot;&gt;Software as a Service - Basecamp, Salesforce, Office 365, Azure Websites&lt;/h3&gt;

&lt;p&gt;Finally, Software as a Service applications are built and hosted through 3rd party vendors who typically charge for a certain level of service - $30/month for X projects and Y users.&lt;/p&gt;

&lt;p&gt;Azure Websites can serve as a SaaS offering as well.  You can configure a Wordpress, Drupal, OpenX, or even phpBB site with a single click.  No code, no deployment hassles, and minimal configuration.  Azure Websites lets you stand up the service you need in minutes, not hours or days.&lt;/p&gt;

&lt;p&gt;Most SaaS applications today are built on a cloud platform due to the low cost of entry - with prices continually falling - and the ability to scale up as your customer base grows.  If Dropcam, SmugMug, or Netflix got one million new customers tomorrow, their infrastructure (Amazon Web Services) would be able to accommodate them.&lt;/p&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;While each Azure Compute offering has their pros and cons, I personally prefer to build my projects around PaaS - Cloud Services.  With PaaS, you get the maximum possible amount of flexibility before you have to start worrying about the tedious world of OS maintenance, versions, security, patches, etc.&lt;/p&gt;

&lt;p&gt;Regardless of your application’s demands, Azure’s robust range of Compute options will allow you to custom tailor a solution that fits your needs perfectly.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;Image source:  &lt;a href=&quot;http://blogs.technet.com/b/kevinremde/archive/2011/04/03/saas-paas-and-iaas-oh-my-quot-cloudy-april-quot-part-3.aspx&quot;&gt;Technet&lt;/a&gt;.&lt;/sup&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wait</title>
   <link href="http://robertgreiner.com/2014/02/wait/"/>
   <updated>2014-02-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/02/wait</id>
   <content type="html">&lt;p&gt;I remember the first extended vacation I tried to take as a team lead.  Things did not go well.  I wasn’t even a full day into my relaxation time before the phone started ringing - production issues.  I was so frustrated that &lt;em&gt;someone else&lt;/em&gt; couldn’t figure out the problem.  This was my fault.  I spent too much energy solving every little issue that came up that my team didn’t have enough exposure to some  areas of the system.  So, when one of them crashed during my vacation, nobody was prepared to pick up the slack.&lt;/p&gt;

&lt;p&gt;I realized that I got into this mess because of my incessant need to fix things.  As soon as my brain recognizes a problem, it immediately goes into &lt;em&gt;solution mode&lt;/em&gt;, where I shut out the rest of the world until I have a fix in mind.  I do this in both personal and work settings - for better or worse.  Once I have a solution, I move forward towards a resolution.  The sooner I can resolve the issue, the better.&lt;/p&gt;

&lt;p&gt;This was a great &lt;em&gt;strength&lt;/em&gt; as an individual contributor.  However, as you start to transition into a more managerial position, this pinball mode of operation is rarely effective - especially when you are dealing with issues your team has encountered.  For instance, when someone on my team comes to me with a technical problem, I was very quick to either tell them the answer outright or point them in the right direction.&lt;/p&gt;

&lt;p&gt;Over time, I’ve realized that this isn’t helpful for the folks on my team, or to me.  First, &lt;em&gt;solving the problem &lt;strong&gt;for&lt;/strong&gt; my teammate&lt;/em&gt; forces me to context switch off of what I am currently working on in order to focus on a new problem.  Second, I am robbing my colleague of the opportunity to learn something new by going through the journey of solving a problem they are not familiar with.  Worse still, my actions make me even more dependent on the project’s success - which does not scale well.&lt;/p&gt;

&lt;p&gt;The solution I’ve found after years of failing in this area is to simply &lt;strong&gt;wait a little bit&lt;/strong&gt;.  Let your team come to you with issues, offer an encouraging word or two: “that sucks” or “yeah, I thought that might come up” or “Thanks for letting me know, I have faith in your ability to solve it”.  Or, simply don’t respond for a few hours and see what they come up with on their own.&lt;/p&gt;

&lt;p&gt;My intent here is to use this tactic as another arrow in my quiver of management tools.  It’s not a silver bullet that should be applied in all situations.  However, I would argue that &lt;strong&gt;waiting&lt;/strong&gt; is applicable more often than you realize.&lt;/p&gt;

&lt;p&gt;I suppose this advice is obvious to some, but I accidentally learned it.  Someone on my team asked for help on a particular problem early in the day, but I didn’t end up getting back to him until much later.  To my surprise, he already figured out the problem and was well into his next task.  I remember feeling a huge sense of relief because that was one less thing I had to do that day. Win, win.&lt;/p&gt;

&lt;p&gt;Taking a more passive approach to problem solving can be difficult - especially for those of us who are assertive by nature.  However, the short term tension will result in better results and a more effective team.  Next time you are posed with a similar situation, try waiting before getting involved and watch your team exceed your expectations.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grow Your Career With Pariveda</title>
   <link href="http://robertgreiner.com/2014/02/grow-your-career-with-pariveda/"/>
   <updated>2014-02-08T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/02/grow-your-career-with-pariveda</id>
   <content type="html">&lt;p&gt;One of my favorite things about working at &lt;a href=&quot;http://parivedasolutions.com&quot;&gt;Pariveda Solutions&lt;/a&gt; is the intense focus that is placed on growing the careers of everyone in the company - from a new hire right out of college to a seasoned Vice President.  I would argue that &lt;strong&gt;this is something we do better than anyone else&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What we do is unique and exceptional, and I’ve always wanted something I could point others to in order to get a concise overview of what we have to offer as a company.  Now, my wish has been granted.&lt;/p&gt;

&lt;p&gt;Check out this new video we released this week that shows you how Pariveda can help you get the most out of your career.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/dm9N5cHEguE&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;If you think Pariveda is a place you’d like to work at; &lt;a href=&quot;mailto: robert@robertgreiner.com&quot;&gt;email me&lt;/a&gt; and we can chat.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to Make Your Twitter Bootstrap Site Play Nice With Internet Explorer's Compatibility View</title>
   <link href="http://robertgreiner.com/2014/02/how-to-get-twitter-bootstrap-to-play-nice-with-internet-explorer-compatibility-view/"/>
   <updated>2014-02-05T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/02/how-to-get-twitter-bootstrap-to-play-nice-with-internet-explorer-compatibility-view</id>
   <content type="html">&lt;p&gt;I encountered a situation recently where I was responsible for developing a web application - using Twitter Bootstrap - that was going to be hosted next to another application that required Internet Explorer to run in Compatibility View.  Worse yet, both applications run under the same top-level domain making it impossible to configure Internet Explorer separately for both.&lt;/p&gt;

&lt;p&gt;The problem was that enabling Compatibility View on my site broke the UI, but turning Compatibility View off for the other site made it unusable.  This is a heck of a quandary.&lt;/p&gt;

&lt;p&gt;Instead of trying to find a way to work configuration magic with IE and Active Directory, I figured it would be best to make my site compatible with Internet Explorer regardless of the Compatibility View settings.&lt;/p&gt;

&lt;p&gt;The solution is quite simple.  Add the following &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tag directly below the &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag in your web application.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;http-equiv=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;X-UA-Compatible&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;IE=edge&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Bose Quiet Comfort 20i Noise Cancelling Headphones Review</title>
   <link href="http://robertgreiner.com/2014/01/bose-20i-noise-cancelling-headphones-review/"/>
   <updated>2014-01-05T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2014/01/bose-20i-noise-cancelling-headphones-review</id>
   <content type="html">&lt;p&gt;I received the &lt;a href=&quot;http://www.bose.com/controller?url=/shop_online/headphones/noise_cancelling_headphones/quietcomfort_20/index.jsp&quot;&gt;Bose Quiet Comfort 20i Noise Cancelling Headphones&lt;/a&gt; as a Christmas gift from my wife who remembered an offhanded comment about how nifty I thought they were a few months prior.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/BoseReview1.jpg&quot; alt=&quot;Bose Quiet Comfort 20i Noise Cancelling Headphones&quot; title=&quot;Bose 20i headphones&quot; class=&quot;left&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’m very picky about my headphones for a few reasons.  First, I really like the comfort of over-the-ear headphones, but I find them difficult to use at work since they seem to give off an antisocial vibe.  Plus, the top part always puts a big crease across my hair if I’m not careful.  I haven’t had much luck with in-ear headphones either.  They are significantly less comfortable and the sound quality isn’t as good as over-the-ear headphones.&lt;/p&gt;

&lt;p&gt;The Bose QC 20i headphones offer all of the sound quality you would expect from over-the-ear headphones in a lightweight in-ear form factor.  Here are few of the notable good features and shortcomings I have experienced over my short time with the 20i headphones.  Hopefully, this will help you make a decision on whether or not the QC 20i headphones are the right pair for you.&lt;/p&gt;

&lt;h2 id=&quot;the-good&quot;&gt;The Good&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Comfortable&lt;/strong&gt; - I had been using my Apple Ear Pods before switching to the QC 20i, and they worked fine for the most part, but usually ended up hurting my ears after a while.  The Bose gel ear-inserts are very comfortable and feel like they were custom built for my ears.  I can comfortably wear the 20i’s much longer than any other in-ear headphones I have ever owned.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Great sound quality&lt;/strong&gt; -  This is typical for Bose headphones and the QC 20i Noise Cancelling headphones are no exception.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Exceptional noise cancelling&lt;/strong&gt; - I was surprised how effectively the 20i headphones cancel sound.  When I am using them, I hardly notice the world around me.  Great for treadmills, bad for walking the dog outside.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Lightweight&lt;/strong&gt; - The headphones don’t &lt;em&gt;feel heavy&lt;/em&gt; in your ear and they roll up into a super-portable pouch for easy transport.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Rechargeable Battery&lt;/strong&gt; - Bose outfitted the 20i headphones with a rechargeable lithium-ion battery.  I really appreciate this since I tend to forget to turn off the headphones after I am done using them.  The headphones charge fully in around two hours and they last for close to 16 hours before needing a recharge.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-bad&quot;&gt;The Bad&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Cumbersome noise canceling brick&lt;/strong&gt; - I know it needs to be there, and it is probably placed in the best possible location.  However, it is a bit cumbersome and gets in the way from time to time.  This isn’t a deal breaker, just a minor annoyance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2014/BoseReview2.jpg&quot; alt=&quot;Bose Quiet Comfort 20i Noise Cancelling Headphones&quot; title=&quot;Bose 20i headphones - noise cancelling brick&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Slight buzz when noise canceling is activated&lt;/strong&gt; -  There is a strange audible &lt;em&gt;buzz&lt;/em&gt; or &lt;em&gt;hum&lt;/em&gt; that emits from all Bose noise canceling headphones when there is no audio playing.  I can’t hear the buzzing once the audio starts; I’m not sure if it goes away completely or if I just don’t happen to notice it.  This doesn’t annoy me at all, but I thought it was worth pointing out in case you think this could be a deal breaker.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Difficult to use as a phone headset&lt;/strong&gt; - it’s hard to judge how loud you are talking when wearing these headphones - even with noise cancelling deactivated.  It is also difficult to leave one of the earpieces out while talking since there is no good place to put it.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;The Bose QC 20i headphones are exceptional.  They offer everything you could ask for in terms of sound quality, effective noise cancelling, portability, and comfort.  The $299 price point is a bit steep, but I’m banking on the quality of the headphones and I fully expect them to serve me well for years to come.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Leader-Leader</title>
   <link href="http://robertgreiner.com/2013/12/leader-leader/"/>
   <updated>2013-12-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/12/leader-leader</id>
   <content type="html">&lt;p&gt;Traditional leadership logic (leader-follower) says that organizations need a strong leader to take command and control over an organization in order for it to succeed. This model worked exceptionally well in the past, when workers were performing tasks that are more physical in nature like construction or building widgets on an assembly line.&lt;/p&gt;

&lt;p&gt;However, over the past several decades, we’ve seen a shift from physical-labor oriented jobs to thought and connection centered work. Today’s workers are not simply motivated the same way as their parents’ parents were. This is common knowledge, yet we insist on managing this new breed of workers as if they were still working on the factory floor.&lt;/p&gt;

&lt;p&gt;A more effective approach to managing today’s thought workers is to adopt a &lt;strong&gt;leader-leader&lt;/strong&gt; model. In its simplest form, the leader-leader model forces you to push power and responsibility as low on the organizational hierarchy as possible.  This allows leaders at every level to re-focus their efforts on more meaningful tasks, while trusting those below them to figure out how to get their job done.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;http://www.amazon.com/Turn-Ship-Around-Turning-Followers-ebook/dp/B00AFPVP0Y/&quot;&gt;&lt;em&gt;Turn the Ship Around!: A True Story of Turning Followers into Leaders&lt;/em&gt;&lt;/a&gt; Captain David Marquet outlines how he implemented the leader-leader model while in charge of a nuclear submarine, the &lt;em&gt;USS Santa Fe&lt;/em&gt;. Captain Marquet outlines four primary pillars of the leader-leader model:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Control&lt;/strong&gt; - Give control, don’t take control. This is probably the hardest for most leaders since the more stressful times become, the more we try to control the situation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Competence&lt;/strong&gt; - Give your team the tools they need to be technically competent.  A technically competent team provides the foundation for trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clarity&lt;/strong&gt; - State the organization’s goals clearly, openly, and honestly.  Make sure everyone is working towards the same goals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Courage&lt;/strong&gt; - Resist the urge to fall back into the leader-follower model.  It is important to continue to trust your team to deliver, even in the face of adversity.&lt;/p&gt;

&lt;p&gt;Committing his organization to these four pillars allowed Captain Marquet to turn one of the least effective submarines in the US Navy into one of the most effective. Best of all, the &lt;em&gt;USS Santa Fe&lt;/em&gt; continues to be one of the Navy’s most effective submarines over a decade after Captain Marquet retired.&lt;/p&gt;

&lt;p&gt;The leader-leader model engages team members in a way that is more difficult (or impossible) with the leader-follower one. Employees are more engaged, and achieve a sense of meaning and purpose in their work. As a result, retention rates improve, collaboration increases, and the organization benefits from empowered workers who take the initiative instead of waiting around to be told what to do.&lt;/p&gt;

&lt;p&gt;Captain Marquet covers some of the key points in his book during his talk at the 2013 Fortune Leadership Summit.  Check it out for more insights into the leader-leader model.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/OqmdLcyES_Q&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Automated Testing for Websites using Selenium IDE</title>
   <link href="http://robertgreiner.com/2013/12/automated-testing-for-websites-using-selenium-ide/"/>
   <updated>2013-12-16T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/12/automated-testing-for-websites-using-selenium-ide</id>
   <content type="html">&lt;p&gt;Automated functional testing is one of the most valuable tools your organization can implement.  You get the benefit of having repeatable, fast running tests that do not require expensive humans to run them and are less error prone.  I’m a big fan of anything that can be done for me while I’m sleeping.&lt;/p&gt;

&lt;p&gt;Here are the slides for an upcoming talk I am giving on automating tests using &lt;a href=&quot;http://www.seleniumhq.org/projects/ide/&quot;&gt;Selenium IDE&lt;/a&gt;.  This presentation contains a brief overview of automated testing, why you should consider automation, and how to get Selenium IDE up and running.&lt;/p&gt;

&lt;p&gt;Enjoy.&lt;/p&gt;

&lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/29259956?rel=0&quot; width=&quot;512&quot; height=&quot;421&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;
&lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/robertgreiner/automated-testing-with-selenium&quot; title=&quot;Automated Testing for Websites With Selenium IDE&quot; target=&quot;_blank&quot;&gt;Automated Testing for Websites With Selenium IDE&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/robertgreiner&quot; target=&quot;_blank&quot;&gt;Robert Greiner&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;

&lt;p&gt;You can download the presentation &lt;a href=&quot;http://www.slideshare.net/robertgreiner/automated-testing-with-selenium&quot;&gt;here&lt;/a&gt; if you are interested.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>AWS AppStream Lets You Build Complex Applications For Any Device</title>
   <link href="http://robertgreiner.com/2013/11/amazon-web-services-appstream/"/>
   <updated>2013-11-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/11/amazon-web-services-appstream</id>
   <content type="html">&lt;p&gt;Building software applications over the past few decades has required developers to make a significant trade-off at the beginning of a project, even before any meaningful work has been completed.&lt;/p&gt;

&lt;p&gt;At one end of the pendulum, you focus on the best possible user experience.  This requires your users to make a heavy up-front investment in hardware - usually a high-end PC or gaming console - before they even think about purchasing your application.  The better the experience, the more you limit your audience.&lt;/p&gt;

&lt;p&gt;At the other end, you tailor your application to support the widest range of users and devices.  This strategy forces you to water down your application experience in favor of wider compatibility.  The more devices, user types, or situations you support, the more you sacrifice on user experience.&lt;/p&gt;

&lt;p&gt;There has to be a better way.  What if we could essentially get rid of the pendulum and write resource intensive applications that work on almost any device anywhere in the world?  Now you can, thanks to AWS &lt;a href=&quot;http://aws.amazon.com/appstream/&quot;&gt;AppStream&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2013/AmazonAppStream.png&quot; alt=&quot;Amazon AppStream&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With AppStream, you can push the computationally intensive pieces of your application to the Cloud for processing, and stream the results back to any device of your customer’s choice.  No more worrying about CPU or memory constraints, mobile versions, or hardware form-factors.&lt;/p&gt;

&lt;p&gt;In addition, you can make updates to your cloud-based algorithms in a single deployment location and your users will get the benefit of your changes &lt;strong&gt;instantly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AppStream is even smart enough to change the way packets are forwarded between your device and the Cloud, or dynamically adjust your experience based on the quality of your internet connection.&lt;/p&gt;

&lt;p&gt;The days of having to worry about servers, infrastructure, patches, mobile OS versions, and device specifications are rapidly coming to an end.  Now, you can build complex and immersive applications easier and faster that work on any device.&lt;/p&gt;

&lt;p&gt;Push more of your application to the Cloud and you’ll get to spend more time making your application awesome.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Cloud Helps You Focus On What Matters</title>
   <link href="http://robertgreiner.com/2013/11/the-cloud-helps-you-focus-on-what-matters/"/>
   <updated>2013-11-19T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/11/the-cloud-helps-you-focus-on-what-matters</id>
   <content type="html">&lt;p&gt;I think one of the most important questions companies should ask before starting any project is: “Will doing X  provide value to our customers or differentiate us in the marketplace?”&lt;/p&gt;

&lt;p&gt;If the answer is “no” then X shouldn’t be done.  Simple enough, right?  There are several companies that really &lt;em&gt;get&lt;/em&gt; this.  However, this is just the tip of the iceberg.&lt;/p&gt;

&lt;p&gt;A more difficult issue arises when doing X is a prerequisite for a project that actually &lt;strong&gt;will&lt;/strong&gt; differentiate you in the marketplace.  Most of the time this involves procuring a server, installing it in your data-center, and hiring people to manage it.  All of this work requires vast amounts of time, energy, and resources from the smart people in your company &lt;strong&gt;without providing any real business value&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The solution to this problem is simple: &lt;strong&gt;let someone else handle the details for you&lt;/strong&gt;.  Why deal with all of the issues that come with owning your own data center when there are &lt;a href=&quot;http://aws.amazon.com&quot;&gt;several&lt;/a&gt; &lt;a href=&quot;http://windowsazure.com&quot;&gt;cloud providers&lt;/a&gt; &lt;a href=&quot;http://www.salesforce.com/platform/overview/&quot;&gt;out there&lt;/a&gt; who can do it better, faster, cheaper, secure(r), and more reliably than you?&lt;/p&gt;

&lt;p&gt;Most businesses must create justification and obtain approval before moving a system to the cloud.  I think that’s backward.  You should have to create a business case for keeping something on-premises.  Cloud-first should be standard.&lt;/p&gt;

&lt;p&gt;Free yourself up to focus on the things that truly matter.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Cloud is Driving Innovation Faster Than Ever</title>
   <link href="http://robertgreiner.com/2013/11/the-cloud-is-driving-innovation-faster-than-ever/"/>
   <updated>2013-11-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/11/the-cloud-is-driving-innovation-faster-than-ever</id>
   <content type="html">&lt;p&gt;I’ve spent this week at the &lt;a href=&quot;http://reinvent.awsevents.com/&quot;&gt;Amazon Web Services re:Invent&lt;/a&gt; conference listening to a wide range of companies share success stories around how cloud computing has transformed their business.  Each of their stories, while unique, shares the same basic recipe:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Have an idea worth testing.&lt;/li&gt;
  &lt;li&gt;Start with a small proof-of-concept, usually a single EC2 instance, which can be set up in &lt;strong&gt;minutes&lt;/strong&gt;, not weeks.&lt;/li&gt;
  &lt;li&gt;Measure interest in proof-of-concept and server capacity.&lt;/li&gt;
  &lt;li&gt;Scale dynamically based on new demand, manually or automatically.  &lt;strong&gt;This is where most companies with a traditional datacenter model will fail due to the lack of ability to procure and implement new hardware fast enough to meet growing demand.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Keep growing, innovating, and working on things that matter, instead of worrying about infrastructure.  &lt;strong&gt;Your datacenter does not differentiate you in the marketplace.&lt;/strong&gt;  The more manpower you spend managing it, the fewer resources you have to do things that matter.&lt;/li&gt;
  &lt;li&gt;Win.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This recipe allows for a level of innovation that we haven’t seen since the early days of the Internet.  Cloud computing is offering us the ability to solve problems that were once impossible due to exceptionally high demands on computing power and storage.&lt;/p&gt;

&lt;p&gt;Whether you are a start-up looking to build the next big product or a Fortune 100 enterprise looking to capture market share, the story is the same: the cloud lets you quickly iterate on your ideas without requiring the enormous up-front investment of hardware and people to manage it.&lt;/p&gt;

&lt;p&gt;Increased innovation in cloud computing, low barriers to entry, lightning fast server provisioning, compute and storage costs that are approaching zero, and more businesses (large and small) coming on board are all combining to create a virtuous cycle that is causing an unprecedented increase in innovation across all industries.&lt;/p&gt;

&lt;p&gt;Best of all, a large portion of the innovation we are witnessing bleeds over from the virtual world to the physical world.  All sorts of companies are sprouting up that manufacture devices that aggregate multiple gigabits of information every second, compress it in real-time, and send it to a cloud provider for further processing.&lt;/p&gt;

&lt;p&gt;Cloud computing is here to stay is acting as the single largest driver of innovation that we will see in our lifetimes.  The sooner your organization gets on board, the sooner you can start reaping the infinite benefits the cloud has to offer.&lt;/p&gt;

&lt;p&gt;The future is now.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Amazon WorkSpaces: Your PC Now Lives in the Cloud</title>
   <link href="http://robertgreiner.com/2013/11/amazon-workspaces-launch/"/>
   <updated>2013-11-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/11/amazon-workspaces-launch</id>
   <content type="html">&lt;p&gt;Amazon gave us another sneak peek into the future this morning when they announced the release of &lt;a href=&quot;http://aws.amazon.com/workspaces/&quot;&gt;Amazon WorkSpaces&lt;/a&gt; during the AWS re:Invent conference keynote speech.&lt;/p&gt;

&lt;p&gt;AmazonWorkspaces is a workstation-as-a-service offering where you can provision a cloud-hosted “desktop” to use in all of your day-to-day tasks.  You can access your desktop instance form any device, which means you will be able to start a session on, say, your laptop and move to a tablet or another machine later and pick up right where you left off.&lt;/p&gt;

&lt;p&gt;The best part of Amazon WorkSpaces is that all of your data now lives in the cloud, instead of your local machine.  This will allow companies to feel better about letting devices walk out of the door each day along with their employees.&lt;/p&gt;

&lt;p&gt;I’m also intrigued about the possibility of doing my more intensive computing and development on-demand.  Instead, it would be much nicer to carry around a lightweight machine to use for typical day-to-day tasks and remote into my WorkSpaces VM when I need to do some heavy-lifting.  Not having to lug around a massive developer laptop is very appealing to me.&lt;/p&gt;

&lt;p&gt;If you’re interested in learning more, &lt;a href=&quot;http://aws.amazon.com/workspaces/limited-preview/&quot;&gt;sign up for a limited preview&lt;/a&gt;.  Hopefully, Amazon will be able to deliver an excellent remote experience to the point where you don’t even realize you are computing on a device that is thousands of miles away.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/Jc3h_pS3JUY&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Remote</title>
   <link href="http://robertgreiner.com/2013/11/remote-office-not-required-review/"/>
   <updated>2013-11-07T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/11/remote-office-not-required-review</id>
   <content type="html">&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://www.amazon.com/Remote-Office-Required-Jason-Fried-ebook/dp/B00C0ALZ0W/&quot;&gt;Remote: Office Not Required&lt;/a&gt;&lt;/em&gt; is the new guidebook on how to enable remote work at your organization and thrive in a remote working environment.  It requires a change in thinking about how work &lt;em&gt;must&lt;/em&gt; get done, and provides practical advice on how it can be successfully implemented in your company whether you are a business owner, VP, manager, or individual contributor.&lt;/p&gt;

&lt;h2 id=&quot;my-favorite-point&quot;&gt;My favorite point&lt;/h2&gt;

&lt;p&gt;Communicating asynchronously is a cornerstone of remote work.  Your team isn’t always “online” when you are, and if they are, they are probably doing something important.  Don’t interrupt them.  Instead, update the status of a project in your online collaboration tool; create a screen cast discussing a newly implemented feature; post in a team-only chat room; or even send an email.  Let them get to it on their terms.&lt;/p&gt;

&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Remote&lt;/em&gt; covers a comprehensive set of personal, technical, and managerial topics that will help guide you and your organization to successful remote work:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;The time is right for remote work&lt;/strong&gt; - Somewhere in the world there is the perfect employee for your organization.  This person is smart, motivated, personable, and can get things done, and chances are, does not live within driving distance of you.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Dealing with excuses&lt;/strong&gt;&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;“Big companies don’t do it”.&lt;/li&gt;
      &lt;li&gt;“Only the office can be secure”.&lt;/li&gt;
      &lt;li&gt;“People’s homes are full of distractions”.&lt;/li&gt;
      &lt;li&gt;“If I can’t see them, how do I know they’re working?”.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these are common objections to remote work and are no longer valid.  Learn how to respond to these criticisms and many more.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;How to collaborate remotely&lt;/strong&gt; - It is vital that team members’ daily schedules overlap to some degree in order to foster solid collaboration.  Without overlap, standard communication on a project that should have taken hours can span multiple days.  Ouch!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Beware the dragons&lt;/strong&gt; - The problem with remote workers isn’t that they are lazy or don’t work enough.  Quite the opposite - actually.  Overwork, overweight, and an overgrown beard.  There are real and unique pitfalls to working remotely, make sure you avoid them.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Hiring and keeping the best&lt;/strong&gt; - Communication. Communication. Communication.  Remote workers, more than anyone else have to be exceptional at written communication.  You don’t have the benefit of voice inflection and body language to get you through a conversation.  Writing well is mandatory for remote work success.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Managing remote workers&lt;/strong&gt; - Plan some in-person meetups and work sprints to further improve team cohesion and productivity.  Meet regularly with individual team members and make sure they aren’t being left out.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Life as a remote worker&lt;/strong&gt; - This chapter covers how to stay happy as a remote worker. How to build a routine;
use different devices for work and play; stay motivated;
and improve quality time with your family.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Conclusion and The Remote Toolbox&lt;/strong&gt; - Final thoughts and a list of utilities (most accompanied by a monthly subscription fee) that 37signals successfully uses to manage a company full of remote workers.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;where-do-i-go-from-here&quot;&gt;Where do I go from here?&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;From 2005 to 2011, remote work soared 73% to 3 million workers in the United States. -&lt;a href=&quot;http://www.globalworkplaceanalytics.com/telecommuting-statistics&quot;&gt;Global Workplace Analytics&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The time is right for remote work, and it’s already happening everywhere in almost every industry.  The new luxury in life is &lt;em&gt;time&lt;/em&gt;, and remote work gives you the best chance to create a unique and rewarding life.  Most people work their whole life to “retire and travel the world”.  With remote work, you don’t have to wait, you can travel the world without sacrificing your career in the process.&lt;/p&gt;

&lt;p&gt;Not convinced?  Remember, remote work is not “all or nothing”.  You can create your own experience from the wide range of technologies, schedule combinations, and locations that make sense for you.  Check out Jason’s recent TED talk &lt;em&gt;Why work doesn’t happen at work&lt;/em&gt; and see for yourself.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/5XD2kNopsUs&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>How to Get ASP .NET MVC 4 and Knockout.js to Play Nice Together</title>
   <link href="http://robertgreiner.com/2013/10/how-to-get-asp-mvc-4-and-knockout-js-to-play-nice-together/"/>
   <updated>2013-10-21T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/10/how-to-get-asp-mvc-4-and-knockout-js-to-play-nice-together</id>
   <content type="html">&lt;p&gt;I recently worked on an ASP .NET MVC 4 project that I wanted to enable &lt;a href=&quot;http://knockoutjs.com/&quot;&gt;Knockout.js&lt;/a&gt; on.  I wanted to use C# ViewModels as much as possible and move to Knockout ViewModels as late as possible.  Doing this manually would be painstakingly tedious and would result in duplicate ViewModels between C# and JS.  There had to be a better way.&lt;/p&gt;

&lt;p&gt;Luckily, &lt;a href=&quot;http://www.nuget.org/packages/Knockout.Mapping/2.2.2&quot;&gt;there’s a NuGet package for that&lt;/a&gt;.  Knockout.Mapping provides a mechanism to convert your server objects to a JSON formatted JS ViewModel.&lt;/p&gt;

&lt;p&gt;Here are the steps required to convert your C# ViewModels to Knockout ViewModels in your MVC application:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Install the &lt;a href=&quot;http://www.nuget.org/packages/Knockout.Mapping/2.2.2&quot;&gt;Knockout.Mapping&lt;/a&gt; NuGet Package - &lt;code class=&quot;highlighter-rouge&quot;&gt;PM&amp;gt; Install-Package Knockout.Mapping -Version 2.2.2&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Create your C# ViewModel and pass it to your View from your Controller (standard practice) - &lt;code class=&quot;highlighter-rouge&quot;&gt;@model MyApp.Web.Models.MyViewModel&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Serialize your C# ViewModel to JSON (see below)&lt;/li&gt;
  &lt;li&gt;Use Knockout.Mapping to automatically set up your Knockout observables (see below)&lt;/li&gt;
  &lt;li&gt;Apply bindings as normal&lt;/li&gt;
  &lt;li&gt;Profit!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;indexcshtml&quot;&gt;Index.cshtml&lt;/h3&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;@{
    var jsonData = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model));
}

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
  $(function () {
      var vm = ko.mapping.fromJSON('@Html.Raw(jsonData)');
      ko.applyBindings(vm);
  });
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you view the source behind your running MVC application, you will be able to see the JSON View Model at the top and are now free to use knockout’s &lt;code class=&quot;highlighter-rouge&quot;&gt;data-bind&lt;/code&gt; attributes on your form elements.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to Write Text to a CloudBlockBlob in Windows Azure Blob Storage</title>
   <link href="http://robertgreiner.com/2013/09/how-to-write-text-to-a-cloudblockblob-azure/"/>
   <updated>2013-09-26T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/09/how-to-write-text-to-a-cloudblockblob-azure</id>
   <content type="html">&lt;p&gt;I found myself wanting to write some text to Azure Blob Storage using the new &lt;a href=&quot;http://www.windowsazure.com/en-us/downloads/&quot;&gt;Azure SDK 2.0&lt;/a&gt;.  Things are a little different here, all of the stream methods from previous SDKs have been replaced by &lt;code class=&quot;highlighter-rouge&quot;&gt;UploadFromStream()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This makes things cleaner in the future, and is a bit easier to use.  However, your existing code might break when you upgrade to SDK 2.0.  Here’s the best way I’ve found to write text to a new file in Blob Storage.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/robertgreiner/6718704.js&quot;&gt;&lt;/script&gt;

&lt;noscript&gt;
    var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting(&quot;AzureStorageAccount&quot;));
    var blobClient = storageAccount.CreateCloudBlobClient();
    var container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExists();
    
    CloudBlockBlob blob = container.GetBlockBlobReference(fileName);
    blob.DeleteIfExists();
    
    var options = new BlobRequestOptions()
    {
      ServerTimeout = TimeSpan.FromMinutes(10)
    };
    
    using (var stream = new MemoryStream(Encoding.Default.GetBytes(text), false))
    {
      blob.UploadFromStream(stream, null, options);
    }
&lt;/noscript&gt;

&lt;p&gt;Did this help?  I’d love to hear about it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Observations From My First Career Fair</title>
   <link href="http://robertgreiner.com/2013/09/career-fair-observations/"/>
   <updated>2013-09-19T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/09/career-fair-observations</id>
   <content type="html">&lt;p&gt;I had the opportunity to take part in an engineering career fair at a major university this week.  My first.&lt;/p&gt;

&lt;p&gt;There a few things that really stuck out to me:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;There are a ton of really smart kids engineering programs these days.  I feel like they are smarter and better equipped than I was at their age.&lt;/li&gt;
  &lt;li&gt;Engineering is &lt;em&gt;still&lt;/em&gt; a great field to go into.  Companies were doing everything they could to catch the attention of the &lt;em&gt;sea of talent&lt;/em&gt; passing them by.&lt;/li&gt;
  &lt;li&gt;Most computer science students already have a job by the time they graduate.  Companies are recruiting young and trying to hold on.&lt;/li&gt;
  &lt;li&gt;Nobody had their parent with them.  According to the Wall Street Journal we should have seen &lt;a href=&quot;http://online.wsj.com/article/SB10001424127887323864604579066964214209866.html&quot;&gt;around 6%&lt;/a&gt; of students toting their parents around.  Maybe they’re waiting for the interview?&lt;/li&gt;
  &lt;li&gt;There are virtually no young women interested in computer science or hardware engineering.  We talked to very few women during the entire six-hour event.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At first, I thought this last point might be a simple coincidence  but it turns out &lt;a href=&quot;http://www.cra.org/uploads/documents/resources/taulbee/CS_Degree_and_Enrollment_Trends_2010-11.pdf&quot;&gt;less than 12% of Computer Science bachelor’s degrees were awarded to women at US PhD-granting institutions in 2010-11(PDF)&lt;/a&gt;.  Compare that with the 60% of degrees for any major going to females.&lt;/p&gt;

&lt;p&gt;Most of you reading this are probably saying “yeah, this has always been a problem”.  And, to some degree I’ve always known.  However, it really hit home for me seeing this huge discrepancy first hand.&lt;/p&gt;

&lt;p&gt;I’m not sure what the answer to this problem is, but I’m pretty certain by the time a student approaches their senior year of high school, we’re already too late.&lt;/p&gt;

&lt;p&gt;Overall, the career fair was a success.  I’m optimistic about the future of our industry.  I just hope we manufacture enough of them.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>3 Books Every Software Developer Should Have Already Read</title>
   <link href="http://robertgreiner.com/2013/09/software-developer-book-recommendations/"/>
   <updated>2013-09-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/09/software-developer-book-recommendations</id>
   <content type="html">&lt;p&gt;Here are three books I feel are required reading for all software developers regardless of age, job title, or years of experience.  The earlier you can get a hold of them, the better.  &lt;strong&gt;Spoiler Alert:&lt;/strong&gt; only one of these books specifically deals with writing code.&lt;/p&gt;

&lt;h2 id=&quot;clean-code-a-handbook-of-agile-software-craftsmanship&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/&quot;&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;If you are going to read one book on programming in your professional career, it should be this one.  &lt;em&gt;Clean Code&lt;/em&gt; is a wonderful primer on what it takes to be a &lt;strong&gt;professional programmer&lt;/strong&gt; in an industry void of the sort of rigors that are commonplace in other professions such as civil engineering, architecture, or accounting.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Clean Code&lt;/em&gt; helped shape the way I think about programming.  It changed the way I approach programming problems and run software development projects.&lt;/p&gt;

&lt;p&gt;Even through &lt;em&gt;Clean Code&lt;/em&gt; has a Java flavor to it, don’t let that deter you if you are a .NET, Python, or Ruby developer.  You will get the same level of benefit.&lt;/p&gt;

&lt;p&gt;Buy this book right now.&lt;/p&gt;

&lt;h2 id=&quot;peopleware-productive-projects-and-teams&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Peopleware-Productive-Projects-Teams-Edition/dp/0321934113&quot;&gt;Peopleware: Productive Projects and Teams&lt;/a&gt;&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;The major problems of our work are not so much technological as sociological in nature. -&lt;em&gt;Peopleware&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most software projects fail due to people issues, not technical issues as you might expect.  How frustrating.  Fortunately, there are proven methods for successfully running projects backed up with research and empirical data. Enter, &lt;em&gt;Peopleware&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Peopleware&lt;/em&gt; teaches readers how to run successful projects and teams through six main sections: Managing humans, managing the work environment, finding the right people, growing your team, building a solid culture, and how to make work fun.&lt;/p&gt;

&lt;p&gt;I experienced quite a bit of pain early on in my programming career because the idealistic model I built in my mind about what programming &lt;em&gt;should&lt;/em&gt; be &lt;strong&gt;did not match reality&lt;/strong&gt;.  I didn’t know how software development projects were run and I had trouble figuring out the role I was supposed to play in them.&lt;/p&gt;

&lt;p&gt;I own all three additions of this book and it has helped me on several occasions throughout my career.  Whether you are a manager or an individual contributor this book is helpful.  &lt;em&gt;Peopleware&lt;/em&gt; has stood the test of time, give it a chance.&lt;/p&gt;

&lt;h2 id=&quot;how-to-win-friends-and-influence-people&quot;&gt;&lt;a href=&quot;http://www.amazon.com/How-Win-Friends-Influence-People/dp/0671027034&quot;&gt;How to Win Friends and Influence People&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;How to Win Friends and Influence People&lt;/em&gt; is &lt;strong&gt;THE&lt;/strong&gt; handbook for building great relationships.&lt;/p&gt;

&lt;p&gt;The days of the &lt;em&gt;Lone Cowboy&lt;/em&gt; programmer are over.    Our workplaces are becoming more fluid and diverse by the month.  Software development is a &lt;strong&gt;team sport&lt;/strong&gt; now.  Your success relies on other people’s cooperation, collaboration, and ideas more than ever before. &lt;em&gt;How to Win Friends and Influence People&lt;/em&gt; will help you navigate these personal waters better than any other resource I know of.&lt;/p&gt;

&lt;p&gt;The advice in this short book has enabled me to get things done on a level I didn’t know was possible.  I’ve been able to avoid arguments, motivate others, call in favors that normally would go ignored, and diffuse hostile situations.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Financial success, Carnegie believed, is due 15 percent to professional knowledge and 85 percent to “the ability to express ideas, to assume leadership, and to arouse enthusiasm among people.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The number one indicator of your success in any industry is your ability to play nice with others. That makes &lt;em&gt;How to Win Friends and Influence People&lt;/em&gt; worth its weight in gold.&lt;/p&gt;

&lt;h2 id=&quot;your-turn&quot;&gt;Your Turn&lt;/h2&gt;

&lt;p&gt;This list could have easily been 10-100 books long.  There is a ton of really great information out there that will help you in your career.  At the end of the day I feel that the three books listed above give you the most bang for your buck (and time).&lt;/p&gt;

&lt;p&gt;What do you think?  Would you recommend a different book over one of the three above?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Missing Nuget Packages on TFS Build Server</title>
   <link href="http://robertgreiner.com/2013/09/team-foundation-service-build-error-nuget/"/>
   <updated>2013-09-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/09/team-foundation-service-build-error-nuget</id>
   <content type="html">&lt;p&gt;&lt;em&gt;This is a guest post from &lt;a href=&quot;http://scottndecker.com&quot;&gt;Scott Decker&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Our team recently migrated some client projects over from Team Foundation Server to Team Foundation Service (TFS).  Connecting to TFS and porting the code presented little challenge.  Once the builds were set up, we encountered the real trouble: missing dlls.  Yes, “Enable Nuget Package Restore” was selected.  Yes, nuget.exe had been added to source control.  Yes, I had checked the version of the nuget packages to see if an update had messed something up.  All to no avail.  The key lied in repeating a process we normally execute locally the first time we download a new solution from source control.&lt;/p&gt;

&lt;p&gt;When the solutions were first built locally, there were tons of errors concerning missing dlls (see below).  We had to close Visual Studio, delete the “packages” folder locally, reopen the solution, and rebuild.  Tada.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2013/NuGet_Error_1.png&quot; alt=&quot;Local Build Error&quot; title=&quot;Local Build Error&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With Nuget, you don’t have to check in the packages folder.  Nuget should be able to tell which packages it needs and download any missing ones.  This functionality, however, wasn’t working on the build server just as it wasn’t working on the local machine.  The error (below) was a little different but the root issue was the same: missing packages.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2013/NuGet_Error_2.png&quot; alt=&quot;Team Foundation Service Build Error&quot; title=&quot;Team Foundation Service Build Error&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The solution ended up being remarkably simple: repeat the steps we perform locally in source control.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In Visual Studio, open the Source Control Explorer.&lt;/li&gt;
  &lt;li&gt;Navigate to the packages folder (it should be on the same level as the projects in the solution).&lt;/li&gt;
  &lt;li&gt;Right click and select “Delete”.  A small red x should appear next to the name.&lt;/li&gt;
  &lt;li&gt;Check in the pending change (deleting the packages folder) and wait.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If all goes well, that automatic build should kick off with the new check in and build successfully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; the first build should take longer than usual as the server has to recreate the packages folder and download all packages.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to fix NuGet packages when upgrading .NET Framework</title>
   <link href="http://robertgreiner.com/2013/08/update-nuget-packages-with-net-framework/"/>
   <updated>2013-08-29T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/08/update-nuget-packages-with-net-framework</id>
   <content type="html">&lt;p&gt;If you find yourself in the middle of upgrading the .NET Framework on your project, you may have encountered some errors letting you know that the project’s associated NuGet packages need to be re-installed.&lt;/p&gt;

&lt;p&gt;Have no fear, you are almost done with your upgrade.  Long gone are the days of having to manually go through your entire project uninstalling the packages yourself. With NuGet 2.1+, this becomes trivial.&lt;/p&gt;

&lt;p&gt;In Package Manager (View -&amp;gt; Other Windows -&amp;gt; Package Manager) type:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;update-package -reinstall
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This command will uninstall all NuGet packages in your entire solution and re-install them targeting the correct .NET framework.&lt;/p&gt;

&lt;p&gt;Happy solution upgrading.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Board Games Improve Leadership and Decision Making Skills</title>
   <link href="http://robertgreiner.com/2013/08/board-games-and-leadership/"/>
   <updated>2013-08-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/08/board-games-and-leadership</id>
   <content type="html">&lt;p&gt;In Inc.’s &lt;a href=&quot;http://www.inc.com/magazine/june-2013.html&quot;&gt;June 2013 issue&lt;/a&gt; there is an interesting article about &lt;a href=&quot;http://www.inc.com/magazine/201306/leigh-buchanan/games-and-leadership.html&quot;&gt;how board games help hone leadership and decision making skills&lt;/a&gt;.  I was a bit skeptical at first, but there are some interesting points here that are worth exploring.&lt;/p&gt;

&lt;p&gt;Most board games facilitate &lt;strong&gt;human interactions&lt;/strong&gt; in a constantly changing environment with a wide range of rules and boundaries.  It is in these unique and singular situations where the limits of your thinking and creativity are tested to get the desired outcome.&lt;/p&gt;

&lt;h4 id=&quot;board-games-sharpen-focus&quot;&gt;Board games sharpen focus&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;Games force players to choose which balls to keep their eyes on. And gaming is a whetstone for sharpening strategy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In board gaming as in real life, we are resource constrained.  We only have so many hours in a day or dollars to spend on the things we need and we must figure out the optimal strategy moving forward in order to have the greatest chance of success.&lt;/p&gt;

&lt;p&gt;Most of the time, a single decision isn’t going to make a huge difference for you, but the confluence of many decisions over a period of time can have a profound impact on the way events unfold.&lt;/p&gt;

&lt;h4 id=&quot;board-games-provide-instant-feedback-on-your-decisions&quot;&gt;Board games provide instant feedback on your decisions&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;Games give players a feel for the quality of their inputs, allowing them to quickly change tactics. With games, you get feedback on whether what you just did was effective or ineffective.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Board games also provide a safe environment for players to create and test strategies, tactics, and theories and get immediate feedback on the various decisions made throughout the game.  This can be valuable practice for real-world situations by helping you understand how you make decisions and how you react to adverse situations.&lt;/p&gt;

&lt;h4 id=&quot;where-do-i-go-from-here&quot;&gt;Where do I go from here?&lt;/h4&gt;

&lt;p&gt;To get started, Inc.’s article recommends &lt;a href=&quot;http://boardgamegeek.com/boardgame/5404/amun-re&quot;&gt;Amun-re&lt;/a&gt; and &lt;a href=&quot;http://boardgamegeek.com/boardgame/5/acquire&quot;&gt;Acquire&lt;/a&gt;, both of which are out of production and would be pretty costly to get a hold of.&lt;/p&gt;

&lt;p&gt;As an alternative, I would recommend &lt;a href=&quot;http://boardgamegeek.com/boardgame/11/bohnanza&quot;&gt;Bohnanza&lt;/a&gt; a witty game of resource management and negotiation that is very approachable for casual boardgamers.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://boardgamegeek.com/boardgame/30549/pandemic&quot;&gt;Pandemic&lt;/a&gt;, another great choice, is a co-operative game where you and your team are given the daunting task of saving the world from four super-viruses.  Each player controls a character with unique abilities and must coordinate effort and resources to most effectively contribute to the prevention of world destruction.  In Pandemic, lots of little mistakes can lead to disastrous consequences for fake-earth.&lt;/p&gt;

&lt;p&gt;In the future, I am definitely going to approach board games a bit differently.  I am going to place some focus on the decisions I’m making, both short and long term, and how that effect the overall outcome of the game.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Summer Reading: The First 90 Days</title>
   <link href="http://robertgreiner.com/2013/08/summer-reading-the-first-90-days-by-michael-watkins/"/>
   <updated>2013-08-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/08/summer-reading-the-first-90-days-by-michael-watkins</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;The president of the United States gets 100 days to prove himself; you get 90. The actions you take during your first few months in a new role will largely determine whether you succeed or fail.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2013/the-first-90-days.gif&quot; alt=&quot;The First 90 Days by Michael Watkins&quot; title=&quot;The First 90 Days&quot; class=&quot;left&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The First 90 Days&lt;/em&gt; by Michael D. Watkins is a classic piece of work that serves as a primer for anyone &lt;strong&gt;transitioning&lt;/strong&gt; into a new leadership role either internally at your existing organization or externally at a new company.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The First 90 Days&lt;/em&gt; is split up into ten sections that outline the key issues you will face as a new leader and how to best manage them.  Neglecting any one of these can set you up for failure down the road:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Prepare Yourself&lt;/strong&gt; - Make a mental break from your old job.  Prepare to take charge in your new role.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Accelerate Your Learning&lt;/strong&gt; - Plan to learn.  Figure out the best sources of insight.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Match Strategy to Situation&lt;/strong&gt; - Use the STARS model to analyze different situations and lead change.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Negotiate Success&lt;/strong&gt; - Build a productive working relationship with your new boss.  Define expectations and figure out how to work together.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Secure Early Wins&lt;/strong&gt; - Avoid common traps and create a plan for early success.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Achieve Alignment&lt;/strong&gt; - Identify the root causes of poor performance.  Align strategy, structure, systems, skills, and culture.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Build Your Team&lt;/strong&gt; - Inheriting a team and changing it.  Managing short and long term goals.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Create Alliances&lt;/strong&gt; - Identify whose support is critical for your success.  Authority is not enough.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Manage Yourself&lt;/strong&gt; - Create and enforce personal disciplines.  Build advice-and-counsel networks.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Accelerate Everyone&lt;/strong&gt; - Using a framework to accelerate team development.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The STARS Model&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;To take charge successfully, you must have a clear understanding of the situation you are facing and the implications for what you need to do and how you need to do it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Understand which categories a given situation falls in will better help you manage change:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;S&lt;/strong&gt;tartup - Assembling the capabilities to get a new business, product, project, or relationship off the ground.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;T&lt;/strong&gt;urnaround - Getting an existing unit or group back on track.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;A&lt;/strong&gt;ccelerating Growth - Times are good, you must scale-up to survive.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;R&lt;/strong&gt;ealignment - Revitalize a unit, product, process, or product.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;S&lt;/strong&gt;ustaining Success - Preserve the vitality of a successful organization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Avoid the Action Imperative&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Transition failures happen because new leaders either misunderstand the essential demands of the situation or lack the skill and flexibility to adapt to them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;The First 90 Days&lt;/em&gt; outlines some interesting “Transition Traps” to avoid.  One of the most common traps new leaders fall into is succumbing to the intense feeling to take immediate action and make your stamp on the organization.  This typically results in poor decisions being made early on that can be extremely difficult to overcome.&lt;/p&gt;

&lt;p&gt;Keep this in mind as you transition into new roles in the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The one thing you should know&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your primary goal in any transition is to reach the &lt;em&gt;break-even point&lt;/em&gt; as quickly as possible.  This is the point at which you have contributed as much value to your organization as you have consumed from it.&lt;/p&gt;

&lt;p&gt;Watkins points out here that, initially, new leaders are net consumers in an organization.  When you are new you work slower, ask more questions, need help adjusting to your new environment, and are lacking the proper relationships to get things done.  This takes time to remedy, and the faster you do it, the faster you can start to make a positive difference in your organization.&lt;/p&gt;

&lt;p&gt;“How soon should I expect to reach the break-even point?” You ask.  A survey of over 200 company CEOs estimate the typical break-even time to occur at just over &lt;strong&gt;6 months&lt;/strong&gt;.  Better get to work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclustion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everyone, no matter where they are in their career can benefit from this book, especially if you are in the early stages of a transition.  I think that’s why it’s stood the test of time for so long.&lt;/p&gt;

&lt;p&gt;The higher you are in an organization, the more this book will help you.  There are some pretty high-level concepts discussed here that may not apply to your specific situation.  However, I would bet that there is &lt;em&gt;something&lt;/em&gt; in this book that will be useful to you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The First 90 Days&lt;/em&gt; is a classic that I will continue to reference throughout my career, especially in times of transition.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Summer Reading: To Sell is Human</title>
   <link href="http://robertgreiner.com/2013/07/summer-reading-to-sell-is-human-by-dan-pink/"/>
   <updated>2013-07-30T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/07/summer-reading-to-sell-is-human-by-dan-pink</id>
   <content type="html">&lt;div&gt;
&lt;blockquote&gt; Whether it's selling's traditional form or its non-sales variation, we're all in sales now.&lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2013/to-sell-is-human.png&quot; alt=&quot;To Sell is Human by Dan Pink&quot; title=&quot;To Sell is Human&quot; class=&quot;left&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I just finished reading &lt;em&gt;To Sell is Human&lt;/em&gt; by Daniel Pink as part of my summer reading list.  This was a very interesting book with some serious implications to the working lives of most of today’s workforce.  Below is a quick review of the book but the bottom line is: &lt;strong&gt;you should read it&lt;/strong&gt; sooner rather than later.&lt;/p&gt;

&lt;p&gt;According to the US Bureau of Labor Statistics one out of every nine (11%) American workers works in sales.  That’s 15,000,000 people in America alone.  In fact, we have more sales people in America than factory workers even though manufacturing is a $2,000,000,000,000 (trillion) industry.  Crazy, right?&lt;/p&gt;

&lt;p&gt;Daniel Pink’s book &lt;em&gt;To Sell is Human&lt;/em&gt; explores two key findings:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;People spend around 40% of their time at work engaged in non-sales selling.&lt;/li&gt;
  &lt;li&gt;People consider the non-sales selling aspect of their work crucial to their personal success.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What is non-sales selling?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[non-sales selling involves] persuading, influencing, and convincing others in ways that don’t involve anyone making a purchase.  Across a range of professions we are devoting roughly twenty-four minutes of every hour to moving others.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In short, non-sales selling involves &lt;em&gt;moving&lt;/em&gt; others.  This is an integral part of any job whether you are trying to get your kids to study, convince your boss to free up resources, work with another cross-functional group to accept your new idea on a project, or a myriad of other scenarios where you try to get someone else to part with their resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The new ABCs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The old ABCs of traditional sales, &lt;strong&gt;A&lt;/strong&gt;lways &lt;strong&gt;B&lt;/strong&gt;e &lt;strong&gt;C&lt;/strong&gt;losing has helped create a culture of salespeople being viewed as sub-human or unethical.  This mentality will not work in today’s corporate environment.&lt;/p&gt;

&lt;p&gt;Instead, Pink outlines the new ABCs of non-sales selling integral to your efforts to move others:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;A&lt;/strong&gt;ttunement - Bringing yourself into harmony with others. Understand their needs and how you can serve them.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;B&lt;/strong&gt;uoyancy - Learn to deal with rejection and bathe yourself in constant feedback after each encounter where you attempt to move someone else.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;C&lt;/strong&gt;larity - The ability to uncover information and challenges others didn’t know they had.  And, helping them come up with a solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The one thing you should know&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You are in sales now, whether you like it or not.  Not the cheap-suit used car salesman trying to con you into parting with your hard earned cash type.  But rather, the professional hard-working type that is living in a world where achieving results is closely tied to building relationships.&lt;/p&gt;

&lt;p&gt;Your future success is closely dependent on your ability to move others in a way that is built on trust and mutual benfit.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Read Fiction and Be a Better Leader</title>
   <link href="http://robertgreiner.com/2013/07/read-fiction-and-be-a-better-leader/"/>
   <updated>2013-07-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/07/read-fiction-and-be-a-better-leader</id>
   <content type="html">&lt;p&gt;One of my favorite things about the Harvard Business Review &lt;a href=&quot;http://blogs.hbr.org/ideacast/&quot;&gt;IdeaCast&lt;/a&gt; is the exceptionally diverse list of topics they cover each week.&lt;/p&gt;

&lt;p&gt;June 20th’s IdeaCast was titled &lt;a href=&quot;http://blogs.hbr.org/ideacast/2013/06/read-fiction-and-be-a-better-l.html&quot;&gt;&lt;em&gt;Read Fiction and Be a Better Leader&lt;/em&gt;&lt;/a&gt; which featured a discussion with Harvard Business School professor Joseph Badaracco over a course he teaches around leadership and (fiction) literature.&lt;/p&gt;

&lt;p&gt;Badaracco breaks down fiction’s unique role in training leaders at all levels due to the inherent intensity and increased perspectives that exist in fictional work.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;My view of what makes literature so valuable in the classroom is that it helps students really get inside individuals who are making decisions. It helps them see things as these people in the stories actually see them. And that’s because the inner life of the characters is imagined and described, in many cases, by brilliant writers whose sense of how people really think and how they really work have been tested by time over decades or even centuries.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I typically don’t read much fiction, but after listening to this IdeaCast I think there might be some additional value here besides entertainment.&lt;/p&gt;

&lt;p&gt;Overall, this was a good listen and I recommend it for anyone interested in improving their leadership skills.&lt;/p&gt;

&lt;p&gt;For those of you wondering how to put this into practice it’s as easy as reading a book you are interested in and asking some tough questions about how you would respond in a similar situation.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In almost every book, there’s somebody who takes initiative and who is a kind of leader. They may not be a heroic leader. It’s often a version of quiet leadership, somebody working behind the scenes. And ask some good HBS questions. Did they get these decisions right? Did they think about them in the right way? Would you have handled them differently? Why did they do what they did? Trying to get inside not just the characters as characters, but characters as members of an organization and people trying to shape it.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Succeeding and Not Failing</title>
   <link href="http://robertgreiner.com/2013/06/succeeding-and-not-failing/"/>
   <updated>2013-06-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/06/succeeding-and-not-failing</id>
   <content type="html">&lt;p&gt;If asked, I would say that I devote a great portion of my life trying to succeed at something.  However, when I try to be a little more introspective, I realize that most of the time I think I spend &lt;em&gt;trying to succeed&lt;/em&gt; I actually spend &lt;em&gt;trying not to fail&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is a subtle difference that will slowly and quietly keep you stuck at good, instead of great.  Some of the most interesting things we have achieved as humans were realized by avoiding the safe path and striving for success.&lt;/p&gt;

&lt;p&gt;In the future, I want to try and move past the &lt;em&gt;try not to fail&lt;/em&gt; mentality and focus more on what it takes to truly succeed.  I’m not sure right now what this is going to look like, but I can probably measure success in this area against how many more failures I encounter.&lt;/p&gt;

&lt;p&gt;Next time my gut tells me to hedge, I am going to take a step back and try to figure out why I’m being so conservative and what I can do to pursue success.&lt;/p&gt;

&lt;p&gt;I’m interested to see where this takes me.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Your Project Needs a Theme</title>
   <link href="http://robertgreiner.com/2013/05/your-project-needs-a-theme/"/>
   <updated>2013-05-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/05/your-project-needs-a-theme</id>
   <content type="html">&lt;p&gt;Every day, you chug away on your project (software, widgets, budgets, whatever) making incremental progress towards your final goal.  One day something happens  that you don’t expect, in the biz we call this a &lt;em&gt;production defect&lt;/em&gt;.  Because of that, you have to pull valuable resources away from getting real work done in order to triage this particular fire.  This causes deadlines to slip, budgets to overrun, and breeds frustration for your team.  Finally, you find the defect, patch it up, and move on with your life.  Problem solved. Right?  Wrong.&lt;/p&gt;

&lt;p&gt;Most of the time the specific issues we encounter end up being a  &lt;strong&gt;symptom of a larger underlying problem&lt;/strong&gt;.  Taking the time to analyze the root cause of this problem, and giving the solution adequate focus will help improve quality over the life of your project.&lt;/p&gt;

&lt;p&gt;Personally, I like to assign a specific &lt;strong&gt;theme&lt;/strong&gt; to each project milestone.  For instance, one month my team seemed to experience some pain around distributed file processing.  After fixing a few defects we realized that our core processing code was not as robust as it could be.  We really needed to improve our edge-case support around various transient conditions in order to be able to fully trust our functionality.  Because of this, we decided to make &lt;em&gt;robustness&lt;/em&gt; the theme for the next milestone.&lt;/p&gt;

&lt;p&gt;During the next several weeks we built time into the schedule for specifically addressing our &lt;em&gt;robustness&lt;/em&gt; issue.  We created new user stories, modified acceptance criteria, and updated our QA test plans to accommodate a higher standard for distributed file processing robustness.&lt;/p&gt;

&lt;p&gt;After our next project milestone was complete, our system was much better equipped to handle the byzantine nature of a real-time distributed processing system.  This allowed us to focus on a new piece of the system moving forward.&lt;/p&gt;

&lt;p&gt;Deciding on a theme can help measurably improve your system on a given axis.  Themes help hone the clarity of the team by letting them know what is important to work on and gives them &lt;strong&gt;permission to make things better&lt;/strong&gt;.  Next time your project team starts experiencing pain points in an area of your system, try a longer-term approach to addressing the issues by implementing a theme.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fixed: Access is denied Exception</title>
   <link href="http://robertgreiner.com/2013/05/wcf-azure-service-bus-access-is-denied-exception/"/>
   <updated>2013-05-03T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/05/wcf-azure-service-bus-access-is-denied-exception</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Access is denied.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Really?!  Could you be a little more explicit?&lt;/p&gt;

&lt;h4 id=&quot;the-background&quot;&gt;The Background&lt;/h4&gt;

&lt;p&gt;I ran into this error recently when trying to deploy an application at a client.  We ended up spending way too much time figuring out the root cause of this exception due to the sheer lack of details.  Worst of all, the &lt;em&gt;exact&lt;/em&gt; same code was working just fine in our QA environment.&lt;/p&gt;

&lt;p&gt;At the end of the day, it turned out that our production box did not have the custom Event Log Source that our logger was attempting to log to.  Normally, Windows is kind enough to create the Event Log Source for you, but the application we were running did not have sufficient privileges (Access is denied). After we added the source manually, everything started working again.&lt;/p&gt;

&lt;h4 id=&quot;the-stack-trace&quot;&gt;The Stack Trace&lt;/h4&gt;

&lt;p&gt;Unhandled Exception&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Unhandled Exception: &lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;* Exception&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;*
Exception Message:
Access is denied.
Stack Trace:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Server Stack Trace&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Server stack trace:
   at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc&amp;amp; rpc)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rethrown&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp;amp; msgData, Int32 type)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;the-fix&quot;&gt;The Fix&lt;/h4&gt;

&lt;p&gt;To fix this error, create the event log source on your production machine.  If your application lives in Windows Azure, you will need to perform &lt;a href=&quot;http://coding.infoconex.com/post/2012/02/09/Creating-custom-EventLog-source-in-windows-azure.aspx&quot;&gt;a few extra steps&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;C:\PS&amp;gt; New-Eventlog -source YourEventLog -logname Application
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Please let me know if this saves you any time/hassle.  I need something to make me feel better for all of the time I wasted trying to fix this issue.&lt;/p&gt;

&lt;p&gt;Happy debugging.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Windows AzureConf 2013</title>
   <link href="http://robertgreiner.com/2013/04/windows-azureconf-2013/"/>
   <updated>2013-04-22T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/04/windows-azureconf-2013</id>
   <content type="html">&lt;p&gt;The Windows Azure team is hosting &lt;a href=&quot;http://www.windowsazureconf.net/&quot;&gt;AzureConf&lt;/a&gt;, a live streaming community event tomorrow from 9:00am – 5:00pm PST.  ScottGu will be delivering the Keynote in the morning and the rest of the day will be filled with some interesting Azure discussions.  If you are interested, check out the &lt;a href=&quot;http://www.windowsazureconf.net/schedule/&quot;&gt;Schedule&lt;/a&gt; and &lt;a href=&quot;http://www.windowsazureconf.net/speakers/&quot;&gt;Speakers&lt;/a&gt; pages for more information.&lt;/p&gt;

&lt;p&gt;You can also view all of last year’s AzureConf videos for free on &lt;a href=&quot;http://channel9.msdn.com/Events/WindowsAzure/AzureConf2012&quot;&gt;Channel 9&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Trust Equation</title>
   <link href="http://robertgreiner.com/2013/04/the-trust-equation/"/>
   <updated>2013-04-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/04/the-trust-equation</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;You can make more friends in two months by becoming interested in other people than you can in two years by trying to get other people interested in you. -Dale Carnegie&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was reading &lt;a href=&quot;http://www.amazon.com/The-Trusted-Advisor-David-Maister/dp/0743212347/&quot;&gt;The Trusted Advisor&lt;/a&gt; over the weekend based on a recommendation from a friend.  This book is chock-full of excellent advice for professionals (specifically, consultants) interacting with clients.  One thing that really stuck out to me was the &lt;strong&gt;Trust Equation&lt;/strong&gt;  in Chapter 8.&lt;/p&gt;

&lt;p&gt;Simply stated, the level of trust between you (the trustee) and your client (the truster) is defined by the sum of &lt;em&gt;credibility&lt;/em&gt;, &lt;em&gt;reliability&lt;/em&gt;, and &lt;em&gt;intimacy&lt;/em&gt; divided by your &lt;em&gt;self-orientation&lt;/em&gt;.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;T = (C + R + I) / S
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I think it is important to note that &lt;em&gt;client&lt;/em&gt; does not exclusively mean &lt;em&gt;business&lt;/em&gt;.  A client can be a friend, family member, student, boss, direct report, or any other person you enter into a trust relationship with.&lt;/p&gt;

&lt;p&gt;Let’s break down each variable in the Trust Equation to gain a better understanding of what we can do to increase trust in our relationships.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Credibility&lt;/strong&gt; (Words) - Content expertise and presence (how we look, act, react, etc.)  This is the most common trust factor.  Most people get this one right.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reliability&lt;/strong&gt; (Actions) - Whether or not you are thought of as dependable and can be trusted to behave in certain ways.  Increasing reliability takes &lt;em&gt;time&lt;/em&gt;.  People tend to trust those who they have interacted with regularly.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Intimacy&lt;/strong&gt; (Emotions) - The extent to which a trustee can discuss difficult topics/agendas with you.  This is a high-risk/high-reward variable with a huge gray area.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Self-orientation&lt;/strong&gt; (Motives) - Anything that keeps us focused on ourselves rather than the person we are trying to get to trust us.  Self-orientation can manifest itself in several ways, selfishness being the most common.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What struck me most about the relationship between the variables in the Trust Equation is how heavily weighted self-orientation is.  For every marginal increase in self-orientation that occurs in a relationship, you have to work that much harder to re-build trust.  Conversely, focusing on others &lt;em&gt;first&lt;/em&gt; is the single most effective way to increase trust. This is powerful.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Take the Pessimist's View</title>
   <link href="http://robertgreiner.com/2013/04/take-the-pessimists-view/"/>
   <updated>2013-04-08T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/04/take-the-pessimists-view</id>
   <content type="html">&lt;p&gt;As my career has progressed, I have noticed that my best work comes from when I constantly step back and take a pessimist’s view of the solution.  Through this lens I am able to find potential pitfalls that I otherwise would have missed.&lt;/p&gt;

&lt;p&gt;I remember a recent brainstorming session at work where we were evaluating a potential technical solution for a client.  This solution was going to entail a pretty large change to a legacy system.  As a result, we wanted to list out the different pros/cons in order to make sure we had our bases covered.&lt;/p&gt;

&lt;p&gt;As we went through the list –ranking items 1-10 on various criteria– we felt really good about this new solution.  “Cost savings: 7”.  “Scalability: 9”, “User Experience: 9”. And on, and on.&lt;/p&gt;

&lt;p&gt;Once we removed our blinders and gave the list a final once-over, we noticed a troubling trend.  All of our criteria went from 5 and below on the legacy system to 7 and above on our newly designed system.&lt;/p&gt;

&lt;p&gt;Upon simultaneously realizing what just happened one of my team members summed up our naive efforts: &lt;em&gt;“This list activates my &lt;strong&gt;are you kidding me?!&lt;/strong&gt; response.  There is no way anyone would take this seriously.”&lt;/em&gt;  And, he’s right.&lt;/p&gt;

&lt;p&gt;Being an optimist at heart I am quick to think tasks will take a shorter amount of time then they actually will and  functionality will provide a higher benefit than it might.  These default urges must be quarantined when working on a project and I’ve found the best way to do this is to constantly take a step back and look at things like a pessimist would. This tactic helps ensure you aren’t sugar coating or glossing over important issues in a way that looks like you have something to hide or (worse) don’t know what you are talking about.&lt;/p&gt;

&lt;p&gt;Being an optimist is great, just make sure you take the time to view your work through the vantage point of a pessimist before you are finished.  This could save you countless headaches in the future.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Sync to Paper</title>
   <link href="http://robertgreiner.com/2013/03/sync-to-paper/"/>
   <updated>2013-03-26T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/03/sync-to-paper</id>
   <content type="html">&lt;p&gt;Sometimes I find myself overwhelmed by the massive amount of digital tools I have at my disposal to solve a particular problem.  What was originally meant to be a time-saving tool-set can quickly dissolve into a morass of confusion and frustration.  When the tools themselves become a hindrance to you it’s time for a change, even if it is only temporary.&lt;/p&gt;

&lt;p&gt;The solution I try as a first-resort is to &lt;strong&gt;sync to paper&lt;/strong&gt;.  Syncing to paper is no more complicated than it sounds, you simply take whatever problem you are working on digitally (code, design, project plan, article, etc.) and re-frame it using pencil and paper.&lt;/p&gt;

&lt;p&gt;I frequently find myself &lt;em&gt;syncing to paper&lt;/em&gt; in order to remove the technical clutter from my life and approach a problem through a new lens.  I’m always surprised how physically writing down (and sometimes talking through) a problem on paper will immediately make something apparent to me that I had previously been overlooking.&lt;/p&gt;

&lt;p&gt;I also really like how &lt;em&gt;temporary&lt;/em&gt; paper feels.  If I am working on something that is physically outside the main problem space then I can throw it away when I’m done and move on.  I am freed from the stress of having to make this particular piece of my work “presentable”.&lt;/p&gt;

&lt;p&gt;Writing things down on paper is also &lt;em&gt;painful&lt;/em&gt;, it starts physically hurting after you have been writing, sketching, and erasing without relaxing.  This helps keep you focused on the things that matter by not writing down the things that don’t.&lt;/p&gt;

&lt;p&gt;Finally, paper is limitless.  You can do things on paper that you can’t do in software.  You can also see more of it at one time.  You can hang it on the wall and lay it out on the floor.  Paper is practical in a way that a monitor can never be.&lt;/p&gt;

&lt;p&gt;Next time you are stuck on a problem and can’t seem to get past the keyboard/screen approach, try syncing to paper for a fresh perspective.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Could not establish trust relationship for the SSL/TLS secure channel</title>
   <link href="http://robertgreiner.com/2013/03/could-not-establish-trust-relationship-for-the-ssl-tls-secure-channel/"/>
   <updated>2013-03-05T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/03/could-not-establish-trust-relationship-for-the-ssl-tls-secure-channel</id>
   <content type="html">&lt;p&gt;Let’s say we want to use &lt;a href=&quot;http://restsharp.org/&quot;&gt;RestSharp&lt;/a&gt; to call an API method in an Azure-hosted environment over HTTPS.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;var client = new RestClient(&quot;https://randomqaenvironment.cloudapp.net&quot;);
var request = new RestRequest(&quot;resource/{id}&quot;, Method.POST);
request.AddUrlSegment(&quot;id&quot;, 123);
client.Execute&amp;lt;Person&amp;gt;(request);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This method will work fine as long as you are using a trusted certificate in your deployment.  However, most QA/Dev environments typically use a self-hosted certificate to save on cost, which will result in the following error:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The most straightforward way to get around this issue is to create your own custom  validation of server certificates using the  &lt;code class=&quot;highlighter-rouge&quot;&gt;ServerCertificateValidationCallback&lt;/code&gt; property.  Add this code to the top of any method that calls the target API and/or the &lt;code class=&quot;highlighter-rouge&quot;&gt;Run()&lt;/code&gt; method in the project’s &lt;em&gt;WebRole.cs&lt;/em&gt; file if you are using Azure.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =&amp;gt; true;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The code above will trust any security certificate handed back from the server you are interacting with so be sure you trust it.  In most cases this won’t be an issue since you control the server on the other end.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Help Your Team Succeed By Providing Context, Tools, and Opportunities</title>
   <link href="http://robertgreiner.com/2013/03/context-tools-and-opportunities/"/>
   <updated>2013-03-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/03/context-tools-and-opportunities</id>
   <content type="html">&lt;p&gt;In order for your team to succeed, they must be provided with the proper context, tools, and opportunities.  Neglecting any one of these three items will stack the odds against your team and keep them from reaching their full potential.&lt;/p&gt;

&lt;h3 id=&quot;context&quot;&gt;Context&lt;/h3&gt;

&lt;p&gt;First, context.  Your team needs to be kept in the loop as much as possible in order to be effective.  Good work comes from making connections between all of the different pieces of information you have floating around in your mind.  If some of that information is missing, you can’t expect to get the results you are looking for.  Give your team as much information as possible, even stuff you think is boring and uninteresting.&lt;/p&gt;

&lt;h3 id=&quot;tools&quot;&gt;Tools&lt;/h3&gt;

&lt;p&gt;Your team also needs good tools to succeed.  Would you trust a plumber who shows up at your house without a wrench? What about a car mechanic who doesn’t own any diagnostic tools? The same idea holds true for the professionals on your team.  In every industry, the best workers have the best tools.  Show you care and make some investment up front to make sure your team isn’t being held back by substandard (or non-existent) tools.&lt;/p&gt;

&lt;h3 id=&quot;opportunities&quot;&gt;Opportunities&lt;/h3&gt;

&lt;p&gt;Finally, once your team has the context and tools needed to succeed; it’s time to unleash them by providing opportunities to win.  This can be one of the biggest challengers for leaders since this involves work being done that is out of your control.  Look for opportunities and &lt;em&gt;teachable moments&lt;/em&gt; for your team and don’t be afraid to stretch them.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to Uninstall Internet Explorer 10</title>
   <link href="http://robertgreiner.com/2013/02/how-to-uninstall-microsoft-internet-explorer-10/"/>
   <updated>2013-02-28T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/02/how-to-uninstall-microsoft-internet-explorer-10</id>
   <content type="html">&lt;p&gt;I’m definitely an &lt;a href=&quot;http://en.wikipedia.org/wiki/Early_adopter&quot;&gt;early adopter&lt;/a&gt; when it comes to new software.  I enjoy the experience of using something different and exploring the new features that a team of developers painstakingly implemented with love and care.&lt;/p&gt;

&lt;p&gt;That being said, I was a bit disappointed to realize that my shiny new copy of Internet Explorer 10 was not compatible with some of the SharePoint sites I need for work (ironic, eh?).  I tried all sorts of workarounds but at the end of the day, I just couldn’t get anything working.&lt;/p&gt;

&lt;p&gt;If you find yourself in a similar situation and need to get IE10 off of your computer so you can get some work done, just follow these simple steps.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hit the &lt;em&gt;Start&lt;/em&gt; key&lt;/li&gt;
  &lt;li&gt;Type “Programs and Features” and hit &lt;em&gt;Enter&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Click “View Installed Updates”&lt;/li&gt;
  &lt;li&gt;Scroll down to the “Microsoft Windows” section&lt;/li&gt;
  &lt;li&gt;Click “Windows Internet Explorer 10”&lt;/li&gt;
  &lt;li&gt;Click &lt;em&gt;Uninstall&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Confirm that you indeed want to uninstall IE10&lt;/li&gt;
  &lt;li&gt;Wait until the un-installation finishes and reboot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2013/uninstall_ie10.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2013/uninstall_ie10_650.png&quot; alt=&quot;Uninstall IE10 through Programs and Features&quot; title=&quot;Uninstall IE10&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Agree Now to Disagree Later</title>
   <link href="http://robertgreiner.com/2013/02/agreeing-now-to-disagree-later/"/>
   <updated>2013-02-25T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/02/agreeing-now-to-disagree-later</id>
   <content type="html">&lt;p&gt;When you find yourself disagreeing with someone, you might find you get what you want more often if you focus on &lt;em&gt;what you can agree on&lt;/em&gt; first and save what you &lt;em&gt;don’t&lt;/em&gt; agree on for later in the conversation.&lt;/p&gt;

&lt;p&gt;Very few arguments occur where both parties take completely diametric points of view.  That being said, it is important to find the similarities between both parties as quickly as possible and make them known in order to keep (or shift) the conversation to a more collaborative position.&lt;/p&gt;

&lt;p&gt;Once you have made the similarities in your points known you can then start focusing on the areas where you disagree.  For especially tricky issues, the larger gap that you put between agreeing and then disagreeing with someone, the better chance you have of your argument being well received.&lt;/p&gt;

&lt;p&gt;This strategy is especially effective when you end up disagreeing with someone you don’t typically get along with or a person that has a reputation for being especially argumentative.&lt;/p&gt;

&lt;p&gt;As an added bonus, try substituting “but” for “and” in order to more effectively get your point across.  “I agree that your idea will allow us to ship sooner &lt;em&gt;and&lt;/em&gt; I think our users will have trouble understanding how the new functionality works.  Do you have any ideas of how we might mitigate this?”&lt;/p&gt;

&lt;p&gt;Disagreements are a constant factor when two or more people attempt to accomplish a goal.  The better you can navigate these treacherous waters, the more effective you will be at work and in your personal life.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The specified blob does not exist</title>
   <link href="http://robertgreiner.com/2013/02/the-specified-blob-does-not-exist/"/>
   <updated>2013-02-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/02/the-specified-blob-does-not-exist</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Microsoft.WindowsAzure.StorageClient.StorageClientException: The specified blob does not exist.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are two different scenarios that will throw this exception when trying to call &lt;code class=&quot;highlighter-rouge&quot;&gt;CloudBlob.DownloadText()&lt;/code&gt;.  The first, and least interesting, is that the blob reference you are holding on to actually &lt;em&gt;doesn’t exist&lt;/em&gt;.  This is simple enough to check and you probably wouldn’t have made it this far in your searching had that been the original problem.  I digress.&lt;/p&gt;

&lt;p&gt;The second scenario that results in the above error is that you are behind a firewall that blocks outgoing requests to Azure Blob Storage.  You can confirm this by running the same code on a different network (I just connected my laptop to my phone’s hotspot) and see if everything &lt;em&gt;magically&lt;/em&gt; starts working.&lt;/p&gt;

&lt;p&gt;The easiest way around this issue is to make sure the &lt;code class=&quot;highlighter-rouge&quot;&gt;baseAddress&lt;/code&gt; property in the &lt;code class=&quot;highlighter-rouge&quot;&gt;CloudBlobClient&lt;/code&gt; object starts with &lt;strong&gt;https&lt;/strong&gt;.  You should be doing this anyway.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;new CloudBlobClient(&quot;https://account.blob.core.windows.net/&quot;, credentials);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If this still doesn’t work, you will have to punch open port 443 on your firewall or resort to the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/dd179440.aspx&quot;&gt;Get Blob&lt;/a&gt; REST API method.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The First Thing You Should Do After A Missed Deadline</title>
   <link href="http://robertgreiner.com/2013/02/the-first-thing-you-should-do-after-a-missed-deadline/"/>
   <updated>2013-02-05T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/02/the-first-thing-you-should-do-after-a-missed-deadline</id>
   <content type="html">&lt;p&gt;There are several different project management levers you can pull when a team member misses a deadline, but there is one that you should &lt;em&gt;always&lt;/em&gt; do before anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make a new deadline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deadlines drive behavior on a project.  Most professionals will do their level best to meet project schedules (assuming the schedule is reasonable, but that deserves another post entirely.)&lt;/p&gt;

&lt;p&gt;When a deadline passes, all of the pain that comes from missing the target has already been felt.  The task that was being worked falls into a state of limbo and it often becomes ambiguous to the team member whether they should be working on their next task or continue working the current (now late) task to completion.&lt;/p&gt;

&lt;p&gt;To remedy this and to enforce the desired behavior moving forward, a new deadline should be set immediately.  This will ensure the proper priority is set to the late task and will re-instate some pressure to hit the new deadline.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Innovation and Information</title>
   <link href="http://robertgreiner.com/2013/02/innovation-and-information/"/>
   <updated>2013-02-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/02/innovation-and-information</id>
   <content type="html">&lt;p&gt;If I have a $5 bill in my pocket and give it to you, then you have +$5 and I have -$5.  By definition, your gain in this scenario results in my loss since I no longer have the $5 available to me.  This sort of &lt;a href=&quot;http://en.wikipedia.org/wiki/Zero%E2%80%93sum_game&quot;&gt;zero-sum&lt;/a&gt; situation can end up creating competition between two or more parties that share a common interest in  the same resource.&lt;/p&gt;

&lt;p&gt;On the other hand, if I have an idea &lt;em&gt;X&lt;/em&gt; and I share it with you, something altogether different happens.  The total amount of information in the world increased now that we both know &lt;em&gt;X&lt;/em&gt;.  We also get the added benefit of me knowing that you know &lt;em&gt;X&lt;/em&gt; and you knowing that I know &lt;em&gt;X&lt;/em&gt;.  Not to mention that you know that I shared &lt;em&gt;X&lt;/em&gt; with you.&lt;/p&gt;

&lt;p&gt;This sort of geometric increase in knowledge is vital for innovation to occur.  Ideas need to spread.  They need to bounce around and collide with each other and be manipulated and re-purposed to create something new.&lt;/p&gt;

&lt;p&gt;Still not convinced?  Let’s take a quick look at some of the great ideas from the 19th and 20th centuries.  Notice how ideas thrive in non-market networked environments.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2013/where_good_ideas_come_from.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2013/where_good_ideas_come_from.png&quot; alt=&quot;Good ideas thrive in non market networked environments&quot; title=&quot;Great Ideas from the 19th and 20th Centuries&quot; class=&quot;center&quot; /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;sub&gt;(Source: &lt;a href=&quot;http://www.amazon.com/Where-Good-Ideas-Come-Innovation/dp/1594485380&quot;&gt;Where Good Ideas Come From&lt;/a&gt;)&lt;/sub&gt;&lt;/p&gt;

&lt;p&gt;There are plenty of interesting and challenging problems to solve in life and business.  The best way to solve these problems is to share ideas openly across teams, departments, and industries.&lt;/p&gt;

&lt;p&gt;It turns out, your best competitive advantage may lie in how well you share the information you own instead of how well you protect it.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Quote: There are a million ways to lose a work day...</title>
   <link href="http://robertgreiner.com/2013/01/one-million-ways-to-lose-a-work-day/"/>
   <updated>2013-01-31T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/01/one-million-ways-to-lose-a-work-day</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;There are a million ways to lose a work day… but not even a single way to get one back. -Tom Demarco in &lt;em&gt;Peopleware: Productive Projects and Teams&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How true…&lt;/p&gt;

&lt;p&gt;After reading this quote, I promptly disabled email notifications on my laptop and phone.  Only 999,998 more distractions to eliminate.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Thank You.</title>
   <link href="http://robertgreiner.com/2013/01/thank-you/"/>
   <updated>2013-01-22T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/01/thank-you</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Be hearty in your approbation and lavish in your praise. - Dale Carnegie&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Running a team can be extremely challenging at times.  Being responsible for the coordination of human beings resulting in the execution of a product that will be used and purchased by a completely different set of (less forgiving) humans is a tough situation to be in regardless of industry.&lt;/p&gt;

&lt;p&gt;One thing that frequently baffles team leaders -new and old alike- is how and when to give praise.  As a result, most team leaders err on the side of not saying anything when someone on their team does something awesome.&lt;/p&gt;

&lt;p&gt;Over time, this can result in a significant reduction in team morale, which in turn, will reduce the effectiveness and productivity of everyone on the team.  Once this happens, your chances of hitting your next deliverable date decrease rapidly.&lt;/p&gt;

&lt;p&gt;One of the easiest and most straightforward ways I’ve found to combat this issue is to simply say “Thank You” whenever someone on your team deserves it.  Did Jim stay late last week to finish that one final defect before he went home?  Did Suzy come up with a new way of doing work that saves the rest of the team some hassle?  Did Charlie simply hit his deadline?  If so, say “Thank You!”&lt;/p&gt;

&lt;p&gt;Thanking someone for their hard work, even if it was for meeting a goal that is part of their everyday responsibilities sends a message to your team that you notice when things are being done right and helps encourage the same type of behavior in the future.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>People</title>
   <link href="http://robertgreiner.com/2013/01/people/"/>
   <updated>2013-01-21T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/01/people</id>
   <content type="html">&lt;p&gt;When I was in college, I lived in this old eight-unit apartment complex (for $400/month including electricity) with my roommate who I’d known since high school.  We rented this apartment from a sweet old lady named Edith who had us sign a lease saying we’d be in bed by 10pm and wouldn’t say any swear words.&lt;/p&gt;

&lt;p&gt;Around 6 months after we moved in, one of Edith’s neighbors knocked on our door while I was busy trying to figure out how in the world calculating the trajectories of monkeys getting shot out of cannons would ever get me anywhere in life. I opened the door, and to my surprise was presented with a fresh baked Pineapple cake that was still warm to the touch.  I think she said something about wanting to make sure we were eating but I was so dumbstruck that I really don’t remember.&lt;/p&gt;

&lt;p&gt;Apparently, my roommate stopped and talked for a couple of hours with Edith’s neighbor and her husband a few days earlier.  The happy couple was so elated that someone actually took the time to chat about their lives, that they wanted to return the favor with some tasty baked goods.  “See that…” my roommate said “That is why relationships will take you further in this world than smarts.”&lt;/p&gt;

&lt;p&gt;This experience really opened my eyes to the immense value that relationships can bring to not only my life, but the lives of the people around me.&lt;/p&gt;

&lt;p&gt;Good relationships will not only help you live a happier (and more sugar induced) personal life, but it can also be the key to running successful projects.  According to &lt;a href=&quot;http://www.amazon.com/Peopleware-Productive-Projects-Second-Edition/dp/0932633439/&quot;&gt;Peopleware&lt;/a&gt; the success of a given  software project very rarely hinges on how good the technology is.  Most software projects fail due to a breakdown in human interactions.&lt;/p&gt;

&lt;p&gt;Fostering strong relationships can be healthy for your career as well.  According to the Harvard Business School &lt;a href=&quot;http://www.alumni.hbs.edu/careers/networking.html&quot;&gt;65 to 85 percent of jobs&lt;/a&gt; are found through networking.&lt;/p&gt;

&lt;p&gt;One of the keys in building relationships is to &lt;em&gt;offer more than you take&lt;/em&gt;.  When meeting new people, as soon as you start asking “what’s in it for me?” you have already started down the path of squashing an already fragile relationship.  This seems like common sense I know, but I’m always surprised at how many people don’t follow this and spend their efforts taking advantage of others for short term gain.&lt;/p&gt;

&lt;p&gt;Remember, you can’t always rely on &lt;a href=&quot;http://en.wikipedia.org/wiki/Build_a_better_mousetrap,_and_the_world_will_beat_a_path_to_your_door&quot;&gt;building a better mousetrap&lt;/a&gt; so go out and meet someone new today and figure out &lt;em&gt;what you can do for them&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Not sure where to get started?  Dale Carnegie’s classic &lt;a href=&quot;http://www.amazon.com/How-Win-Friends-Influence-People/dp/0671027034&quot;&gt;How to Win Friends and Influence People&lt;/a&gt; is a great place to begin.    Even though Dale’s book was written in 1936, it contains a treasure trove of insight into human interaction and what you must do in order to make friends.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The remote server returned an error: (411) Length Required</title>
   <link href="http://robertgreiner.com/2013/01/the-remote-server-returned-an-error-411-length-required/"/>
   <updated>2013-01-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/01/the-remote-server-returned-an-error-411-length-required</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;System.Net.WebException: The remote server returned an error: (411) Length Required.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a pretty common issue that comes up when trying to make call a REST based API method through POST.  Luckily, there is a simple fix for this one.&lt;/p&gt;

&lt;p&gt;This is the code I was using to call the Windows Azure Management API.  This particular API call requires the request method to be set as POST, however there is no information that needs to be sent to the server.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;var request = (HttpWebRequest) HttpWebRequest.Create(requestUri);
request.Headers.Add(&quot;x-ms-version&quot;, &quot;2012-08-01&quot;);
request.Method = &quot;POST&quot;;
request.ContentType = &quot;application/xml&quot;;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To fix this error, add an explicit content length to your request before making the API call.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;request.ContentLength = 0;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>How Successful People Manage Goals</title>
   <link href="http://robertgreiner.com/2013/01/how-successful-people-manage-goals/"/>
   <updated>2013-01-03T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2013/01/how-successful-people-manage-goals</id>
   <content type="html">&lt;p&gt;I don’t particularly care for New Year’s resolutions.  I think they have been marginalized to the point of being a joke and they have a long history of being completely brushed off by February.  That being said, I am a fan of setting goals and have been thinking a little on how successful people accomplish seemingly impossible things in their lives.&lt;/p&gt;

&lt;p&gt;In Heidi Grant Halvorson’s new book &lt;a href=&quot;http://www.amazon.com/Things-Successful-People-Differently-ebook/dp/B00607EX1E/ref=sr_1_2?ie=UTF8&amp;amp;qid=1357221466&amp;amp;sr=8-2&amp;amp;keywords=9+things+successful+people+do+differently&quot;&gt;Nine Things Successful People Do Differently&lt;/a&gt; she discusses this very topic by analyzing the science and psychology behind character traits and actions of successful people throughout history.  These practical nuggets of wisdom are helpful to anyone  at any point in their career and are not bound to the December/January timeframe.&lt;/p&gt;

&lt;p&gt;Here are the nine things successful people do differently.  I won’t waste your time by repeating the same information that is in the book, you should definitely check it out for yourself.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Get Specific&lt;/li&gt;
  &lt;li&gt;Seize the moment to act on your goals&lt;/li&gt;
  &lt;li&gt;Know exactly how far you have left to go&lt;/li&gt;
  &lt;li&gt;Be a realistic optimist&lt;/li&gt;
  &lt;li&gt;Focus on getting better rather than being good&lt;/li&gt;
  &lt;li&gt;Have grit&lt;/li&gt;
  &lt;li&gt;Build your willpower muscle&lt;/li&gt;
  &lt;li&gt;Don’t tempt fate&lt;/li&gt;
  &lt;li&gt;Focus on what you will do, not what you won’t do&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personally, I think that the &lt;em&gt;things&lt;/em&gt; Heidi outlines in her book are a nice compliment of SMART goals and provide a structure and higher level of detail around how to accomplish them.&lt;/p&gt;

&lt;p&gt;If you are looking for a book to help you turn your New Year’s resolution into something more meaningful and worthwhile, you could do worse than to check out &lt;em&gt;Nine Things Successful People Do Differently&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Happy New Year.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>No publisher was set for configuration settings</title>
   <link href="http://robertgreiner.com/2012/12/no-publisher-was-set-for-configuration-settings/"/>
   <updated>2012-12-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/12/no-publisher-was-set-for-configuration-settings</id>
   <content type="html">&lt;p&gt;I ran into this issue today when trying to configure a WASABi setting in my App.config that pointed to a connection string value in my Windows Azure Service Configuration.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The Windows Azure Storage connection string with name ‘AutoscaleStorageAccount’ could not be retrieved from the service configuration file (.cscfg). No publisher was set for configuration settings.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This error is a result of Microsoft maintaining the ability to seamlessly convert your application between a cloud-hosted environment and a self-hosted environment. The  thinking here is that your application technically shouldn’t know anything about Azure or any cloud configuration files.&lt;/p&gt;

&lt;p&gt;In order to bridge the gap between the Enterprise Library Application Block and my Service Configuration file, I set up a Configuration Setting Publisher delegate that will point configuration get requests to the proper location.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4280952.js&quot;&gt;&lt;/script&gt;

&lt;noscript&gt;
    CloudStorageAccount.SetConfigurationSettingPublisher(
        (configName, configSetter) =&amp;gt;
            configSetter(RoleEnvironment.GetConfigurationSettingValue(configName))
    );
&lt;/noscript&gt;

&lt;p&gt;I put the Configuration Publisher setup in my Worker Role’s &lt;code class=&quot;highlighter-rouge&quot;&gt;OnStart()&lt;/code&gt; method so I could be sure it only got configured once and was set up before anything tried to access my Service Configuration settings.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Could not load file or assembly Microsoft.WindowsAzure.StorageClient</title>
   <link href="http://robertgreiner.com/2012/12/could-not-load-file-or-assembly-microsoft-windows-azure-storage-client/"/>
   <updated>2012-12-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/12/could-not-load-file-or-assembly-microsoft-windows-azure-storage-client</id>
   <content type="html">&lt;p&gt;I ran into this error today when trying to configure Autoscaling in Azure using WASABi.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Could not load file or assembly ‘Microsoft.WindowsAzure.StorageClient, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)”:”Microsoft.WindowsAzure.StorageClient, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To fix this, you will need to add assembly binding redirects for the Windows Azure StorageClient library.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4261073.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
&lt;pre&gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;runtime&amp;gt;
    &amp;lt;assemblyBinding xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot;&amp;gt;
      &amp;lt;dependentAssembly&amp;gt;
        &amp;lt;assemblyIdentity name=&quot;Microsoft.WindowsAzure.StorageClient&quot; publicKeyToken=&quot;31bf3856ad364e35&quot; culture=&quot;neutral&quot; /&amp;gt;
        &amp;lt;bindingRedirect oldVersion=&quot;1.1.0.0&quot; newVersion=&quot;1.7.0.0&quot;/&amp;gt;
      &amp;lt;/dependentAssembly&amp;gt;
      &amp;lt;dependentAssembly&amp;gt;
        &amp;lt;assemblyIdentity name=&quot;Microsoft.WindowsAzure.StorageClient&quot; publicKeyToken=&quot;31bf3856ad364e35&quot; culture=&quot;neutral&quot; /&amp;gt;
        &amp;lt;publisherPolicy apply=&quot;no&quot; /&amp;gt;
      &amp;lt;/dependentAssembly&amp;gt;
    &amp;lt;/assemblyBinding&amp;gt;
  &amp;lt;/runtime&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;p&gt;Once you have made these changes, everything should start working.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to Filter by DateTime in Azure Table Storage</title>
   <link href="http://robertgreiner.com/2012/12/how-to-filter-by-datetime-in-azure-table-storage/"/>
   <updated>2012-12-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/12/how-to-filter-by-datetime-in-azure-table-storage</id>
   <content type="html">&lt;p&gt;Azure Table Storage provides a handy way to store data of all shapes and sizes.  However, getting the data you want out of Table Storage can be a bit tricker than putting data in.&lt;/p&gt;

&lt;p&gt;One filter I have found myself relying on over and over again during my time with Azure involves returning data for a particular date and time.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Timestamp gt datetime’2012-12-10T15:00:00’&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Remember, data in the the &lt;code class=&quot;highlighter-rouge&quot;&gt;Timestamp&lt;/code&gt; column is  stored in UTC so craft your WCF filters accordingly.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Increase Sales by Improving Local Search Results</title>
   <link href="http://robertgreiner.com/2012/11/increase-sales-by-improving-local-search-results/"/>
   <updated>2012-11-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/11/increase-sales-by-improving-local-search-results</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://milo.com/about-us&quot;&gt;Milo&lt;/a&gt; released an interesting infographic demonstrating some of the benefits retailers can reap by increasing the quality of their local search results.&lt;/p&gt;

&lt;p&gt;I was surprised to find out that shoppers not only rely on local search results more than I thought but they also use local search results to drive in-store purchases.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;64% of shoppers with tablets and 61% of those with smartphones reported that they perform weekly local searches on their devices.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2012/mobile_searching.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/mobile_searching_small.png&quot; alt=&quot;Increase sales by improving your local search results&quot; title=&quot;Local Search Infographic&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Making it easy for potential customers to find product inventory for stores close to them can help turn the tables on the ever growing &lt;a href=&quot;http://en.wikipedia.org/wiki/Showrooming&quot;&gt;
Showrooming&lt;/a&gt; problem by letting customers make purchasing decisions before they leave the house.&lt;/p&gt;

&lt;p&gt;Happy Black Friday everyone.  Don’t forget to &lt;a href=&quot;https://www.americanexpress.com/us/small-business/Shop-Small/&quot;&gt;Shop Small&lt;/a&gt; this Saturday.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Shrink Your Team to Increase Effectiveness</title>
   <link href="http://robertgreiner.com/2012/11/shrink-your-team-to-increase-effectiveness/"/>
   <updated>2012-11-21T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/11/shrink-your-team-to-increase-effectiveness</id>
   <content type="html">&lt;p&gt;At this point in the state of software development we’ve all likely either heard of or experienced &lt;a href=&quot;http://en.wikipedia.org/wiki/Brooks's_law&quot;&gt;Brooks’ Law&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Adding manpower to a late software project makes it later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How you respond to this counter-intuitive nugget of wisdom can single handedly make or break your current software project.&lt;/p&gt;

&lt;p&gt;However, there is a second side to this coin that few are aware of which deals with the inverse correlation between the size of a team and its overall effectiveness regardless of the delivery date.&lt;/p&gt;

&lt;p&gt;This is summed up quite nicely in one of HBR’s Daily Management Tips &lt;a href=&quot;http://hbr.org/tip/2012/11/19/keep-your-team-small&quot;&gt;Keep Your Team Small&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;There is well-known research that shows people’s efforts quickly diminish as team size increases. This is because team members reduce their input when they feel less responsible for the output.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This issue can be resolved by splitting up your existing team into multiple mini-teams which are each responsible for delivering a separate piece of your overall project.  Not only will this practice end up increasing the overall effectiveness of your entire team but you also now have the added benefit of moving people between sub-teams in order to keep them engaged.&lt;/p&gt;

&lt;p&gt;Couple this tactic with placing the current development iteration’s tasks on a wall with post-it notes to ensure maximum transparency when it comes to the productivity of your team.&lt;/p&gt;

&lt;p&gt;At the end of the day, the fewer places you give your team members to hide the more productive your team will be.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to Increase the Soft Caps on Your Windows Azure Subscription</title>
   <link href="http://robertgreiner.com/2012/11/how-to-increase-the-soft-caps-on-your-windows-azure-subscription/"/>
   <updated>2012-11-14T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/11/how-to-increase-the-soft-caps-on-your-windows-azure-subscription</id>
   <content type="html">&lt;p&gt;Each Windows Azure subscription has several soft caps applied out of the box:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Hosted Services:&lt;/strong&gt; 6&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Storage Accounts:&lt;/strong&gt; 5&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cores:&lt;/strong&gt; 20 (1 small instance = 1 core, 1 medium instance = 2 cores, 1 large instance = 4 cores)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To increase these limits, simply put in a request with the &lt;a href=&quot;http://www.microsoft.com/windowsazure/support/&quot;&gt;Windows Azure  Support Team&lt;/a&gt; and they will take care of you.&lt;/p&gt;

&lt;p&gt;It is probably a good idea to be proactive about this and get your limits increased when you are at 70% capacity or so.  when you start scaling out your hosted services to multiple instances, your cores seem to get utilized very quickly.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Your career needs a campaign strategy</title>
   <link href="http://robertgreiner.com/2012/11/your-career-needs-a-campaign-strategy/"/>
   <updated>2012-11-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/11/your-career-needs-a-campaign-strategy</id>
   <content type="html">&lt;p&gt;Dorrie Clark’s Harvard Business Review Article &lt;a href=&quot;http://hbr.org/2012/11/a-campaign-strategy-for-your-career/ar/1&quot;&gt;A Campaign Strategy for Your Career&lt;/a&gt; shows how career trajectories can be accelerated by following some of the same principles as a typical political campaign.  The main idea is to start with the end date in mind and work backwards from there carefully planning milestones and identifying key individuals that will help get you to where you want to be.&lt;/p&gt;

&lt;p&gt;Start thinking about your dream job, or even the job that you want to move into after this one.  Now ask yourself what you are doing to make this dream a reality.  Do you know what skills or qualifications will be required to both obtain and succeed at this job?  This knowledge will allow you to find and analyze the gaps in your skillset and work towards filling them as soon as possible.&lt;/p&gt;

&lt;p&gt;It is also important to remember that success is impossible without the help of others.  Who can you identify that will help you along the path of career greatness?  Identifying solid mentors and decision makers is key if you plan to move up in the world.&lt;/p&gt;

&lt;p&gt;Lenny Achan is the poster boy for career campaign strategies.  He explains how he was able to move from a nurse at  Mount Sinai Medical Center to a senior health care executive in less than 10 years.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“I started prewriting my résumés for the next five or 10 years, so in 2002 I had one for 2012,” he recalls. “I’d list the education I’d have attained, the committees and organizations I’d belong to, what I’d be doing in my free time. I put them all in writing to have a focal point to work toward.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Waiting to build your future job’s skillset until you are ready to move means that you likely won’t be prepared when the opportunity presents itself.  Make sure you are prepared by starting your campaign for promotion today.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Write it down</title>
   <link href="http://robertgreiner.com/2012/11/write-it-down/"/>
   <updated>2012-11-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/11/write-it-down</id>
   <content type="html">&lt;p&gt;Journaling the details of interesting conversations you find yourself a part of can pay huge dividends in the future.  Not only will you accumulate a wealth of valuable knowledge and ideas but you get the added benefit of seeing patterns emerge as you collect more and more data.&lt;/p&gt;

&lt;p&gt;Also, by writing things down you force the amorphous cloud of abstract thoughts floating around in your head into something coherent and useful.  This process is difficult, but important if you want to move your theoretical ideas into the realm of practicality.&lt;/p&gt;

&lt;p&gt;This practice can be especially useful in a business setting where the entire group involved with the conversation will benefit from your efforts.  Sending a quick follow-up email after each meaningful conversation shows that you care and can help keep everyone on the same page.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Could not load file or assembly msshrtmi or one of its dependencies</title>
   <link href="http://robertgreiner.com/2012/10/could-not-load-file-or-assembly-msshrtmi/"/>
   <updated>2012-10-16T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/10/could-not-load-file-or-assembly-msshrtmi</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Could not load file or assembly ‘msshrtmi’ or one of its dependencies. An attempt was made to load a program with an incorrect format. &lt;br /&gt;
&lt;strong&gt;Description:&lt;/strong&gt; An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. &lt;br /&gt;
&lt;strong&gt;Exception Details:&lt;/strong&gt; System.BadImageFormatException: Could not load file or assembly ‘msshrtmi’ or one of its dependencies. An attempt was made to load a program with an incorrect format. 
&lt;strong&gt;Source Error:&lt;/strong&gt;&lt;br /&gt;
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.&lt;br /&gt;
&lt;strong&gt;Assembly Load Trace:&lt;/strong&gt; The following information can be helpful to determine why the assembly ‘msshrtmi’ could not be loaded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get this error when you create an Azure Project in your solution and then subsequently try to run the Web Project.  For some reason, Visual Studio adds &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;PlatformTarget&amp;gt;AnyCPU&amp;lt;/PlatformTarget&amp;gt;&lt;/code&gt; to the projects configuration file when the Azure Project is created which ends up breaking the web project.&lt;/p&gt;

&lt;p&gt;To fix this problem, perform the following steps:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Unload project&lt;/li&gt;
  &lt;li&gt;Edit Project&lt;/li&gt;
  &lt;li&gt;Delete all instances of &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;PlatformTarget&amp;gt;AnyCPU&amp;lt;/PlatformTarget&amp;gt;&lt;/code&gt; (I had two)&lt;/li&gt;
  &lt;li&gt;Save Edits&lt;/li&gt;
  &lt;li&gt;Reload Project&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Delete all bin/obj folders&lt;/strong&gt; (super important)&lt;/li&gt;
  &lt;li&gt;Clean Solution&lt;/li&gt;
  &lt;li&gt;Run Solution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should now be able to run your Web Project again.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>CacheInstaller.exe has stopped working</title>
   <link href="http://robertgreiner.com/2012/10/cacheinstaller-exe-has-stopped-working/"/>
   <updated>2012-10-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/10/cacheinstaller-exe-has-stopped-working</id>
   <content type="html">&lt;p&gt;I got the following error today when trying to enable &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/hh914161.aspx&quot;&gt;Windows Azure Role Based Caching&lt;/a&gt; on an existing Azure project.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/cacheinstaller-error.png&quot; alt=&quot;CacheInstaller.exe error message&quot; title=&quot;CacheInstaller error message&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, there wasn’t much to go on when running my solution through VisualStudio so I thought I would try and  run &lt;code class=&quot;highlighter-rouge&quot;&gt;CacheInstaller.exe&lt;/code&gt; manually.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. —&amp;gt; System.InvalidOperationException: the role environment has not been initialized
   at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.get_IsEmulated()&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This error occurs due to a conflict between the Windows Azure Caching Preview plug-in and the Windows Server App Fabric Caching installation.&lt;/p&gt;

&lt;p&gt;To fix this, you need to uninstall the &lt;code class=&quot;highlighter-rouge&quot;&gt;CachingServices&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;CacheClient&lt;/code&gt; runtime features and the &lt;code class=&quot;highlighter-rouge&quot;&gt;Cache Administration&lt;/code&gt; Administration Tool in Windows Server AppFabric.  You can access the Remove Features dialog through &lt;strong&gt;Start&lt;/strong&gt;, &lt;strong&gt;All Programs&lt;/strong&gt;, &lt;strong&gt;Windows Server AppFabric&lt;/strong&gt;, and click &lt;strong&gt;Add or remove Features&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2012/appfabric-setup-wizard.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/appfabric-setup-wizard-small.png&quot; alt=&quot;AppFabric setup wizard uninstallation instructions&quot; title=&quot;AppFabric setup wizard&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The uninstillation process will take several minutes to complete.  Once it is finished, restart your computer and try to run your project again with caching enabled.&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a href=&quot;http://www.whilefork.com/&quot;&gt;David Romeo&lt;/a&gt; for helping me through this particular error.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Getting Started with Security in .NET and Windows Azure</title>
   <link href="http://robertgreiner.com/2012/10/getting-started-with-security-in-net-and-windows-azure/"/>
   <updated>2012-10-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/10/getting-started-with-security-in-net-and-windows-azure</id>
   <content type="html">&lt;p&gt;I had someone ask me recently about how to improve the security awareness of their organization.    This article is meant to serve as a starting point when developing applications using the .NET Framework and Windows Azure and is in no way intended to be an exhaustive list.&lt;/p&gt;

&lt;p&gt;My personal feeling on the subject is that it is virtually impossible for any single developer (or development team) to be 100% security compliant when developing a product.   The technical security landscape simply moves too quickly to reasonably expect developers to be aware of all security threats that currently exist.&lt;/p&gt;

&lt;p&gt;That being said, developers and managers should keep themselves up-to-speed as best they can on the most common best practices and techniques in writing secure software in addition to implementing the most up-to-date versions of their development frameworks.  After that, a solid security analytics tool can be used to flesh out any security risks that were introduced due to human error or poor development practices.&lt;/p&gt;

&lt;p&gt;The following links should help build a solid understanding of the current trends and best-practices when developing on the Microsoft stack.&lt;/p&gt;

&lt;h4 id=&quot;10-security-tips-every-developer-must-know&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/cc188938.aspx&quot;&gt;10 Security Tips Every Developer Must Know&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;I think this is the single most important article to read in the list.  It contains practical insight and advice that can be used today on any software project no matter what stage it is in.  The basic idea is to operate with the understanding that you can’t (and shouldn’t) trust your users to behave themselves when using your system.  This method of thinking is the foundation to all defensive programming, it allows developers to focus on the implications of programming and design decisions that are made in areas of the system that can potentially be attacked.&lt;/p&gt;

&lt;p&gt;The security tips outlined in this article work in the same way as locking your doors every time you leave your house does, it provides just enough security to keep honest people honest and to motivate convenience criminals to look elsewhere.  However, if someone really wants to break in when you’re gone, they will, a deadbolt won’t be enough to deter them.&lt;/p&gt;

&lt;h4 id=&quot;microsoft-security-development-lifecycle&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/security/sdl/discover/training.aspx]&quot;&gt;Microsoft Security Development Lifecycle&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;The Security Development Lifecycle provides valuable insight on how to build security into your project form the very beginning stages all the way through to deployment.  The ideas here are focused more on the organizational level and would be difficult to implement on an existing project.  If you are interested in exploring this further, the SDL website has several training materials as well as a &lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/dd347831.aspx&quot;&gt;free utility&lt;/a&gt; that can help a software team get started with the SDL.&lt;/p&gt;

&lt;h4 id=&quot;an-overview-of-security-in-the-net-framework&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/library/aa302369.aspx&quot;&gt;An Overview of Security in the .NET Framework&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;The .NET Framework provides several different types of security models and features to address the various needs of any given application.  This article provides a conceptual overview of the .NET Framework’s most common security features and helps build a solid security-minded foundation.&lt;/p&gt;

&lt;h4 id=&quot;windows-azure-security-guide&quot;&gt;&lt;a href=&quot;https://www.windowsazure.com/en-us/manage/linux/best-practices/security/&quot;&gt;Windows Azure Security Guide&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;On a traditional on-premise software solution, your entire product can reside on a single server behind a firewall.  This drastically simplifies the implementation and management of security related requirements.&lt;/p&gt;

&lt;p&gt;In the cloud, however, it is virtually impossible for your entire application to live in a single virtual-instance.  Cloud based solutions inherently expose more low-level pieces of your application to the outside world (surface area) due to the increased number of end-points required to maintain a complete software system.   That being said, additional security considerations should be made when developing software that will be hosted in the cloud.&lt;/p&gt;

&lt;h4 id=&quot;penetration-testing&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Penetration_test#Web_application_penetration_testing&quot;&gt;Penetration Testing&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Penetration Testing tools simulate various attacks on a software system from both inside and outside a given network.  During the test, security issues can be uncovered and it is the responsibility of the organization to respond accordingly.  Penetration tests should be run on a continuous basis to ensure the timely discovery of new security vulnerabilities.&lt;/p&gt;

&lt;p&gt;There are companies that will perform penetration tests for you, or you can conduct them yourself using one of &lt;a href=&quot;http://www.computerworld.com/s/article/9087439/Five_free_pen_testing_tools&quot;&gt;several tools available&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;static-analysis&quot;&gt;Static Analysis&lt;/h4&gt;

&lt;p&gt;Static analysis tools crawl through your code and attempt to uncover security vulnerabilities that were inadvertently (or otherwise) introduced during development.  These tools are extremely valuable because they can uncover potential issues early on in the development of a software system.  This allows vulnerabilities to be removed before the finished product is available to the public.  Preventative development can save a great deal of headache and embarrassment in the future.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=6544&quot;&gt;FxCop&lt;/a&gt; is the most commonly used static code analysis tool for .NET.  In addition to security profiling, FxCop will also perform various other types of static analysis on a codebase to ensure the software is of the highest quality possible.&lt;/p&gt;

&lt;h4 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;Security is difficult and scary.  No matter how much planning and preperation you put into the security of your system, you will invariably end up missing something.  The information and links above are meant to be tools in your crusade to develop secure systems that your users can trust.&lt;/p&gt;

&lt;p&gt;I hope these links provide you some helpful and practical information and if you feel like this list can be improved feel free to let me know.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Reduce Your Bounce Rate by Implementing a Responsive Design</title>
   <link href="http://robertgreiner.com/2012/10/reduce-your-bounce-rate-by-implementing-a-responsive-design/"/>
   <updated>2012-10-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/10/reduce-your-bounce-rate-by-implementing-a-responsive-design</id>
   <content type="html">&lt;p&gt;Two weeks ago I decided to implement a responsive design on this site.  The main reason for this was that I didn’t want to force my readers to zoom in and scroll all over the place when reading on their mobile device.&lt;/p&gt;

&lt;p&gt;Initially, I didn’t think implementing a responsive design would be that big of a deal.  But, to my pleasant surprise, I noticed that readers started hanging around my site significantly  more after the change.&lt;/p&gt;

&lt;p&gt;My &lt;a href=&quot;http://en.wikipedia.org/wiki/Bounce_rate&quot;&gt;Bounce Rate&lt;/a&gt; (the rate at which users exit your site without viewing any other pages) went from an embarrassingly high 86% to a much more favorable 1.5% in a matter of two days.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2012/BounceRate.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/BounceRateSmall.png&quot; alt=&quot;I cut my bounce rate in half by implementing a responsive design&quot; title=&quot;Current Bounce Rate&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to implement a responsive design on your website, there are &lt;a href=&quot;https://www.google.com/#hl=en&amp;amp;output=search&amp;amp;sclient=psy-ab&amp;amp;q=how+to+implement+a+responsive+design&amp;amp;oq=how+to+implement+a+responsive+design&amp;amp;gs_l=hp.3..0i22l2.456.5164.0.5329.36.28.0.8.8.0.164.2871.15j13.28.0.les%3B..0.0...1c.1.wuujDGv3UQY&amp;amp;pbx=1&amp;amp;bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&amp;amp;fp=b1c4c7195259ecfd&amp;amp;bpcl=35243188&amp;amp;biw=1600&amp;amp;bih=809&quot;&gt;plenty of good tutorials&lt;/a&gt; out there, I won’t try and repeat them.  However, if you  want to copy what I already have you can check out the skeleton media queries below or simply &lt;a href=&quot;http://robertgreiner.com/assets/css/media-queries.css&quot;&gt;grab my entire CSS file&lt;/a&gt;.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3868925.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
    @media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { }
    @media only screen and (min-width: 450px) and (max-width: 710px) { /* Tablet sized viewport */}
    @media only screen and (max-width: 449px) { /* Phone sized viewport */ }
&lt;/noscript&gt;

&lt;p&gt;I think implementing a responsive web design is an easy way to decrease your bounce rate and keep readers on your site for longer.  At the end of the day, anything you can do to increase the comfort level of your users is always a good thing.   I wish I had thought to  do this sooner.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The type 'System.Data.Objects.DataClasses.EntityObject' is defined in an assembly that is not referenced</title>
   <link href="http://robertgreiner.com/2012/10/the-type-system-data-objects-dataclasses-entityobject-is-not-referenced/"/>
   <updated>2012-10-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/10/the-type-system-data-objects-dataclasses-entityobject-is-not-referenced</id>
   <content type="html">&lt;p&gt;I got this error today when working on a migrated ASP .NET MVC 4 project.  It was especially confusing for me because I already had a reference to &lt;code class=&quot;highlighter-rouge&quot;&gt;System.Data.Entity&lt;/code&gt; in my web project.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The type ‘System.Data.Objects.DataClasses.EntityObject’ is defined in an assembly that is not referenced. You must add a reference to assembly ‘System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’.     c:\tfs\trunk\Site\Views\Customers\Details.cshtml                19&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It turns out that for some reason the assembly information for &lt;code class=&quot;highlighter-rouge&quot;&gt;System.Data.Entity&lt;/code&gt; was not added to my &lt;code class=&quot;highlighter-rouge&quot;&gt;Web.config&lt;/code&gt; after I added the reference.  I tried removing and adding back the reference in my project with no success.  In order to get everything working again I had to manually add the assembly to my &lt;code class=&quot;highlighter-rouge&quot;&gt;Web.config&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Before trying to update your &lt;code class=&quot;highlighter-rouge&quot;&gt;Web.config&lt;/code&gt; manually you should install the EntityFramework NuGet package in your project.  If that doesn’t work, then try the solution below.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3866587.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
    &lt;system.web&gt;
      &lt;compilation debug=&quot;true&quot; targetFramework=&quot;4.0&quot;&gt;
        &lt;assemblies&gt;
          &lt;add assembly=&quot;System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot; /&gt;
        &lt;/assemblies&gt;
      &lt;/compilation&gt;
    &lt;/system.web&gt;
&lt;/noscript&gt;
</content>
 </entry>
 
 <entry>
   <title>Take the job that gives you more responsibility</title>
   <link href="http://robertgreiner.com/2012/10/take-the-job-with-more-responsibility/"/>
   <updated>2012-10-08T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/10/take-the-job-with-more-responsibility</id>
   <content type="html">&lt;p&gt;When trying to decide whether or not to accept the offer for my current job, a good friend of mine gave me some simple advice I will never forget &lt;strong&gt;“Take the one that gives you the most responsibility.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As humans, we share a universal craving of needing to feel needed.  In order to be happy in our current situation whether at work, home, or on a sports team we need to feel like we are depended on and that our hard work is being appreciated by the rest of the group.&lt;/p&gt;

&lt;p&gt;Taking on a job with increased responsibility can be the difference between doing work and doing &lt;em&gt;meaningful work&lt;/em&gt;.  Doing meaningful work gives you a sense of accomplishment and pride in your life that is hard to find elsewhere.&lt;/p&gt;

&lt;p&gt;Next time you are contemplating a job change it might be  worth your time to consider the increase in responsibility you will be gaining in addition to salary, title, commute length, etc. If want more responsibility in your current position and don’t want to leave, you might want to try &lt;a href=&quot;http://robertgreiner.com/2012/09/work-yourself-out-of-a-job/&quot;&gt;working yourself out of a job&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Manage Your Meeting Size</title>
   <link href="http://robertgreiner.com/2012/10/manage-your-meeting-size/"/>
   <updated>2012-10-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/10/manage-your-meeting-size</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Who you invite to a meeting is just as important as who you leave out.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As Humans, we’re obsessed with inviting people to meetings.  This is true partly because we don’t want to hurt John’s feelings by excluding him from the next brainstorming session and partly because we are too lazy to figure out whether or not Suzy will be able to contribute anything at all.  So, predictably, we just add them and move on with our day.  After all, how much damage could &lt;em&gt;a few&lt;/em&gt; extra people do?&lt;/p&gt;

&lt;p&gt;The problem with this line of thought is that adding more headcount to your meeting invite list will geometrically increase the total number of communication paths that touch everyone in the same room as you.&lt;/p&gt;

&lt;p&gt;For instance, If your meeting only has five people in it, then there exists a manageable ten total separate lines of communication to deal with.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2012/graph-five.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/graph-five.png&quot; alt=&quot;There are ten communication edges in a five person graph&quot; title=&quot;Five Node Graph&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, if you end up inviting John and Suzy, then you have a whopping 21 lines of communication to deal with.  Thanks guys!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2012/graph-seven.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/graph-seven.png&quot; alt=&quot;There are twenty one communication edges in a seven person graph&quot; title=&quot;Seven Node Graph&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, this level of progression can get out of hand very quickly.  The added increase in communication complexity can easily squash your ability to accomplish anything meaningful before your meeting even starts. To avoid this, try and determine ahead of time who will be useful in a meeting and who won’t.&lt;/p&gt;

&lt;p&gt;As a rule of thumb, I try to keep my meetings to seven or less.  Anything over that and the quality of communication breaks down rapidly.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dealing With Change</title>
   <link href="http://robertgreiner.com/2012/10/dealing-with-change/"/>
   <updated>2012-10-03T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/10/dealing-with-change</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;“The only constant is change.” -Heraclitus&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Scope change during the life of a project is inevitable, there’s just no way around it.  No matter how much planning and preparation you do or how smart you are, you are guaranteed that a wrench will be thrown into your well-oiled project plan at some point.  Since change is such a constant occurrence, what do we do about it?&lt;/p&gt;

&lt;p&gt;We need to know how to handle change when it rears its ugly predictably unpredictable head.  Based on Fergus O’Connell’s book &lt;em&gt;&lt;a href=&quot;http://www.amazon.com/What-Need-about-Project-Management/dp/0857081314/&quot;&gt;What you Need to Know about Project Management&lt;/a&gt;&lt;/em&gt; there are really only three sensible options for responding to a change in any project.&lt;/p&gt;

&lt;h4 id=&quot;use-contingency&quot;&gt;Use Contingency&lt;/h4&gt;

&lt;p&gt;If someone asked me to name one thing that all successful projects have in common, I would answer &lt;strong&gt;contingency&lt;/strong&gt; without giving it a second thought.  Contingency is the single most important tool you have in your project management tool-bag to ensure the success of a project.  Contingency time and resources allow you to nimbly respond to change in a project in an accommodating way.&lt;/p&gt;

&lt;p&gt;Contingency should be used when you receive a reasonable change request for your project, it doesn’t exist to satisfy the whims of an overzealous management team or user base.  You must guard your contingency time with the same fervor as you would water in a desert.  Use it to survive and endure so you can make your project a success.&lt;/p&gt;

&lt;h4 id=&quot;update-schedule&quot;&gt;Update schedule&lt;/h4&gt;

&lt;p&gt;Some changes are so large that there simply aren’t enough time and resources allocated to the project to successfully complete what is being requested.  If this happens, the schedule must be updated to reflect this new request.  Deadlines should be  extended or features must be cut in order to accommodate the new change.&lt;/p&gt;

&lt;p&gt;The most common argument against updating the schedule is that it is somehow &lt;em&gt;not an option&lt;/em&gt;.  I would argue that this is unequivocally not true for 99% of cases out there.  If you find yourself in this sort of stalemate, it might be &lt;a href=&quot;http://robertgreiner.com/2012/07/if-you-are-unhappy-then-leave/&quot;&gt;time to look for a new job&lt;/a&gt;.  Taking on impossible projects can be disastrous on your health and relationships, it’s only  a matter of time before the burnout sets in and does its damage.&lt;/p&gt;

&lt;h4 id=&quot;brute-force-effort&quot;&gt;Brute Force Effort&lt;/h4&gt;

&lt;p&gt;This the most common option selected by project managers and also the most dangerous.  Brute Force Effort is most certainly a valid option when responding to change and sometimes it is your only option given that the previous two have been exhausted.  However, you should make sure to evaluate all of your other options before brute forcing your way through a change in project scope.&lt;/p&gt;

&lt;h4 id=&quot;special-bonus-option-no&quot;&gt;Special bonus Option: No&lt;/h4&gt;

&lt;p&gt;Sometimes people make unreasonable requests of your project that will end up hurting more than they will help.  In this case, it is perfectly acceptable to say no and move on.  Jason Fried of &lt;a href=&quot;http://37signals.com&quot;&gt;37signals&lt;/a&gt; is just as proud of what his software &lt;em&gt;doesn’t do&lt;/em&gt; as he is of what his software does.  Make sure you aren’t going to effectively shoot yourself in the foot by agreeing to something that violates your core values.&lt;/p&gt;

&lt;p&gt;Remember, this is &lt;em&gt;your&lt;/em&gt; project.  Nobody on the entire planet knows as much about your project as you do.  Make sure you use that to your advantage when making decisions that affect its fate.&lt;/p&gt;

&lt;h4 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;In business, what is true today will not always be true tomorrow.  People change their minds constantly, new markets emerge and die out quicker than ever before, and new technologies change the way we live our lives every day.  It is impossible to predict the future and we shouldn’t expect otherwise when planning a project.&lt;/p&gt;

&lt;p&gt;Change is something that should be embraced not feared.  When something changes it means  you get the opportunity to move in a new direction and solve problems that matter.  However, just because something in a project changes, doesn’t mean you have to kill yourself in order to succeed.  Build your contingency plan and use it if necessary or update your schedule to accommodate large changes before you try going into hero mode.&lt;/p&gt;

&lt;p&gt;If you receive a change request of any size &lt;a href=&quot;http://robertgreiner.com/2012/08/ill-look-into-it/&quot;&gt;look into it&lt;/a&gt; and come up with the best option outlined above to help guide your project to success.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Getting ahead early matters</title>
   <link href="http://robertgreiner.com/2012/09/getting-ahead-early-matters/"/>
   <updated>2012-09-26T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/09/getting-ahead-early-matters</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;“Once a team finds itself ahead of schedule it will try to get even more ahead of schedule.” -Fergus O’Connell&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Projects that are ahead of schedule are magical. Everyone has a relatively low level of stress and it is likely that you will consistently make it home for dinner on a nightly basis.  Projects like this also have a great effect on morale, the people on these projects will instinctively want to push the envelope and get the project done even quicker.  As project leaders, we need to do everything in our power to get our projects in this state as soon as possible and keep them there as long as we can.  Easier said than done, I know.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“How does a project get to be a year behind schedule? One day at a time.” -Fred Brooks&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On the other hand, a project that is behind schedule feels like massive credit card debt.  It is constantly weighing on your mind, making it increasingly difficult to recover.  When projects get in this state morale declines, stress increases, innovation screeches to a halt,  and the schedule just keeps slipping and slipping.&lt;/p&gt;

&lt;p&gt;Unfortunately, there is no magic bullet when it comes to running projects, nothing guarantees success.  However,  taking steps to structure your next project in such a way that it maximizes the chances of getting ahead of schedule early could pay huge dividends in the end.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>If Everything is Important, Then Nothing Is</title>
   <link href="http://robertgreiner.com/2012/09/if-everything-is-important-nothing-is/"/>
   <updated>2012-09-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/09/if-everything-is-important-nothing-is</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;“If everything is important, then nothing is.” ― Patrick Lencioni&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It seems like every two weeks I end up shifting my focus of self-study from one area to another.  One day I’ll develop an intense interest in &lt;a href=&quot;https://github.com/robertgreiner/Recommender&quot;&gt;Collective Intelligence&lt;/a&gt;, work on it for a little bit and then move on to something else completely unrelated.  I don’t do this because I get bored with a particular topic, rather I end up getting distracted by some other shiny new idea and immediately jump ship to go work on it.&lt;/p&gt;

&lt;p&gt;The same method of thinking can be observed in the business world as well.  The engineering group may want to increase resources in order to develop better technology while the marketing group may want to use those same resources to attract more customers.  Meanwhile, there are the finance, operations, sales, and customer support groups with their own sets of priorities and goals.  If everyone’s priorities are treated equally then creating any sort of meaningful goals around growth, revenue, etc. will ultimately implode under the sheer weight of the demands of each group or become so meaningless that their benefits would be negligible even if each goal was achieved.&lt;/p&gt;

&lt;p&gt;We all do this more often than we’d care to admit and I think it’s because we don’t prioritize correctly.  When we are setting goals for ourselves or our organization we typically list out all of the things we want to get better at and stop there.  Sure, we may start working on the first item on the list that we feel is most important at the time but since that priority was set arbitrarily on a hunch, we will end up dropping it next week/month for something that we &lt;em&gt;feel&lt;/em&gt; is more important.&lt;/p&gt;

&lt;p&gt;I think there is a relatively simple solution to this problem.  First, we must come to the realization that &lt;em&gt;if everything is important, then nothing is&lt;/em&gt; and prioritize accordingly.  Once we can get past this notion, we can gain some clarity on what exactly we should be working on.  After all, do I really &lt;em&gt;need&lt;/em&gt; to know about Collective Intelligence right now, or would it make more sense for me to spend my time improving my public speaking skills?  Or, does the company need to focus on attracting new customers when they are already having trouble satisfying their existing ones?&lt;/p&gt;

&lt;p&gt;Achieving a single goal is difficult enough as it is, find the one that makes the most sense and go after it with 100% of your effort.  Once you succeed there, move on to the next one.  Rinse and repeat.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Work Yourself Out of a Job</title>
   <link href="http://robertgreiner.com/2012/09/work-yourself-out-of-a-job/"/>
   <updated>2012-09-21T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/09/work-yourself-out-of-a-job</id>
   <content type="html">&lt;p&gt;Some of the best advice that I’ve received in my career is that whatever job position you find yourself in, you should always be trying to &lt;strong&gt;work yourself out of a job&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In a nutshell, working yourself out of a job means building up your team in such a way that someday you could walk away from your project and everything would continue running normally without a hitch.  In order to do this you must invest greatly in your team.  You must push and inspire them to grow and improve their skill set.  You must keep them from becoming demotivated and complacent.&lt;/p&gt;

&lt;p&gt;In the process of working yourself out of a job, you also need to focus on working yourself into the next job.  Now, this isn’t a cheap way of suggesting that you should always be looking for promotions and more money.  The idea here is to simultaneously delegate away some responsibilities in order to take on additional more important ones.  In other words, &lt;strong&gt;trade-up&lt;/strong&gt; for tasks that provide more value or have more visibility.  Sometimes, this means taking on tasks that nobody else wants to do but it’s the only way to ensure you are positioning yourself for the future and aren’t simply training your replacement.&lt;/p&gt;

&lt;p&gt;Working yourself out of a job is challenging.  It takes you out of your comfort zone and leaves you vulnerable.  However, the potential rewards are well worth the risk.  If you don’t agree with me, just consider the alternative approach of living in a world of job protection and CYA tactics year after year.&lt;/p&gt;

&lt;p&gt;You can get started today by delegating a task to a team member that is clamoring for some additional responsibility, recommending a good book, offering a colleague some helpful advice, or giving constructive feedback.&lt;/p&gt;

&lt;p&gt;Think about it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Happy Programmers' Day!</title>
   <link href="http://robertgreiner.com/2012/09/happy-programmers-day/"/>
   <updated>2012-09-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/09/happy-programmers-day</id>
   <content type="html">&lt;p&gt;Happy &lt;a href=&quot;http://en.wikipedia.org/wiki/Programmers'_Day&quot;&gt;Programmers’ Day&lt;/a&gt; to anyone who has ever written a line of code.  The world is a better place because you exist.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>404 Error when uploading large files into Windows Azure</title>
   <link href="http://robertgreiner.com/2012/08/404-error-when-uploading-large-files-in-windows-azure/"/>
   <updated>2012-08-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/08/404-error-when-uploading-large-files-in-windows-azure</id>
   <content type="html">&lt;p&gt;I tried to upload a 30MB file into Windows Azure today using my MVC 4 site.  When the file got to 99% I got a 404 error saying that my upload Action was nowhere to be found.  Fortunately, I successfully uploaded a file earlier in the day at about half the size, so I knew the site wasn’t completely broken.&lt;/p&gt;

&lt;p&gt;If you are experiencing this error, chances are you already tested uploading large files locally and realized that you need something like this in your Web.config for everything to work:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3407908.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
    &lt;system.web&gt;
        &lt;httpRuntime maxRequestLength=&quot;1073741824&quot; requestValidationMode=&quot;2.0&quot; /&gt;
    &lt;/system.web&gt;
&lt;/noscript&gt;

&lt;p&gt;However, what nobody tells you, is that Windows Azure (i.e. IIS 7) looks at a &lt;em&gt;completely different&lt;/em&gt; configuration setting for uploading files.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3407913.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
    &lt;system.webServer&gt;
      &lt;security&gt;
        &lt;requestFiltering&gt;
          &lt;requestLimits maxAllowedContentLength=&quot;1073741824&quot; /&gt;
        &lt;/requestFiltering&gt;
      &lt;/security&gt;
    &amp;lt;/system.WebServer&amp;gt;
&amp;lt;/noscript&amp;gt;

Adding this additional configuration option will ensure your large file uploads work locally and in the cloud.  Just in time for the next release.
&lt;/system.webServer&gt;&lt;/noscript&gt;
</content>
 </entry>
 
 <entry>
   <title>Get The Right People in the Room</title>
   <link href="http://robertgreiner.com/2012/08/get-the-right-people-in-the-room/"/>
   <updated>2012-08-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/08/get-the-right-people-in-the-room</id>
   <content type="html">&lt;p&gt;I’m frequently surprised at the number of times a group of people set out to solve a problem and end up failing.  They fail not because they aren’t smart enough or talented enough or that they don’t work hard enough. They fail simply because they didn’t get the right people together to &lt;strong&gt;ask the right questions&lt;/strong&gt; ahead of time.  The team was set up to fail before the project even began.&lt;/p&gt;

&lt;p&gt;If you can’t ask the right questions, you can’t get to the right answers and you can’t ask the right questions without getting the right people in the room.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>One on One</title>
   <link href="http://robertgreiner.com/2012/08/one-on-one/"/>
   <updated>2012-08-16T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/08/one-on-one</id>
   <content type="html">&lt;p&gt;Employees across every industry aren’t improving at the rate they should.  In fact, some studies have shown that employee performance can actually decline as experience is gained.  The world’s workforce as a whole is becoming increasingly more disengaged each passing year which makes it difficult for some companies to simply survive, let alone innovate and improve.  The reason for this is that their skills are not being stretched through constant feedback and goal setting.&lt;/p&gt;

&lt;p&gt;At most companies, you only get feedback once a year, in your annual performance review.  This is an absolute joke.  Managers dread the monotony of creating reviews for each of their direct reports, sifting through months of data and trying to put together something that won’t cause a riot.  Meanwhile, the team team members being reviewed have to live with the fear of being subjectively judged (against arbitrary and ambiguous goals that don’t even apply to their job) once a year dreading the performance review months before it is given and often remaining bitter about it months after.  “Gee, I wonder if my boss remembers those late hours I put in eight months ago in order to ship on time.”  Guess what, he doesn’t.&lt;/p&gt;

&lt;p&gt;Whether you’re a project manager, a team member, a director, or CFO there is one thing you should be doing: Having One on One meetings with your direct reports as well as the person you report directly to.  No exceptions.&lt;/p&gt;

&lt;p&gt;One on One meetings allow the manager and employee to sit down in a safe setting to discuss both what the employee can do to improve their performance as well as what the manager can do to help make those improvements happen.  These meetings are crucial to ensure that everyone is achieving their greatest potential, working towards the same goal, and are provided with all of the necessary resources required to succeed.&lt;/p&gt;

&lt;p&gt;Working your day-to-day job without constant feedback (hint: once a month is too long) is like trying to bowl blindfolded.  Sure, you can get up there and do your best to knock down a few pins, but all of your effort and hard work will never get you anywhere because you simply can’t see what you are doing and no-one is telling you what adjustments to make after each roll.&lt;/p&gt;

&lt;p&gt;If you are fortunate enough to be in a position with direct reports, then be a good leader and schedule some One on One time with each of your team members.  It will give you an opportunity to mentor and grow your team while showing them that you truly care about their individual success.&lt;/p&gt;

&lt;p&gt;If you are a team member, be proactive and take control of your career by scheduling One on One time with your manager.  This will demonstrate that you care about your career and that you are working actively to manage it.&lt;/p&gt;

&lt;p&gt;Getting constant and frequent feedback on our performance goals is the only way to improve.  One on One meetings allow a structured setting to ensure that the appropriate level of feedback is being given and will help keep teams on track.&lt;/p&gt;

&lt;p&gt;If we trained our Olympians like we train our employees we would be in serious trouble.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Stay off of the Critical Path</title>
   <link href="http://robertgreiner.com/2012/08/stay-off-of-the-critical-path/"/>
   <updated>2012-08-14T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/08/stay-off-of-the-critical-path</id>
   <content type="html">&lt;p&gt;When you are running a project -especially with a small team- you will likely be required to complete some actual project work outside of your PM responsibilities (oh no!)  This can be either a blessing or a curse depending on how you handle it.&lt;/p&gt;

&lt;p&gt;The key here is to identify tasks that are not too large that you can’t complete them in a reasonable time frame and, more importantly, &lt;strong&gt;are not part of the critical path&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Taking on work that is part of the critical path introduces unnecessary risk into your project.  If you start working on something in the critical path and then suddenly get pulled away into another project related issue with higher priority you will either have to delay completion of your task or ramp up someone else to do it.  Either way, this will introduce a major roadblock in the successful completion of your project and should be avoided whenever possible.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“How do I know if what I am planning to do is on the critical path?&lt;/em&gt;” You ask?  Generally speaking, it is anything that will cause a delay in the project’s schedule if it is not complete by a specific time, typically due to dependencies on other tasks.&lt;/p&gt;

&lt;p&gt;I would argue that even if you are the subject matter expert in a given area, and feel that you &lt;em&gt;must&lt;/em&gt; be the one to complete the task, you shouldn’t  if it is part of the critical path.  This is a great opportunity to mentor another member of your team and let them step up to a new set of responsibilities and expertise.  This way, you can provide integral oversight on the task while freeing yourself up to handle other project management related issues.&lt;/p&gt;

&lt;p&gt;It is important for project managers to do actual project work in any industry in order to stay sharp and relevant.  Staying off of the critical path allows you to remain productive and make a fair contribution to the project while giving you the flexibility to handle any high priority project-related issues that arise.&lt;/p&gt;

&lt;p&gt;Poorly managed projects can be disastrous for everyone involved including the business, so it’s important that we allocate enough of our time to ensure the project is run well.  Part of this is the ability to identify tasks that you should not work on and delegate them to capable team members.  Delegating effectively and avoiding the critical path will go a long way towards the successful delivery of your project.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Quote: You will be in the exact same position next year except for the books you read and the people you meet.</title>
   <link href="http://robertgreiner.com/2012/08/books-and-people/"/>
   <updated>2012-08-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/08/books-and-people</id>
   <content type="html">&lt;p&gt;This was part of a talk in one of the on-boarding presentations at work and it really stuck with me, so I thought I’d share.&lt;/p&gt;

&lt;p&gt;Both good books and good people change lives. Why wouldn’t you want to know more of both?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>I'll look into it</title>
   <link href="http://robertgreiner.com/2012/08/ill-look-into-it/"/>
   <updated>2012-08-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/08/ill-look-into-it</id>
   <content type="html">&lt;p&gt;Transitions are awkward and difficult in every stage of life whether you are trying to move from crawling to walking, high-school to college, or from one job to the next.  In the case of transitioning between software developer and project manager there will be several painful &lt;em&gt;moments of transition&lt;/em&gt; that you will experience.  That being said, there is one thing you need to learn how to say right off the bat in order to help alleviate some of the pain:  &lt;strong&gt;“I’ll look into it”&lt;/strong&gt;.  These are the four most important words you can learn in your early stages of leading a team.&lt;/p&gt;

&lt;p&gt;As software developers and craftsmen we tend to do two things really well.   We are really good at solving problems and we possess a high level of professional pride.  As a result, when we are in meetings with customers and they ask &lt;em&gt;“Hey, will feature X be included in the next release?”&lt;/em&gt; We will typically -without much thought at all- say “yes”, especially if the request is reasonable.&lt;/p&gt;

&lt;p&gt;Saying “yes” is so easy.  It makes everyone happy and makes you look nimble and agreeable.  Worse yet, if you are taking advantage of Agile development, you get to add the new feature to the backlog and worry about prioritizing it later.  Out of sight, out of mind.  This will likely require us take on more than we can handle which can cripple the team and force everyone scramble to catch back up.  Saying “yes” too quickly can potentially derail an otherwise successful project.&lt;/p&gt;

&lt;p&gt;Any situation where a user or your boss asks you to do something, whether it is  adding scope to your existing project or taking on some other responsibility never say “yes” right away.  The next words out of your mouth should be &lt;strong&gt;“I’ll look into it”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Saying “I’ll look into it” allows you to remain in an agreeable state while simultaneously granting you the opportunity to investigate what exactly you are getting yourself into and make preparations accordingly.  I have found that the best thing to do is to ask until the end of the day/week to give an answer and have always been granted the extra time.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Why your story point estimations are too low</title>
   <link href="http://robertgreiner.com/2012/08/why-your-story-point-estimations-are-too-low/"/>
   <updated>2012-08-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/08/why-your-story-point-estimations-are-too-low</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;1, 2, 3, 5, 8, 13, 21, …, ∞&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think we can all agree that estimating story points is much easier in theory than it is in practice.  Usually, the difficulty in estimation comes from either a lack of knowledge/experience in story estimation or (worse yet) an inability to come together as a team to reach a consensus.&lt;/p&gt;

&lt;p&gt;One of the main issues that I constantly see over and over again when a team tries to estimate a particular story is the tendency to &lt;em&gt;drastically underestimate&lt;/em&gt; the complexity.  We all do it, we think we are smarter than we really are, or that a particular new feature can be implemented more quickly than it realistically can.  Even after the estimation process is over we tend to struggle equally as much when deciding how many stories we realistically think we can complete in an iteration.&lt;/p&gt;

&lt;p&gt;I think one of the primary reasons that our point estimates are notoriously low is that &lt;strong&gt;we do not account for communication complexity&lt;/strong&gt;.  We always focus on how hard the problem is from a technical perspective and completely ignore everything else.&lt;/p&gt;

&lt;p&gt;To illustrate my point, I will share an experience from my previous project.  The first two iterations were geared specifically towards building a greenfield ASP .NET MVC 4 application.  This is something several people on the team were famaliar with and, as a result, the story estimations were exceptionally accurate.  We ended up making every one of our velocity goals and the entire project went swimmingly through the completion of the site.&lt;/p&gt;

&lt;p&gt;However, once we got to the tasks that required interaction with resources outside of our group  we effectively saw our velocity grind to a halt.  We were wasting oceans of time running around trying  to coordinate efforts between groups to try and complete tasks that –from a technical standpoint– were far easier than most of the work we did on the initial web site.&lt;/p&gt;

&lt;p&gt;We hit this issue because &lt;em&gt;we were not properly considering the communication complexity associated with a particular story&lt;/em&gt;, only the technical complexity.  If we had taken a few steps back when estimating each story and identified which resources we would need to interact with outside of our group, then we would have given each of those stories a much higher points estimate even though they were easier in nature.  This would have allowed us to use our previous velocity to better estimate the number of tasks we could complete in an iteration and saved everyone involved a ton of frustration.&lt;/p&gt;

&lt;p&gt;For some teams, this might seem daunting since the story estimation process is already so tedious and painful that you couldn’t imagine adding anything else to the process.  If this describes your situation, then I would suggest starting out by implementing a generic rule of thumb that any story which requires effort by someone outside of your group gets an automatic bump to the next fibonicci number.  By doing this you will create an objective requirement that everyone can follow and it could end up meaning the difference between the success and failure of a project in the long run.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Entity Framework&#58; There is already an open DataReader associated with this Command which must be closed first.</title>
   <link href="http://robertgreiner.com/2012/07/entity-framework-open-datareader-associated-with-command/"/>
   <updated>2012-07-16T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/07/entity-framework-open-datareader-associated-with-command</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;EntityCommandExecutionException
{“There is already an open DataReader associated with this Command which must be closed first.”}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get this error when your DataContext tries to retrieve a collection of objects from the database and then subsequently tries to write to an object in the same connection.&lt;/p&gt;

&lt;p&gt;For 99% of the cases, you will be able to resolve this issue by wrapping your DataContext in a &lt;code class=&quot;highlighter-rouge&quot;&gt;using&lt;/code&gt; block:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/3123425.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
    IEnumerable&lt;Customer&gt; customers;
    using (var ctx = new CustomerContext())
    {
      customers = ctx.AwesomeCustomers;
    }

    //Do this outside of the using block.
    UpdateCustomerData(customers);
&amp;lt;/noscript&amp;gt;

However, this may not be an option for you if you are working on a particularly complicated project that leverages the  Repository Pattern (or something similar) and shares a single DataContext instance throughout the object.  If this is the case for you, then you need to make sure you force the DataContext object to completely finish the read operation before you try writing.

&lt;script src=&quot;https://gist.github.com/3123434.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
    var customers = customerRepository.GetAwesomeCustomers().ToList();
    UpdateCustomerData(customers);
&lt;/noscript&gt;

`ToList()` forces the DataContext to complete the read operation, freeing the connection up to perform another action.
&lt;/Customer&gt;&lt;/noscript&gt;
</content>
 </entry>
 
 <entry>
   <title>What to do if you are unhappy at your job</title>
   <link href="http://robertgreiner.com/2012/07/if-you-are-unhappy-then-leave/"/>
   <updated>2012-07-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/07/if-you-are-unhappy-then-leave</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Choose a job you love, and you will never have to work a day in your life.&lt;br /&gt;
&lt;em&gt;-Confucius&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Being a programmer/developer/software engineer is great. We get to do something we love in an industry that is only decades old.  We can do things that very few people in on this planet can do and even fewer can do well.  We get to be both artists and scientists.  We get to create things that hundreds, thousands, or millions of people use.  We get to solve problems that improve the lives of other people.  &lt;strong&gt;We get to turn abstract thought into something concrete and usable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All that being said, I’m constantly astonished at the number of posts online these days about developers who are unhappy at their job,  truly unhappy.  After reading some of the stories out there it’s a wonder how some people keep from living in a constant state of depression.  The fact that some managers and/or co-workers can manage to negatively affect the lives of their colleagues at such an extreme level boggles the mind.&lt;/p&gt;

&lt;p&gt;And, even more astonishing is the fact that most of us (I’ve been there before also) put up with it!  We feel like we are stuck where were are and there couldn’t possibly be anything better out there for us.  It’s almost as if we’ve contracted some special strain of Programmer’s Stockholm Syndrome.&lt;/p&gt;

&lt;p&gt;So here’s the deal, if you are unhappy at your job &lt;strong&gt;then leave&lt;/strong&gt;, it’s that simple.  There are plenty of really excellent companies out there doing fantastic and exciting work that are just clamoring for someone talented like you.&lt;/p&gt;

&lt;p&gt;When you are unhappy at your job, it affects your entire life.  Strife at the workplace can impact your physical and emotional health, your ability to get passionate and excited about things (even outside of work), and worst of all, it can hurt your relationships with friends and family.&lt;/p&gt;

&lt;p&gt;Life is way to short to get stuck doing something you don’t enjoy.  If you find your wellbeing negatively impacted by your job then it may be time to move on to something better.  If you are at this point or at least think you are,  I’d recommend that you 
&lt;a href=&quot;http://positivesharing.com/2007/06/find-your-quitting-point/&quot;&gt;find your quitting point&lt;/a&gt; and &lt;a href=&quot;http://www.codinghorror.com/blog/2012/03/how-to-hire-a-programmer.html&quot;&gt;learn what other companies are looking for out of a candidate&lt;/a&gt; before taking the leap.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Beware The Second System Effect</title>
   <link href="http://robertgreiner.com/2012/07/the-second-system-effect/"/>
   <updated>2012-07-14T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/07/the-second-system-effect</id>
   <content type="html">&lt;p&gt;In &lt;a href=&quot;http://www.amazon.com/The-Mythical-Man-Month-Engineering-Anniversary/dp/0201835959/ref=sr_1_1?ie=UTF8&amp;amp;qid=1342273346&amp;amp;sr=8-1&amp;amp;keywords=the+mythical+man+month&quot;&gt;The Mythical Man Month&lt;/a&gt;  Fred Brooks discusses the idea of &lt;strong&gt;The Second System Effect&lt;/strong&gt;.  The Second System Effect is the tendency for a project manager or software architect to err on the side of overembellishment when planning their second project. In large part, this is due to the fact that the architect has to exercise a great deal of willpower during the first project by keeping scope under control while constantly thinking about all of the really great things they want to add to the next project.  Personally, I think the perils of The Second System Effect can exist well beyond your second project and this is something we always have to be on guard against.&lt;/p&gt;

&lt;p&gt;As an architect, your early projects will be like quicksand.  They will pull at you in ways that you haven’t experienced before and it is important to have an anchor that can keep you grounded and on track.  This is why it is imperative that you seek out the mentorship of someone more experienced and smarter than you to help guide you through your early projects.  A good project mentor will provide a safe place for you to express your thoughts and ideas about a project and they will give you honest, candid, and sometimes difficult feedback.&lt;/p&gt;

&lt;p&gt;If you are relatively new to software architecture or managing software projects, I think that this is an extremely important concept to keep in the back of your mind, even after your second system ships.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Why is inserting data into Azure Table Storage so slow?</title>
   <link href="http://robertgreiner.com/2012/06/why-is-azure-table-storage-so-slow/"/>
   <updated>2012-06-28T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/06/why-is-azure-table-storage-so-slow</id>
   <content type="html">&lt;p&gt;I am working on a project where we are evaluating whether or not to move from SQL Azure (or whatever it’s called this week) to Azure Table Storage.&lt;/p&gt;

&lt;p&gt;When I started evaluating the performance of inserting data into Table Storage I was astonished to see how slowly things were moving.  I was only able to insert around 400 rows per minute which was nowhere near the bandwidth I needed for my project.&lt;/p&gt;

&lt;p&gt;Before declaring failure, I decided to do a little bit of research to figure out why things were going so slowly for me and instantly found the problem: &lt;a href=&quot;http://en.wikipedia.org/wiki/Nagle's_algorithm&quot;&gt;Nagle’s Algorithm&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nagle’s algorithm works by combining a number of small outgoing messages, and sending them all at once. Specifically, as long as there is a sent packet for which the sender has received no acknowledgment, the sender should keep buffering its output until it has a full packet’s worth of output, so that output can be sent all at once.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It turns out that Nagle’s algorithm is enabled by default in C# and can significantly slow down communications in applications that send several small messages and TCP Delayed ACKs.&lt;/p&gt;

&lt;p&gt;Luckily for us, we can simply disable Nagle’s algorithm in our project.  The easiest way to accomplish this is to disable Nagling for every service point.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ServicePointManager.UseNagleAlgorithm = false;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If this isn’t an option for you due to an existing production deployment, then you can disable Nagle’s algorithm specifically for Table Storage.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;var storageAccount = CloudStorageAccount.Parse(connectionString);
ServicePoint tableServicePoint = ServicePointManager.FindServicePoint(account.TableEndpoint);
tableServicePoint.UseNagleAlgorithm = false;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; It is important to turn Nagle’s algorithm off &lt;em&gt;before&lt;/em&gt; you make your first call to blob, table, and queue storage, otherwise the setting will not get applied.&lt;/p&gt;

&lt;p&gt;By simply disabling Nagle’s algorithm, I was able to gain a significant improvement in performance when dealing with Azure Table Storage.  Hopefully, this will speed up things on your end as well.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The AudienceRestrictionCondition was not valid because the specified Audience is not present in AudienceUris</title>
   <link href="http://robertgreiner.com/2012/06/the-audience-restriction-condition-was-not-valid/"/>
   <updated>2012-06-14T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/06/the-audience-restriction-condition-was-not-valid</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;ID1038: The AudienceRestrictionCondition was not valid because the specified Audience is not present in AudienceUris.
Audience: ‘http://localhost:54012’&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You will get this error when your &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;audienceUris&amp;gt;&lt;/code&gt; section  in your Web.config is invalid.  You need to add the value that is attached to your WIF configuration.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2933404.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
`&lt;microsoft.identityModel&gt;
  &lt;service&gt;
    &lt;audienceUris&gt;
      &lt;add value=&quot;https://localhost:54012/&quot; /&gt;
    &lt;/audienceUris&gt;
  &lt;/service&gt;
&lt;/microsoft.identityModel&gt;`
&lt;/noscript&gt;

&lt;p&gt;Here is the rest of the Stack Trace if it helps:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2933379.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException: ID1038: The AudienceRestrictionCondition was not valid because the specified Audience is not present in AudienceUris.
Audience: 'http://localhost:54012'

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


`[AudienceUriValidationFailedException: ID1038: The AudienceRestrictionCondition was not valid because the specified Audience is not present in AudienceUris.
Audience: 'http://localhost:54012']
   Microsoft.IdentityModel.Tokens.SamlSecurityTokenRequirement.ValidateAudienceRestriction(IList`1 allowedAudienceUris, IList`1 tokenAudiences) +1295
   Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateConditions(Saml2Conditions conditions, Boolean enforceAudienceRestriction) +2393
   Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateToken(SecurityToken token) +776
   Microsoft.IdentityModel.Tokens.SecurityTokenHandlerCollection.ValidateToken(SecurityToken token) +279
   Microsoft.IdentityModel.Web.TokenReceiver.AuthenticateToken(SecurityToken token, Boolean ensureBearerToken, String endpointUri) +261
   Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.SignInWithResponseMessage(HttpRequest request) +816
   Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +367
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp;amp; completedSynchronously) +75`
&lt;/noscript&gt;
</content>
 </entry>
 
 <entry>
   <title>A review of Outliers&#58; The Story of Success</title>
   <link href="http://robertgreiner.com/2012/05/outliers-the-story-of-success-review/"/>
   <updated>2012-05-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/05/outliers-the-story-of-success-review</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;outlier&lt;/strong&gt;: a statistical observation that is markedly different in value from the others of the sample -Mirriam-Webster&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/outliers.png&quot; class=&quot;left&quot; title=&quot;Outliers: The Story of Success&quot; alt=&quot;Outliers: The Story of Success&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We observe human outliers on a daily basis whether we are watching the exceptional athletes competing in the NBA or Stanley Cup Finals, reading about &lt;a href=&quot;https://www.facebook.com/zuck/posts/10100318398827991&quot;&gt;the latest billion dollar company&lt;/a&gt;, admiring a sketch by M.C. Escher, or listening to the works of Mozart or Bach.&lt;/p&gt;

&lt;p&gt;However, one interesting aspect of the whole phenomenon of outliers is that for every breakout success there are droves of other people who are smarter, stronger, and more talented than their successful peers.  Why is that?  Shouldn’t the kids growing up with the highest IQ and most &lt;em&gt;raw talent&lt;/em&gt; end up being the most successful?&lt;/p&gt;

&lt;p&gt;Now, if I asked you list what traits virtually all of the most successful people in this world share, you would probably give me two answers: &lt;strong&gt;raw talent&lt;/strong&gt; and &lt;strong&gt;hard work&lt;/strong&gt;.  And, according to &lt;em&gt;Outliers&lt;/em&gt; you’d be  2/3 correct.  &lt;em&gt;Outliers&lt;/em&gt; shows us that there is an equally important and criminally overlooked third piece in the story of a person’s success: &lt;strong&gt;opportunity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s not enough if we are genius smart, great at playing guitar, or ten feet tall if we are not given an opportunity to succeed.  Why was Bill Gates so successful?  Well, he’s obviously a genius, and he is definitely a hard worker.  But, what most people don’t know is that Gates was given a huge advantage in his youth; early access to a computer. Bill Gates’ parents &lt;em&gt;happened&lt;/em&gt; to put him in one of the only high schools (if not only) in the country that had access to a mainframe terminal.  As a result Bill got a mammoth head start on programming and hit his &lt;a href=&quot;http://www.gladwell.com/outliers/outliers_excerpt1.html&quot;&gt;10,000 hours&lt;/a&gt; very early.&lt;/p&gt;

&lt;p&gt;These facts, brought to light, have some very serious implications.  Especially centered around the opportunity our children get while growing up.  For instance, if you start assessing the potential of a child too early on, and you have children in your group that could be up to 12 months older than others, the older kids will immediately look better than their younger counterparts almost every time.  This is why, for instance, most Canadian born hockey players are born in the first few months of the year.  It all stems back to the cut-off date for pee-wee hockey.  If your child is 10 years 0 months old and joins a team full of kids 10 years and 11 months old, you had better believe that he is going to get overlooked right out of the gate.  He’ll never be given a chance to succeed.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Every day we make decisions on who gets to succeed and who doesn’t without even realizing it.  -Malcom Gladwell&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Outliers&lt;/em&gt; is a fantastic eye-opening book that has real life applications for any reader at any stage of life.  I would definitely recommend you add it to your summer reading list.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>System Center Operations Manager&#60; Storage Account for Windows Azure Could Not be Discovered</title>
   <link href="http://robertgreiner.com/2012/05/system-center-operations-manager-windows-azure-storage-account-error/"/>
   <updated>2012-05-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/05/system-center-operations-manager-windows-azure-storage-account-error</id>
   <content type="html">&lt;p&gt;I was trying to get System Center Operations Manager (SCOM) to monitor my Windows Azure subscription using the &lt;a href=&quot;http://blogs.msdn.com/b/walterm/archive/2011/02/14/adding-azure-application-monitoring-to-scom-2007-r2.aspx&quot;&gt;SCOM Windows Azure Management Pack&lt;/a&gt; and ran into an interesting error when SCOM tried to connect to my Windows Azure storage account.&lt;/p&gt;

&lt;p&gt;When I first started my Azure development project, I let Visual Studio create my Windows Azure storage connection string through the &lt;code class=&quot;highlighter-rouge&quot;&gt;Configuration&lt;/code&gt; properties within the Windows Azure Web Role.  This automatically inserted the following configuration setting in my &lt;code class=&quot;highlighter-rouge&quot;&gt;ServiceConfiguration.cscfg&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;Setting name=&quot;Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString&quot; value=...&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is all fine and dandy, except when you try to set up System Center Operations Manager using the Windows Azure Management Pack, the default connection string won’t work because SCOM is looking for a connection string with a different name.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Storage account for Windows Azure Diagnostics could not be discovered because the configuration setting named ‘DiagnosticsConnectionString’ does not exist in the service configuration file or does not contain the storage account information.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Subscription ID: ffffffff-ffff-ffff-ffff-ffffffffffff Service name: hosted_service Deployment slot: Production Role name: WindowsAzureProject&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Workflow name: Microsoft.SystemCenter.Azure.HostedService.TotalDiscovery.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Instance name: azureinstance Instance ID: {FFFFFFFF-FFFF-FFFF-3333-123456789012} Management group: SCOM_QA&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you are trying to monitor your Windows Azure subscription using SCOM and see this error, either rename your existing Windows Azure storage account connection string, or add a duplicate connection string named &lt;code class=&quot;highlighter-rouge&quot;&gt;DiagnosticsConnectionString&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;Setting name=&quot;DiagnosticsConnectionString&quot; value=&quot;&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After setting this up, SCOM should start grabbing your event log information from your Windows Azure subscription.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Unable to update database to match the current model because there are pending changes.</title>
   <link href="http://robertgreiner.com/2012/05/unable-to-update-database-to-match-the-current-model-pending-changes/"/>
   <updated>2012-05-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/05/unable-to-update-database-to-match-the-current-model-pending-changes</id>
   <content type="html">&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Update-Database&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.
You can use the Add-Migration command to write the pending model changes to a code-based migration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This error occurs when you have pending changes in your database migrations that have not been added yet.  If you find this error staring you in the face during your programming adventures, simply type &lt;code class=&quot;highlighter-rouge&quot;&gt;Add-Migration&lt;/code&gt;.  This will take all of the database updates you have made (inadvertently or explicitly) since the last migration and add them to a new database migration file.&lt;/p&gt;

&lt;p&gt;Once your pending changes are all synced up, &lt;code class=&quot;highlighter-rouge&quot;&gt;Update-Database&lt;/code&gt; will work again.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using Entity Framework Database Migrations to Update a Remote SQL Azure Database</title>
   <link href="http://robertgreiner.com/2012/05/using-entity-framework-database-migrations-to-update-a-remote-database/"/>
   <updated>2012-05-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/05/using-entity-framework-database-migrations-to-update-a-remote-database</id>
   <content type="html">&lt;p&gt;I have been using .NET’s &lt;a href=&quot;http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx&quot;&gt;Entity Framework Database Migrations&lt;/a&gt; and SQL Azure on one of my current development projects which has been working out quite nicely for me.  However, I eventually got to the point in my development where it was time to package my Azure project and deploy it to the cloud.&lt;/p&gt;

&lt;p&gt;Before deploying my project, I needed to make sure my SQL Azure database matched what I had in SQLExpress on my local machine.  To do this, I leveraged my existing Database Migrations project by adding the connection string to my SQL Azure database subscription.&lt;/p&gt;

&lt;p&gt;First, I needed to clear out my existing migrations in the cloud (Run these commands through the &lt;code class=&quot;highlighter-rouge&quot;&gt;Package Manager Console&lt;/code&gt; in Visual Studio).&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2654720.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
Update-Database -TARGETMIGRATION:$InitialDatabase -StartUpProjectName &quot;ToTheCloud.Infrastructure&quot; -ConnectionString &quot;Server=tcp:&amp;lt;server_name&amp;gt;.database.windows.net,1433;Database=&amp;lt;database_name&amp;gt;;User ID=&amp;lt;db_user_name&amp;gt;@&amp;lt;server_name&amp;gt;;Password=&amp;lt;password&amp;gt;;Trusted_Connection=False;Encrypt=True;MultipleActiveResultSets=True;Max Pool Size=100;&quot; -ConnectionProviderName &quot;System.Data.SqlClient&quot;
&lt;/noscript&gt;

&lt;p&gt;Once that was finished, all I had to do was run the database migrations from the beginning to apply the most up-to-date version of my database in the cloud.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2654722.js&quot;&gt; &lt;/script&gt;

&lt;noscript&gt;
Update-Database -StartUpProjectName &quot;ToTheCloud.Infrastructure&quot; -ConnectionString &quot;Server=tcp:&amp;lt;server_name&amp;gt;.database.windows.net,1433;Database=&amp;lt;database_name&amp;gt;;User ID=&amp;lt;db_user_name&amp;gt;@&amp;lt;server_name&amp;gt;;Password=&amp;lt;password&amp;gt;;Trusted_Connection=False;Encrypt=True;MultipleActiveResultSets=True;Max Pool Size=100;&quot; -ConnectionProviderName &quot;System.Data.SqlClient&quot;
&lt;/noscript&gt;

&lt;p&gt;Now I’m free to deploy my Windows Azure package without fear of it blowing up when I access it for the first time.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to Enable Remote Desktop and Generate an Encrypted Password in Windows Azure</title>
   <link href="http://robertgreiner.com/2012/05/how-to-enable-remote-desktop-and-generate-an-encrypted-password-in-windows-azure/"/>
   <updated>2012-05-09T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/05/how-to-enable-remote-desktop-and-generate-an-encrypted-password-in-windows-azure</id>
   <content type="html">&lt;p&gt;It’s really not a matter of if, but when you will need to troubleshoot your Windows Azure deployment by using Remote Desktop to access one of your instances.&lt;/p&gt;

&lt;p&gt;This article will show you how to enable Remote Desktop connections on your Windows Azure subscription, generate a secure encrypted password for your Azure application, and connect to an individual instance after you deploy your Azure project to the cloud.&lt;/p&gt;

&lt;h3&gt;Configure Windows Azure&lt;/h3&gt;

&lt;p&gt;First, let’s enable Remote Desktop connections in our Windows Azure subscription.  In the Windows Azure Management Portal select deployed Web Role and click the &lt;code class=&quot;highlighter-rouge&quot;&gt;configure&lt;/code&gt; button at the top of your Management Portal’s UI.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/azure_encrypted_passwords_1.png&quot; alt=&quot;Enable Remote Desktop&quot; title=&quot;Enable Remote Desktop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Next, fill out the following form with the desired login credentials.  Remember, this is the username and password combination that you will end up using with Remote Desktop.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/azure_encrypted_passwords_2.png&quot; alt=&quot;Configure Remote Desktop&quot; title=&quot;Configure Remote Desktop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once this is complete, your Windows Azure subscription is now configured to allow Remote Desktop connections.  Congratulations!&lt;/p&gt;

&lt;h3&gt;Configure Application&lt;/h3&gt;

&lt;p&gt;Now that our Azure subscription is configured, we need to update our Azure application’s configuration settings to match what we just set up in the cloud.  The first thing we need to do is generate an encrypted password using the thumbprint of our newly uploaded &lt;code class=&quot;highlighter-rouge&quot;&gt;Windows Azure Tools&lt;/code&gt; certificate.  The Windows Azure SDK has a command prompt that will allow us to encrypt our Remote Desktop password.&lt;/p&gt;

&lt;p&gt;In the Windows Azure Command Prompt &lt;code class=&quot;highlighter-rouge&quot;&gt;(Start =&amp;gt; All Programs =&amp;gt; Windows Azure SDK for .NET =&amp;gt; Windows Azure Command Prompt)&lt;/code&gt; type the following:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;csencrypt encrypt-password -CopyToClipboard -Thumbprint &quot;&amp;lt;Azure Tools Thumbprint&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You will be prompted for a password, type the same password here as you did in the Windows Azure Management Portal.&lt;/p&gt;

&lt;p&gt;Once &lt;code class=&quot;highlighter-rouge&quot;&gt;csencrypt&lt;/code&gt; is finished executing you will have a shiny new encrypted password which will enable you to remote into your Windows Azure instance.&lt;/p&gt;

&lt;p&gt;Next, all you have to do is update your &lt;code class=&quot;highlighter-rouge&quot;&gt;ServiceConfiguration.csfg&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;Role ....&amp;gt;
  &amp;lt;ConfigurationSettings&amp;gt;
    &amp;lt;Setting name=&quot;Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountEncryptedPassword&quot; value=&quot;&amp;lt;Password Here&amp;gt;&quot; /&amp;gt;
  &amp;lt;ConfigurationSettings&amp;gt;
&amp;lt;/Role&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After you have your Service Configuration updated, package and deploy your Azure project.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/azure_encrypted_passwords_3.png&quot; alt=&quot;Connect Remote Desktop&quot; title=&quot;Connect Remote Desktop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If this doesn’t work the first time around, hit &lt;code class=&quot;highlighter-rouge&quot;&gt;F5&lt;/code&gt; in your Windows Azure Management Portal to refresh the page and try again.  I’m not sure why this is an issue, but it’s worked for me in the past.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ErrorCode&lt;ERRCA0017&gt;:SubStatus&lt;ES0006&gt;:There is a temporary failure. Please retry later.</title>
   <link href="http://robertgreiner.com/2012/05/azure_error_code_ERRCA0017_sub_status_ES0006_there_is_a_temporary_failure/"/>
   <updated>2012-05-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/05/azure_error_code_ERRCA0017_sub_status_ES0006_there_is_a_temporary_failure</id>
   <content type="html">&lt;p&gt;I feel like the past couple of months of my life could be summarized as &lt;em&gt;that time I got all of those Windows Azure related errors&lt;/em&gt;.  I suppose that’s the price you pay for living on the edge of technology.&lt;/p&gt;

&lt;p&gt;Here’s the newest Windows Azure error of the day:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Unhandled Exception: ErrorCode&lt;ERRCA0017&gt;:SubStatus&lt;ES0006&gt;:There is a temporary failure. Please retry later. (One or more specified cache servers are unavailable, which could be caused by busy network or servers. For on-premises cache clusters, also verify the following conditions. Ensure that security permission has been granted for this client account, and check that the AppFabric Caching Service is allowed through the firewall on all cache hosts. Also the MaxBufferSize on the server must be greater than or equal to the serialized object size sent from the client.)   
   at Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ResponseBody respBody)
   at Microsoft.ApplicationServer.Caching.DataCacheFactory.GetCacheProperties(RequestBody request, SimpleSendReceiveModule sendRcvModule)
   at Microsoft.ApplicationServer.Caching.DataCacheFactory.GetCache(String cacheName)
   at Microsoft.ApplicationServer.Caching.DataCacheFactory.GetDefaultCache()
   at Infrastructure.Caching.AzureCacheProvider.GetCache()&lt;/ES0006&gt;&lt;/ERRCA0017&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It turns out that the culprit was the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd465326.aspx&quot;&gt;configuration transformations&lt;/a&gt; for my Azure deployment.  When I was transforming configuration settings between my &lt;code class=&quot;highlighter-rouge&quot;&gt;Web.config&lt;/code&gt; and my &lt;code class=&quot;highlighter-rouge&quot;&gt;Web.Dev.config&lt;/code&gt; I incorrectly implemented my &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;dataCacheClients&amp;gt;&lt;/code&gt; section.&lt;/p&gt;

&lt;p&gt;I confirmed this by first removing all of the content out of my &lt;code class=&quot;highlighter-rouge&quot;&gt;Web.Dev.config&lt;/code&gt; and making sure my &lt;code class=&quot;highlighter-rouge&quot;&gt;Web.config&lt;/code&gt; contained all of the correct caching information for my development Windows Azure subscription.  After my next deploy, my Azure Caching was working as expected.&lt;/p&gt;

&lt;p&gt;Once I realized that my config transformations were to blame, I narrowed the issue down to the &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;configuration&amp;gt;&amp;lt;dataCacheClients&amp;gt;...&amp;lt;/dataCacheClients&amp;gt;&amp;lt;/configuration&amp;gt;&lt;/code&gt; section.&lt;/p&gt;

&lt;p&gt;If you are experiencing this error, I’d recommend double-checking (or better yet, temporarily deleting) your config transforms to make sure this isn’t the issue.&lt;/p&gt;

&lt;p&gt;Unfortunately, Google offers precious little advice into this error and to make matters worse, it is a very generic and hard to decipher exception.  Luckily for me, I caught this pretty early and there wasn’t too many commits to backtrack through before I found the issue.&lt;/p&gt;

&lt;p&gt;If you find yourself struggling with this and my fix doesn’t work for you, I’d check out &lt;a href=&quot;http://blogs.msdn.com/b/akshar/archive/2011/05/01/azure-appfabric-caching-errorcode-lt-errca0017-gt-substatus-lt-es0006-gt-what-to-do.aspx&quot;&gt;this article on MSDN&lt;/a&gt; that talks about how to get to the inner exception, which will help you troubleshoot further.&lt;/p&gt;

&lt;p&gt;Good luck.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Entity Framework Code First Migrations TargetInvocationException Fix</title>
   <link href="http://robertgreiner.com/2012/04/entity-framework-code-first-migrations-target-invocation-exception/"/>
   <updated>2012-04-27T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/04/entity-framework-code-first-migrations-target-invocation-exception</id>
   <content type="html">&lt;p&gt;Today, when I tried to add a new migration or update my database to the existing migration (&lt;code class=&quot;highlighter-rouge&quot;&gt;Update-Database&lt;/code&gt;) I kept getting the following error:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;PM&amp;gt; Add-Migration BlogCreated
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. —&amp;gt; System.ArgumentException: The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))
   — End of inner exception stack trace —
   at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
   at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   at System.Management.Automation.ComMethod.InvokeMethod(PSMethod method, Object[] arguments)
Exception has been thrown by the target of an invocation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This occurred because I separated out my context and migration files out into different projects.  This isn’t wrong per se, but it does confuse Code First Migrations.  To resolve this issue, I had to specify what project my migrations actually exist in.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;PM&amp;gt; Add-Migration BlogCreated -StartupProjectName &quot;Blog.Infrastructure&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you are getting this error, specify your &lt;code class=&quot;highlighter-rouge&quot;&gt;StartupProjectName&lt;/code&gt; and you should be good to go.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fixing the &quot;One of the request inputs is out of range error&quot; in Windows Azure.</title>
   <link href="http://robertgreiner.com/2012/04/one-of-the-request-inputs-is-out-of-range-windows-azure/"/>
   <updated>2012-04-25T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/04/one-of-the-request-inputs-is-out-of-range-windows-azure</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;One of the request inputs is out of range. (Microsoft.WindowsAzure.StorageClient.StorageClientException)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I got this error today because I had illegal characters in my Windows Azure Table Storage account name.  And, by illegal, I mean I used uppercase characters…&lt;/p&gt;

&lt;p&gt;This also applies to all Windows Azure Containers, Blobs, and Metadata. Before proceeding, take a look at the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd135715.aspx&quot;&gt;naming rules&lt;/a&gt; so you don’t have to waste more valuable development time tracking down this lame error.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using Github as a Syntax Highlighter for Your Blog or Website</title>
   <link href="http://robertgreiner.com/2012/04/using-github-as-a-syntax-highlighter/"/>
   <updated>2012-04-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/04/using-github-as-a-syntax-highlighter</id>
   <content type="html">&lt;blockquote&gt;&lt;a href=&quot;http://gist.github.com&quot;&gt;Gist&lt;/a&gt; is a simple way to share snippets and pastes with others. All gists are git repositories, so they are automatically versioned, forkable and usable as a git repository.&lt;/blockquote&gt;

&lt;p&gt;A Gist is a snippet of code hosted by Github that has all of the benefits of a Github repository, but provides them to you in a more lightweight way.  Not only are public Gists free to create and store on Github they are also super easy.  You can create a new Gist, add, modify, and delete files and code entirely in the browser.  You don't need to install or download anything.&lt;p&gt;


&lt;p&gt;As developers, bloggers, and/or website owners we can create Gists that contain example code and embed them on our site.  By doing this, we get the huge benefit of having all of our source code hosted and backed up separate from your website.  Your Gists are also indexed by Google using Githubs Google Juice (better Page Ranking) and you also get to leverage part of the fantastic infrastructure that Github has.&lt;/p&gt;

&lt;p&gt;Letting Github host and display your code in a clean and maintainable way is easy, just follow these simple steps:&lt;/p&gt;

&lt;h3&gt;Step 1: Create a Gist&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Log in to Github&lt;/li&gt;
  &lt;li&gt;Click the &lt;em&gt;Gist&lt;/em&gt; link at the top of the screen (or go to &lt;a href=&quot;http://gist.github.com&quot;&gt;gist.github.com&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fill out the file name (description is optional)&lt;/li&gt;
  &lt;li&gt;Enter your code&lt;/li&gt;
  &lt;li&gt;Click &lt;em&gt;Create Public Gist&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Optional: You can also click &lt;em&gt;Add File&lt;/em&gt; at the bottom to split your code snippet up into several different files if you need to.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: The syntax highlighting is auto-detected based on the extension of the file name that you enter, so be sure you add the appropriate level of detail.&lt;/p&gt;

&lt;h3&gt;Step 2: Embed your Gist&lt;/h3&gt;

&lt;p&gt;
  Once you create your Gist, you will be presented with a confirmation page.  Click the &lt;em&gt;show embed&lt;/em&gt; link and copy/paste the script tag on to your website.
&lt;/p&gt;

&lt;p&gt;
  &lt;script src=&quot;https://gist.github.com/2479301.js&quot;&gt; &lt;/script&gt;
  &lt;noscript&gt;
    &lt;pre&gt;&amp;lt;script src=&quot;https://gist.github.com/&amp;lt;gist_id&amp;gt;.js&quot;&amp;gt; &amp;lt;/script&amp;gt;&lt;/pre&gt;
  &lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;Now, when your page is loaded, your code will be pulled in from Github and automatically formatted.&lt;/p&gt;

&lt;h3&gt;Step 3: Show RSS readers some love&lt;/h3&gt;

&lt;p&gt;
  This step is important if you have users that consume your site's content outside of the site itself such as RSS readers.  This will also come in handy for those who disable JavaScript, but I have still yet to meet one of those people in my decade of development experience.  If you're out there, please send me an email so I know you exist.  Regardless, if you have a blog, chances are someone will benefit from this, so be sure not to leave them out.
&lt;/p&gt;

&lt;p&gt;
  &lt;script src=&quot;https://gist.github.com/2473463.js&quot;&gt; &lt;/script&gt;
  &lt;noscript&gt;
    &lt;pre&gt;
       &amp;lt;p&amp;gt;
        &amp;lt;script src=&quot;https://gist.github.com/&amp;lt;gist_id&amp;gt;.js&quot;&amp;gt; &amp;lt;/script&amp;gt;
        &amp;lt;noscript&amp;gt;
          &amp;lt;pre&amp;gt;
             //Your code here
             //Be sure you escape your tags with &amp;lt; and &amp;gt; when displaying things like HTML.
          &amp;lt;/pre&amp;gt;
        &amp;lt;/noscript&amp;gt;
      &amp;lt;/p&amp;gt;
    &lt;/pre&gt;
  &lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;Keep in mind that you need to properly escape your HTML special characters, or your RSS applications will think you are using an actual tag.  For a working example, Right-click and hit view source to see what I did for this post.&lt;/p&gt;

&lt;h3&gt;Done!&lt;/h3&gt;

&lt;p&gt;And, that's it.  May your code outlive your blog.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Windows Azure Role Instances are Taking Longer Than Expected to Start</title>
   <link href="http://robertgreiner.com/2012/04/windows-azure-role-instances-are-taking-longer-than-expected-to-start/"/>
   <updated>2012-04-19T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/04/windows-azure-role-instances-are-taking-longer-than-expected-to-start</id>
   <content type="html">&lt;p&gt;
  Today, I was trying to run my Windows Azure project locally and, after running the project in Visual Studio, it just sat there for a long time churning away and not displaying anything.  After waiting for a while Visual Studio got bored and flashed the following warning:
&lt;/p&gt;

&lt;p&gt;
  &lt;blockquote&gt;Role instances are taking longer than expected to start.  Do you want to continue waiting?&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/vs_role_instance_error.png&quot; alt=&quot;VS 2010 Windows Azure Role instances are taking longer than expected to start error.&quot; title=&quot;Role instances error message&quot; width=&quot;496&quot; height=&quot;199&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;
&lt;p&gt;
  After trying this a couple of times, restarting Visual Studio, and even trying to wait the dang thing out, I finally decided that something was wrong and needed further investigation.
&lt;/p&gt;

&lt;p&gt;
  It turns out, that one of the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/gg456327.aspx&quot;&gt;Role Startup Tasks&lt;/a&gt; we needed to install the Windows Identity Foundation Runtime in a Windows Azure deployment ended up killing our local role instances.
&lt;/p&gt;

&lt;h2&gt;What we did&lt;/h2&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/2424501.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
&amp;lt;Startup&amp;gt;
  &amp;lt;Task commandLine=&quot;Startup\IdentityGac.cmd&quot; executionContext=&quot;elevated&quot; taskType=&quot;simple&quot;&amp;gt;&amp;lt;/Task&amp;gt;
&amp;lt;/Startup&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;h2&gt;How we fixed it&lt;/h2&gt;

&lt;p&gt;We simply changed the taskType from &lt;code&gt;simple&lt;/code&gt; to &lt;code&gt;background&lt;/code&gt; and our local role instances started working right away.  Now, it's important to keep in mind that your deployment might need a &lt;code&gt;simple&lt;/code&gt; taskType and might not work if you change it to &lt;code&gt;background&lt;/code&gt;.  That being said, if you might want to just change the taskType for your local deployments and keep it the same for when you deploy to the cloud.&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/2424508.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
&amp;lt;Startup&amp;gt;
  &amp;lt;Task commandLine=&quot;Startup\IdentityGac.cmd&quot; executionContext=&quot;elevated&quot; taskType=&quot;background&quot;&amp;gt;&amp;lt;/Task&amp;gt;
&amp;lt;/Startup&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;And that's it.  I hope that this helps if you are encountering this error.  And, hopefully, you won't have to waste as much time on it as I did.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Looking for a new job? Tell Github.</title>
   <link href="http://robertgreiner.com/2012/03/looking-for-a-job-tell-github/"/>
   <updated>2012-03-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/03/looking-for-a-job-tell-github</id>
   <content type="html">&lt;p&gt;
	If you are a proud owner of a Github account (free or paid) and are looking for a new job, it might be in your best interest to let Github know you are looking for a new job.  This will let potential employers know you are interested in being contacted about opportunities, and will also flag your account in search results for third-party Github crawlers.
&lt;/p&gt;

&lt;p&gt;
	By default, Github doesn't know you are looking for a new job, so you will need to update your profile manually.  Luckily for you, it is extremely simple to do (no surprise there) and can be accomplished through your Github profile page.

	&lt;ol&gt;
		&lt;li&gt;Log in to Github&lt;/li&gt;
		&lt;li&gt;Click &quot;Account Settings&quot; on the top-right of the page.&lt;/li&gt;
		&lt;li&gt;You should be on the Main Profile tab.&lt;/li&gt;
		&lt;li&gt;Click the &quot;available for hire&quot; check-box in the Jobs Profile section&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;Optional:&lt;/em&gt; fill out your bio&lt;/li&gt;
		&lt;li&gt;Save&lt;/li&gt;
	&lt;/ol&gt;

	I have also attached a screen-shot for your convenience.
&lt;/p&gt;

&lt;p&gt;
	&lt;a href=&quot;http://robertgreiner.com/uploads/images/2012/github-profile.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/github-profile.png&quot; alt=&quot;Edit your Github profile to let people know you are looking for a new job&quot; title=&quot;Github Profile Options.&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
	Remember, that companies that are forward-thinking enough to search for potential candidates on Github are also more likely to not mass-spam-email anyone who has ever taken a programming class when trying to fill a position.  Chances are, these companies will be more interested in creating a relationship with a talented developer (you) and, chances are, these are exactly the type of companies you want to be working for.
&lt;/p&gt;

&lt;p&gt;
	Oh, and while you're at it, you should put your &lt;a href=&quot;http://gitcv.com&quot;&gt;GitCV&lt;/a&gt; profile on your resume for an extra dash of awesomeness!  
	&lt;br /&gt;
	Happy Hunting.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Introducing GitCV - Show off your programming awesomeness.</title>
   <link href="http://robertgreiner.com/2012/02/introducing-gitcv/"/>
   <updated>2012-02-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/02/introducing-gitcv</id>
   <content type="html">&lt;p&gt;
	Programmers, did you ever wish you could add an executive summary of your github awesomeness on your resume?  Managers, did you ever wish you had a better way to evaluate the contributions and programming skills of a candidate &lt;strong&gt;before&lt;/strong&gt; they come in for an interview?  Well, now you can.
&lt;/p&gt;

&lt;p&gt;
	&lt;a href=&quot;http://gitcv.com&quot;&gt;GitCV&lt;/a&gt; will display an up-to-the-minute summary of a github user's account in a clean and readable format.  Here's a quick example of &lt;a href=&quot;http://gitcv.com/robertgreiner&quot;&gt;my profile&lt;/a&gt; to give you a feel of what it looks like.  If you would like to add a link to your GitCV profile on your resume, simply add the following link &lt;code&gt;http://gitcv.com/YourGithubUsername&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
	&lt;a href=&quot;http://robertgreiner.com/uploads/images/2012/gitcv.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/gitcv.png&quot; alt=&quot;Show off your awesomeness with GitCV.&quot; title=&quot;My GitCV Profile&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
	There are still a few more features and graphs I want to add in the future, but I feel like this is a really good start.  GitCV pulls your current public information every time the page loads, so you don't have to worry about stale data.
&lt;/p&gt;

&lt;p&gt;
	GitCV is free to &lt;a href=&quot;http://gitcv.com&quot;&gt;use&lt;/a&gt; and &lt;a href=&quot;http://github.com/robertgreiner/gitcv&quot;&gt;extend&lt;/a&gt;.  Are there any features you would like added?  Leave a comment!
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The First Few Heuristics</title>
   <link href="http://robertgreiner.com/2012/01/the-first-few-heuristics/"/>
   <updated>2012-01-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/the-first-few-heuristics</id>
   <content type="html">&lt;p&gt;It looks like we finally nailed down the first five heuristics to implement in &lt;a href=&quot;http://github.com/robertgreiner/tipster&quot;&gt;Tipster&lt;/a&gt;.  I will follow up this post with a more in-depth introduction into each heuristic and how we think it will add value to our radiator.&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Test Baseline&lt;/strong&gt; - Does the commit contain at least one line of test code?  This is the dumbest, most simple, heuristic to implement, but you'd be surprised how many commits get flagged here.  If developers are not writing any test code, we can't even think about discussing other aspects of quality.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Churn&lt;/strong&gt; - How often is the file modified?  Are large chunks of a file getting changed in a single commit?  Are large chunks of the file getting deleted in a single commit?  These are all red flags that can lead to risky code.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Cyclomatic Complexity&lt;/strong&gt; - The number of linearly independent paths through code.  In layman's terms, the more if statements you add to a method, the higher the cyclomatic complexity.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Contributor Diversity&lt;/strong&gt; - &lt;a href=&quot;http://research.microsoft.com/pubs/70535/tr-2008-11.pdf&quot;&gt;It has been shown&lt;/a&gt; that the number of different teams (not people in a team, or geographic distance between people in a team) working on a file directly correlates to defect density.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Code Coverage&lt;/strong&gt; - We will use a mixture of &lt;a href=&quot;http://en.wikipedia.org/wiki/Code_coverage&quot;&gt;line and branch coverage&lt;/a&gt; to gain insight to how well covered the source file is from a unit-test perspective.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I think this is a really good start and it will give us some good insight into each commit.  As time goes on, these heuristics will be fine-tuned to give the best results possible and additional heuristics can be added after we are comfortable with the list above.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Introducing Tipster</title>
   <link href="http://robertgreiner.com/2012/01/introducing-tipster/"/>
   <updated>2012-01-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/introducing-tipster</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://github.com/robertgreiner/tipster&quot;&gt;Tipster&lt;/a&gt; is a ruby gem that will generate an HTML report of your most recent git commit and let you know if it is risky on one of the risk-heuristics we are implementing with Ratcheting.  As we continue to refine existing heuristics and implement new ones, Tipster will give you a clearer picture of how risky your code is &lt;strong&gt;before you commit it&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Here's a quick look at the risk report that Tipster generates, it's still in the early stages, and should be more eye appealing and contain more robust information in the following weeks.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/tipster.png&quot; alt=&quot;Tipster: Assess the risk of a local git commit in real time.&quot; title=&quot;Tipster: Assess the risk of a local git commit in real time.&quot; width=&quot;500&quot; height=&quot;319&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tipster is available under the MIT license on &lt;a href=&quot;http://github.com/robertgreiner/tipster&quot;&gt;Github&lt;/a&gt;.  Feel free to contribute or use it in your own project.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>End Piracy, Not Liberty</title>
   <link href="http://robertgreiner.com/2012/01/end-piracy-not-liberty/"/>
   <updated>2012-01-18T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/end-piracy-not-liberty</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/stop_sopa.png&quot; alt=&quot;Stop SOPA&quot; title=&quot;Stop SOPA&quot; width=&quot;450&quot; height=&quot;450&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.google.com/landing/takeaction/&quot;&gt;I can't say it any better than google can.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://americancensorship.org/&quot;&gt;Get involved.&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Tweaking Heuristics for Better Results</title>
   <link href="http://robertgreiner.com/2012/01/tweaking-heuristics-for-better-results/"/>
   <updated>2012-01-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/tweaking-heuristics-for-better-results</id>
   <content type="html">&lt;p&gt;Lately we've been noticing fewer and fewer commits getting flagged as risky with each passing week.  After doing some analysis we realized, for the most part, we have increased quality awareness across the organization and as a result more people are checking in test code with each commit. As a rule of thumb, we hope to see around 40% of commits flagged as risky.  This number seems appropriate for now since the goal is to code review all risky commits and the value of code reviews has diminishing returns.&lt;/p&gt;

&lt;p&gt;In our case the issue of having too few commits flagged as risky is a good thing but we still have to do something about it to ensure we are getting the most out of our efforts.  Once you get to this point, there are three options that can be taken to move forward:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Introduce a new heuristic&lt;/strong&gt; - If your current set of risk heuristics are giving you the kind of information you want, maybe it's time to add a new one.  For instance, measuring cyclomatic complexity can be a nice compliment to an existing code coverage metric.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Dial-up one or more existing heuristics&lt;/strong&gt; - Once the development organization improves to a new level, dial it up a notch and see if you can't get them to improve even more.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Make your existing heuristics smarter&lt;/strong&gt; - One thing we've been toying around with is trying to identify files that get checked in without tests.  For instance, if a developer commits three source files, but only updates two different test files, then they likely neglected to add tests for one of the files.  This commit should still be flagged as risky, even if overall code coverage increased.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ratcheting is very much an experimental process that requires constant tweaking to ensure we are tactically striking risky code in areas that provide the most value while minimizing the amount of distractions to other developers.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Lessons Learned&#58; How Do I Run This Locally?</title>
   <link href="http://robertgreiner.com/2012/01/how-do-i-run-this-locally/"/>
   <updated>2012-01-05T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/how-do-i-run-this-locally</id>
   <content type="html">&lt;p&gt;Typically, when we tell developers at work about Ratcheting the reaction is generally positive.  However, the one question that everyone seems to have is &quot;How can I run this locally?&quot;  This is a really important question, one that we have somewhat neglected over the past few weeks while we have been focusing on delivering functionality for our risk metrics.&lt;/p&gt;

&lt;p&gt;Developer communication and rapid feedback are paramount in any project and it is vital to give developers the tools they need to succeed.  After all, the success of your project depends on it.&lt;/p&gt;

&lt;p&gt;When you are doing a project that will generate some level of visibility into a developer's work, it is important to give them something that lets them know what they are getting in to before each commit.  In the future we will try to do a better job of delivering the feedback tools our developers need to stay informed.&lt;/p&gt;

&lt;p&gt;Ideally, we will roll out the changes to the local check-in script before we make the changes in the radiator.  This way we can treat our developers as partners and beta-testers for new functionality instead of a user-base that is largely kept in the dark until changes are made.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How much do you bill per hour as a freelancer?</title>
   <link href="http://robertgreiner.com/2012/01/how-much-do-you-bill-per-hour-as-a-freelancer/"/>
   <updated>2012-01-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/how-much-do-you-bill-per-hour-as-a-freelancer</id>
   <content type="html">&lt;p&gt;I've always wondered what other software development freelancers set as their hourly rate as so I could use it a comparable for my own rates.  Surprisingly, this information is not as straightforward to find as you might think.  Thanks to a &lt;a href=&quot;http://news.ycombinator.com/item?id=3420203&quot;&gt;recent poll on HackerNews&lt;/a&gt; I now have a little clearer picture of how much my fellow developers are charging for freelance work.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/images/2012/freelancer_rates.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2012/freelancer_rates.png&quot; alt=&quot;What other freelancers are charging.&quot; title=&quot;Freelancer Hourly Rates&quot; width=&quot;607&quot; height=&quot;365&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Personally, this data surprised me a little.  I always thought that the hourly rates for most freelancers would be significantly lower, but this data may be &lt;a href=&quot;http://en.wikipedia.org/wiki/Skewness&quot;&gt;negatively skewed&lt;/a&gt; due to the fact that most of the folks on Hacker News are some of the best and brightest in our field.&lt;/p&gt;

&lt;p&gt;On a parting note, I think it's best to set a slightly higher rate and not have to rely on billing your customers for every little thing you do.  This way, you can focus on delivering quality work, and not on how much time you should bill for thinking about your client's problem on the drive to lunch.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A Typical Development Workflow</title>
   <link href="http://robertgreiner.com/2012/01/a-typical-development-workflow/"/>
   <updated>2012-01-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/a-typical-development-workflow</id>
   <content type="html">&lt;p&gt;Part of the problem we encounter when trying to implement a new policy, procedure, or even software architecture is that the people making the rules are seldom the ones that have to live with the consequences.  That is not the case with the Ratcheting project.  We are all, first and foremost, programmers here and will very much feel the pain of &lt;a href=&quot;http://en.wikipedia.org/wiki/Eating_your_own_dog_food&quot;&gt;eating our own dogfood&lt;/a&gt;. That being said, it is in our best interest to ensure Ratcheting really does provide quality and does not end up burdening our fellow developers.&lt;/p&gt;

&lt;p&gt;As we continue to define and refine exactly what Ratcheting is, an idea of how it might be used starts to emerge. Here is what a developer's workflow might look like during her day-to-day activities.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A developer is ready to commit code changes to the repository&lt;/li&gt;
  &lt;li&gt;The project is built and unit tests are run*&lt;/li&gt;
  &lt;li&gt;Calculate check-in risk locally*&lt;/li&gt;
  &lt;li&gt;Static quality analysis is executed*&lt;/li&gt;
  &lt;li&gt;Review risk and quality report&lt;/li&gt;
  &lt;li&gt;Improve code based on report guidelines&lt;/li&gt;
  &lt;li&gt;Re-run check-in script&lt;/li&gt;
  &lt;li&gt;Commit!&lt;/li&gt;
  &lt;li&gt;A risky commit will be flagged  by the build radiator&lt;/li&gt;
  &lt;li&gt;A code review will then be generated automatically&lt;/li&gt;
  &lt;li&gt;The code review is assigned randomly to a person who has modified the file recently&lt;/li&gt;
  &lt;li&gt;Make improvements based on code review feedback&lt;/li&gt;
&lt;/ul&gt; 
&lt;div style=&quot;margin-top: -20px; font-size: 10px;&quot;&gt;* = automated by check-in script.&lt;/div&gt;&lt;br /&gt;

&lt;p&gt;Most of the things on this list we are already doing anyway, the addition of Ratcheting provides rapid feedback of code quality and risk around the time of commit, not during a post-mortem of the project done long after the project has been completed.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Intro to Ratcheting Presentation Slides</title>
   <link href="http://robertgreiner.com/2012/01/intro-to-ratcheting-presentation-slides/"/>
   <updated>2012-01-03T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/intro-to-ratcheting-presentation-slides</id>
   <content type="html">&lt;p&gt;Here are a few Powerpoint slides we put together that attempts to introduce the concept of Ratcheting and incremental code improvement. We'd love some feedback if you have any to give. Enjoy.&lt;/p&gt;

&lt;div style=&quot;width:425px&quot; id=&quot;__ss_11219273&quot;&gt; &lt;strong style=&quot;display:block;margin:12px 0 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/robertgreiner/code-quality-and-tipster&quot; title=&quot;Code Quality and Tipster&quot; target=&quot;_blank&quot;&gt;Code Quality and Tipster&lt;/a&gt;&lt;/strong&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/11219273&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;div style=&quot;padding:5px 0 12px&quot;&gt; View more &lt;a href=&quot;http://www.slideshare.net/&quot; target=&quot;_blank&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/robertgreiner&quot; target=&quot;_blank&quot;&gt;Robert Greiner&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Assessing Which Risk Heuristics to Implement in the Radiator</title>
   <link href="http://robertgreiner.com/2012/01/assessing-which-risk-heuristics-to-implement-in-the-radiator/"/>
   <updated>2012-01-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/assessing-which-risk-heuristics-to-implement-in-the-radiator</id>
   <content type="html">&lt;p&gt;In short, a risk heuristic should not be added to the radiator unless it meets the following criteria:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic should identify an aspect of risk&lt;/strong&gt; - The heuristics applied in Ratcheting should give us the ability to tactically identify which commits are risky and offer an opportunity to mitigate that risk.  We need to identify heuristics that are really good at identifying risk and start with those.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;It should be obvious how to mitigate the risk identified by the heuristic&lt;/strong&gt; - Once we have identified a risky commit, we need to be able to do something about it.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic's sensitivity should be configurable&lt;/strong&gt; - As time goes on, we might need to tweak the threshold of a heuristic to better identify what is risky.  For our first heuristic, test lines of code added, we might want to tweak the ratio of test lines of code to production lines of code over the life of the project to reduce the chances of flagging files that are not risky.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic should make sense in a historical context&lt;/strong&gt; - We need to know how each heuristic will behave against prior recent commits.  Are we getting enough information from the heuristic?  Is it providing the right level of information?  If the heuristic is flagging too many or too few commits, it might not be worth adding.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic should provide pre-commit feedback&lt;/strong&gt; - Developers need to know what they are getting in to before they issue their commit.  This feedback should be part of a check-in script and run in the same relative amount of time as your unit test suite.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The heuristic should be able to be introduced at a minimal stage&lt;/strong&gt; - Some of these heuristics can get very complex quickly.  The key here is to start small by finding the easiest possible point of entry and improve the smartness of the risk analysis over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This provides a good lens with which to look at individual risk heuristics.  It is important to establish this rule-of-thumb early and stick to it in order to fight feature creep.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Continuous Code Improvement Using Ratcheting</title>
   <link href="http://robertgreiner.com/2012/01/continuous-code-improvement-using-ratcheting/"/>
   <updated>2012-01-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2012/01/continuous-code-improvement-using-ratcheting</id>
   <content type="html">&lt;p&gt;I read a great article over the weekend dealing with the concept of &lt;strike&gt;ratcheting&lt;/strike&gt; (sorry, this website has been shut down) a legacy codebase in order to achieve the ultimate goal of quality code using incremental improvements over time.&lt;/p&gt;

&lt;p&gt;I must admit that reading this article was a bit of a revelation for me.  On the surface, the concept of ratcheting in and of itself is nothing new.  After all, We were taught from a very young age that the best way to handle a complex problem is to break it down into composite pieces and attack the problem on a smaller scale (i.e. &lt;em&gt;How do you eat a whale?  One bite at a time&lt;/em&gt;.)  However, the idea of implementing ratcheting in a code base was something that I had never thought of before and it seems to be a great way to help cultivate a culture of quality within a software project, especially a large software project.&lt;/p&gt;

&lt;p&gt;At its core, ratcheting is nothing more than a check-in script that developers will run locally before being allowed to push to the central repository.  This script will create a &lt;em&gt;gated check-in&lt;/em&gt; that will ensure each push meets a minimum set of code cleanliness requirements.  In order to do this, we can leverage different types of static code analysis tools to create a good baseline to measure against.&lt;/p&gt;

&lt;p&gt;It is important to point out that ratcheting is not intended to replace unit testing.  Ratcheting serves a different purpose altogether and can be used in conjunction with tried-and-true development practices that have allowed our software projects to succeed for so long.&lt;/p&gt;

&lt;h3&gt;Why do we need ratcheting?&lt;/h3&gt;

&lt;p&gt;The main problem with any code base is &lt;a href=http://en.wikipedia.org/wiki/Entropy&gt;entropy&lt;/a&gt;.  Simply put, entropy means that your code will inevitably trend towards chaos (or complexity) over time by default.  This effect is magnified exponentially as you add more developers to the project.  As a result, what ends up happening is, our once-tidy code base gets transformed into a cave of despair that is full of defects and takes incrementally longer to add new features release after release.&lt;/p&gt;

&lt;p&gt;We've all seen it.  Maybe Joe the Programmer has a tight deadline and ends up tacking a few extra lines on a method in a class that he's familiar with that &quot;gets the job done &quot;.  Now, Joe's excuse for committing this crime will be; &quot;hey bro, it's only five lines, who cares?&quot;  The problem with Joe's attitude is that over the course of three years and a few hundred commits on the file, our once innocent class will have morphed into a monster filled with defects and high complexity.&lt;/p&gt;

&lt;p&gt;This common scenario is where ratcheting can really show its value.  Joe wouldn't be able to check in his five-line-hack as-is because he likely would have violated one of the quality metrics the build script will be checking for (in this case, it would likely be something along the lines of cyclomatic complexity or a method that is too long).&lt;/p&gt;

&lt;p&gt;Finally, ratcheting &lt;em&gt;protects us from ourselves&lt;/em&gt;. Even in an ideal development situation with teams full of really smart programmers who truly care about quality code, ratcheting can help protect us from the simple little mistakes we all are guilty of committing from time to time.&lt;/p&gt;

&lt;h3&gt;What metrics should we be ratcheting against?&lt;/h3&gt;

&lt;p&gt;To be completely honest, I'm not 100% sure. What is important for my project now might not be what is important for your project which also won't be what is important to my project in a year or two. &lt;/p&gt;

&lt;p&gt;For my project I am going to start with code coverage and likely move on to cyclomatic complexity, dead code, and duplicate code.&lt;/p&gt;

&lt;h3&gt;Ratcheting scales up well&lt;/h3&gt;

&lt;p&gt;Ratcheting also seems to be a natural remedy to the exponentially increasing overhead costs incurred by adding more developers to a project.  The more developers you have incrementally improving a code base, the faster the code base becomes the awesomeness it was intended to be.&lt;/p&gt;

&lt;p&gt;Since ratcheting is fair and unbiased, it will work especially well with teams that span across multiple continents with different levels of training, motivation, and professionalism.&lt;/p&gt;

&lt;h3&gt;The two simple rules of ratcheting&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Your commit must not make the existing code base worse on aggregate&lt;/strong&gt; - Sorry Joe, but your five-line-hack from earlier won't cut it anymore and you'll have to find a cleaner solution before you are allowed to check in.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Your commit must improve the code base in one or more areas&lt;/strong&gt; - Oh, and by the way, I hope you added some test coverage to the code you just fixed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first rule is absolutely vital to ensure the code base does not get any worse.  The second rule is the only way to ensure that the code actually improves over time.&lt;/p&gt;

&lt;h3&gt;Putting ratcheting into action&lt;/h3&gt;

&lt;p&gt;Over the next few months, I'm going to start implementing ratcheting in my &lt;a href=http://www.theserverside.net/blogs/thread.tss?thread_id=46734&gt;pod&lt;/a&gt; at work and will document  my findings on this blog.&lt;/p&gt;
&lt;p&gt;One important question I aim to answer is &lt;em&gt;What shape will ratcheting take?&lt;/em&gt;  Ratcheting can only enforce improvement along the lines of static metrics and is unable to determine whether or not a change or refactoring is good.  This being said, will ratcheting merely result in a tidy codebase with the same underlying issues?  Or, will ratcheting help empower developers to fearlessly make the kind of improvements that will benefit the system a long time in the future?  Hopefully, we'll be able to answer this question and many more as we delve deeper into the practice of ratcheting.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A new blog for the new year</title>
   <link href="http://robertgreiner.com/2011/12/a-new-blog-for-the-new-year/"/>
   <updated>2011-12-29T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/12/a-new-blog-for-the-new-year</id>
   <content type="html">&lt;p&gt;I thought I'd start the new year off right (and early! For those of you on Google Reader however, this post will show up late, sorry about that) by moving from &lt;a href=&quot;http://wordpress.org&quot;&gt;Wordpress&lt;/a&gt; to a &lt;a href=&quot;http://github.com/robertgreiner&quot;&gt;Github&lt;/a&gt; hosted blog.  I also moved my domain name from GoDaddy to &lt;a href=&quot;https://dnsimple.com/r/1b4ec658ed60c3&quot;&gt;dnsimple&lt;/a&gt; (which, I really like by the way.)&lt;/p&gt;

&lt;p&gt;I had a chance to test-drive a Github hosted blog when I created &lt;a href=&quot;http://ratcheting.org&quot;&gt;Ratcheting&lt;/a&gt; and I really like it.  I've always kind of wished CreatingCode was a Github blog, and I figured since I'm already going through the hassle of migrating all of my domains from GoDaddy, I might as well move my blog in time for the new year.&lt;/p&gt;

&lt;p&gt;So, please excuse the residual mess that comes from switching blog platforms, I promise to get all of the kinks worked out as quickly as possible.&lt;/p&gt;

&lt;p&gt;And finally, for my favorite readers, those of you on Google Reader.  Please excuse the duplicate posts as Google Reader syncs up with the new atom feed on this site.&lt;/p&gt;

&lt;p&gt;I hope you all have a fantastic new year and I'll see you in January!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Unit Testing JavaScript using BDD and Jasmine</title>
   <link href="http://robertgreiner.com/2011/12/unittesting-javascript-using-bdd-and-jasmine/"/>
   <updated>2011-12-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/12/unittesting-javascript-using-bdd-and-jasmine</id>
   <content type="html">&lt;p&gt;
JavaScript has been treated like a second class citizen for too long.  It needs the same level of care and attention as our production code.  This presentation gives a very basic introduction to unit testing JavaScript and tries to convince the audience that unit testing JavaScript is a good idea.
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;width:425px&quot; id=&quot;__ss_10385223&quot;&gt; &lt;strong style=&quot;display:block;margin:12px 0 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/robertgreiner/testing-javascript-10385223&quot; title=&quot;Testing javascript&quot; target=&quot;_blank&quot;&gt;Testing javascript&lt;/a&gt;&lt;/strong&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/10385223&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;div style=&quot;padding:5px 0 12px&quot;&gt; View more &lt;a href=&quot;http://www.slideshare.net/&quot; target=&quot;_blank&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/robertgreiner&quot; target=&quot;_blank&quot;&gt;robertgreiner&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Creating Item Recommendations by Finding Users with Similar Taste</title>
   <link href="http://robertgreiner.com/2011/11/creating-item-recommendations-by-finding-users-with-similar-taste/"/>
   <updated>2011-11-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/11/creating-item-recommendations-by-finding-users-with-similar-taste</id>
   <content type="html">&lt;p&gt;
Let's say you have bought some books on programming (nerd), read them, and then rated them.  Now, let's say a few other people have done the same thing.  As an online bookstore owner it would be in my best interest to find the users who have reviewed books similar to you (i.e. they have the same taste as you) and recommend items that you haven't read yet.
&lt;/p&gt;

&lt;p&gt;
A really simple way to find how similar your reviews are to another person is to essentially graph your reviews against Reviewer X's reviews and calculate the &lt;a href=&quot;http://en.wikipedia.org/wiki/Euclidean_distance&quot;&gt;Euclidean Distance&lt;/a&gt; between your numerical review scores and the other reviewer's.  With Euclidean Distance, the closer the distance between the two points is, the more similar your taste is to the other user.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/euclidean-distance.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/euclidean-distance.png&quot; alt=&quot;&quot; style=&quot;border: 1px solid #333333; background-color: #FFFFFF; padding: 10px 30px 10px 10px;&quot; title=&quot;euclidean-distance&quot; width=&quot;450&quot; height=&quot;388&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
The key here is to take a list of reviews and calculate a numerical score, which can be called a Similarity Score that you can use to measure how the reviews of other users stacks up to your reviews.
&lt;/p&gt;

&lt;p&gt;
This code will calculate the Similarity Score between two users.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1536650.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public class EuclideanDistance : SimilarityScore
{
  private readonly Reviewer CompareTo;
  private readonly Reviewer CompareWith;

  public EuclideanDistance(Reviewer compareTo, Reviewer compareWith)
  {
    CompareTo = compareTo;
    CompareWith = compareWith;
  }

  public double Score()
  {
    var similarTitles = FindSharedItems();
    if (similarTitles.Count == 0)
    {
      return 0.0;
    }

    double sumOfSquares = similarTitles.Sum(title =&gt; 
      Math.Pow(CompareTo.Reviews[title] - CompareWith.Reviews[title], 2));

    return Math.Round(1 / (1 + sumOfSquares), 3);
  }

  public List&amp;lt;string&amp;gt; FindSharedItems()
  {
    return (from r in CompareTo.Reviews where 
      CompareWith.Reviews.ContainsKey(r.Key) select r.Key).ToList();
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Once you have calculated the Similarity Score of the rest of the users in the system, you can use those scores to weight and average the reviews of items that you haven't read in order to attempt to make the best possible recommendation.  This will work with any type of item or review as long as two reviewers have something in common, a score will be calculated.
&lt;/p&gt;

&lt;p&gt;
This is a really simple example of machine learning.  Using a simple algorithm (or more complex one if you actually have a site that makes money) we can intelligently guess at what our customers are looking for based on data from other customers.  Building intelligence into applications can significantly improve the user's experience by turning advertisement or recommendation space into something that can benefit the user.  Which, will in turn improve your bank account.
&lt;/p&gt;

&lt;p&gt;
This is just the tip of the iceberg, you can find the rest of the project on &lt;a href=&quot;https://github.com/robertgreiner/Recommender&quot;&gt;Github&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Notes From the Field&#58; Breaking Down User Stories</title>
   <link href="http://robertgreiner.com/2011/11/notes-from-the-field-breaking-down-user-stories/"/>
   <updated>2011-11-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/11/notes-from-the-field-breaking-down-user-stories</id>
   <content type="html">&lt;p&gt;
We had a little talk today at work discussing stories and how to effectively break them down.
&lt;/p&gt;

&lt;p&gt;
Here's some of the basic points of the talk I captured with my &lt;a href=&quot;http://www.livescribe.com/en-us/&quot;&gt;Livescribe Echo&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
There were four key points I got from the discussion:
&lt;/p&gt;

&lt;p&gt;
&lt;ol&gt;
  &lt;li&gt;Stories should be broken down until they fit in a single unit of work.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.agileforall.com/2009/05/14/new-to-agile-invest-in-good-user-stories/&quot;&gt;INVEST&lt;/a&gt; in good stories&lt;/li&gt;
  &lt;li&gt;Stories only need to be detailed enough for you to start work.  They are designed to facilitate a discussion and do not require a huge amount of detail up front.&lt;/li&gt;
  &lt;li&gt;And finally, we discussed some &lt;a href=&quot;http://www.richardlawrence.info/2009/10/28/patterns-for-splitting-user-stories/&quot;&gt;Patterns of splitting stores.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/story_breakdown_notes.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/story_breakdown_notes-783x1024.png&quot; alt=&quot;&quot; title=&quot;story_breakdown_notes&quot; width=&quot;783&quot; height=&quot;1024&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Random Friday Thoughts&#58; Leaving a Legacy Online is Free</title>
   <link href="http://robertgreiner.com/2011/11/random-friday-thoughts-leaving-a-legacy-online-is-free/"/>
   <updated>2011-11-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/11/random-friday-thoughts-leaving-a-legacy-online-is-free</id>
   <content type="html">&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/bulb.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/bulb-240x300.jpg&quot; alt=&quot;&quot; title=&quot;bulb&quot; width=&quot;240&quot; height=&quot;300&quot; class=&quot;left&quot; /&gt;&lt;/a&gt;I was thinking about the internet this morning.
I want you to go ahead and try to imagine all of the famous authors, painters, inventors, composers, and theorists that lived before, say, the 1980's.  There's a ton of great ones.  Leonardo da Vinci, Thomas Edison, J.S. Bach, Vincent van Gogh and the list goes on an on from famous to not-so-famous and popular to relatively unknown.
&lt;/p&gt;

&lt;p&gt;
Now, think, at some point in their lives, they had to come to the realization that all of the wonderful things they were creating were likely going to be lost shortly after their death.  After all, a good amount of famous artists weren't even appreciated until well after they were gone all the while plagued with the fear thet they won't be remembered after they die, uncertain about the legacy they will be leaving behind.
&lt;/p&gt;

&lt;p&gt;
Fast forward a few short decades to present day.  For $0 a month, I can have my own blog and github account.  Everything I create is instantly shared with the entire world.  My web content is archived by Google (which I'm pretty sure would survive a nuclear apocalypse) and my code is stored, replicated, and backed-up all across Github's data-centers.  Everything I create and put on-line will hang around this earth far longer than I will and it was all free.
&lt;/p&gt;

&lt;p&gt;
The fact that the things we create and put online never die is both invigorating and scary at the same time but we never have to worry about losing the work we create, even after we're gone.  So go ahead artist, composers, and inventors.  Keep creating awesome things and sharing them with the world.  After all, creating a legacy is free.
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;font-size: 8px;&quot;&gt;Image source: &lt;a href=&quot;http://images.usatoday.com/news/_photos/2007/02/09/bulb.jpg&quot;&gt;USA Today&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using LINQ to sum up a list of numbers</title>
   <link href="http://robertgreiner.com/2011/11/using-linq-to-sum-up-a-list-of-numbers/"/>
   <updated>2011-11-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/11/using-linq-to-sum-up-a-list-of-numbers</id>
   <content type="html">&lt;p&gt;
I don't really like &lt;code&gt;foreach&lt;/code&gt; loops.  They are difficult to read and easy to abuse.
&lt;/p&gt;

&lt;p&gt;
Let's say, for example that we want to sum up the following list of numbers:
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1561938.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
private int[] numberList = {1, 2, 4, 8, 16, 32}; //sum = 63
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Conventional programming wisdom says that we should do the following to find the sum of the above list:
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1561940.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
int sum = 0;
foreach (int num in numberList)
{
  sum += num;
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
While this code does exactly what we need, it is not very expressive in its form.  &lt;code&gt;foreach&lt;/code&gt; loops end up looking the same whether you are trying to find the sum of a set of numbers or searching through a list of users to find a random contest winner.
&lt;/p&gt;

&lt;p&gt;
Luckily for us, .NET provides a easier and more readable way to accomplish the same functionality as the &lt;code&gt;foreach&lt;/code&gt; loop above.
&lt;/p&gt;

&lt;p&gt;
We will sum the same list of numbers using both a &lt;code&gt;foreach&lt;/code&gt; loop and a LINQ expression.  First, let's start off with some tests so we know what we can set up our expectations early.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1561942.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
[TestFixture]
public class SumNumbersTests
{
  [Test]
  public void ShouldAddAllValuesUsingForeach()
  {
    var sum = new SumNumbers();
    Assert.AreEqual(63, sum.SumUsingForeach());
  }

  [Test]
  public void ShouldAddAllValuesUsingLinqExpression()
  {
    var sum = new SumNumbers();
    Assert.AreEqual(63, sum.SumUsingLinq());
  }

  [Test]
  public void LinqExpressionAndForeachSumShouldBeEqual()
  {
    var sum = new SumNumbers();
    Assert.AreEqual(sum.SumUsingForeach(), sum.SumUsingLinq());
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now that we have our tests set up, we can move on to the actual code.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1561949.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public class SumNumbers
{
  private int[] numberList = {1, 2, 4, 8, 16, 32}; 

  public int SumUsingLinq()
  {
    return numberList.Sum(num =&gt; num);
  }

  public int SumUsingForeach()
  {
    var sum = 0;
    foreach (int num in numberList)
    {
      sum += num;
    }
    return sum;
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
See how much easier the LINQ expression is to read?  In fact, you don't even need to put anything in the parenthesis.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1561955.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public int SumUsingLinq()
{
  return numberList.Sum();
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;h3&gt;Taking it to the next level&lt;/h3&gt;
&lt;/p&gt;

&lt;p&gt;
The above example was a bit simple, so let's solve a problem that is a little more complex to help drive the point home.  Let's say that we want to sum the squares of each item in &lt;code&gt;numberList&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Just as before, we can manually find our expected answer given the same list of integers and set up our expectation before writing our production code.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1561959.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
[Test]
public void ShouldSumTheSquaresOfAllValuesUsingLinqExpression()
{
  var sum = new SumNumbers();
  Assert.AreEqual(1365.0, sum.SumSquaresUsingLinq());
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now, we can use the same methods as above which becomes more readable and succinct.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1561961.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public double SumSquaresUsingLinq()
{
  return numberList.Sum(num =&gt; Math.Pow(num, 2));
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
You can find the project files for this example on &lt;a href=&quot;https://github.com/codesamples/LINQSum&quot;&gt;Github&lt;/a&gt; under the &lt;a href=&quot;http://ospl.ws&quot;&gt;Open Source Public License&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Happy Halloween at Southwest Airlines</title>
   <link href="http://robertgreiner.com/2011/10/happy-halloween-at-southwest-airlines/"/>
   <updated>2011-10-31T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/10/happy-halloween-at-southwest-airlines</id>
   <content type="html">&lt;p&gt;
Here's a little glimpse into the festivities going on today at Southwest.  It's really nice working for a place that promotes such a laid back and fun loving atmosphere.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/swa_halloween.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/swa_halloween-785x442.jpg&quot; alt=&quot;&quot; title=&quot;swa_halloween&quot; width=&quot;785&quot; height=&quot;442&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How to get a temp directory in any OS with Ruby</title>
   <link href="http://robertgreiner.com/2011/10/how-to-get-a-temp-directory-in-any-os-with-ruby/"/>
   <updated>2011-10-18T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/10/how-to-get-a-temp-directory-in-any-os-with-ruby</id>
   <content type="html">&lt;p&gt;
I needed this over the weekend and the existing online help is less than helpful.  As it turns out, just like with everything I try to do in Ruby, the solution is simple.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1536630.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
require 'tmpdir'
temp = Dir.tmpdir() 
puts temp #C:/Users/Robert/AppData/Local/Temp
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This is all built into Ruby, you don't need to install any gems or anything.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Quick and Dirty&#58; How to Uninstall All Ruby Gems</title>
   <link href="http://robertgreiner.com/2011/09/quick-and-dirty-how-to-uninstall-all-ruby-gems/"/>
   <updated>2011-09-18T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/09/quick-and-dirty-how-to-uninstall-all-ruby-gems</id>
   <content type="html">&lt;p&gt;
Sometimes you just need a clean slate.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
gem list | cut -d&quot; &quot; -f1 | xargs gem uninstall -aIx
&lt;/pre&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Let's make it more difficult to get code into trunk</title>
   <link href="http://robertgreiner.com/2011/09/lets-make-it-more-difficult-to-get-code-into-trunk/"/>
   <updated>2011-09-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/09/lets-make-it-more-difficult-to-get-code-into-trunk</id>
   <content type="html">&lt;p&gt;On the surface this sounds counter-intuitive.  Make it more difficult to get code into trunk?  Aren't developers burdened enough already?&lt;/p&gt;

&lt;p&gt;The answer, is &lt;em&gt;yes&lt;/em&gt;.  Developers are overburdened. That is precisely &lt;strong&gt;why&lt;/strong&gt; we need to be more strict about the code we let into trunk.  If we raise the quality standards for code going into trunk, we will have fewer defects in the future which will make all of our lives easier as developers.  Especially around release time.&lt;/p&gt;

&lt;p&gt;Don't just take my word for it.  Uncle Bob says &lt;a href=&quot;http://stackoverflow.com/questions/573699/open-source-projects-that-demonstrate-tdd-and-solid-priciples/625223#625223&quot;&gt;&quot;...if the tests pass, we ship.&quot;&lt;/a&gt; That is a really strong statement.  How difficult do you think it would be to commit buggy code into &lt;a href=&quot;http://fitnesse.org/&quot;&gt;FitNesse&lt;/a&gt; when they have such a comprehensive suite of unit tests?&lt;/p&gt;

&lt;p&gt;Even code of really high quality still has the risk of introducing new defects.  The key is to identify those risks and assign code reviews appropriately.  Reviewing risky code and keeping bad code out altogether are paramount if you are serious about releasing a quality product on time and on budget.&lt;/p&gt;

&lt;p&gt;Assigning a risk value to a commit is not as straightforward as it sounds.  If you're interested in learning more about this, check out my new project &lt;a href=&quot;http://ratcheting.org&quot;&gt;Ratcheting&lt;/a&gt; that I am working on with some smart folks at work.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>An Introduction to TDD at 10,000 feet</title>
   <link href="http://robertgreiner.com/2011/09/an-introduction-to-tdd-at-10000-feet/"/>
   <updated>2011-09-05T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/09/an-introduction-to-tdd-at-10000-feet</id>
   <content type="html">&lt;p&gt;Here are the slides for a presentation I'm doing over TDD.  Let me know what you think.&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;width:425px&quot; id=&quot;__ss_10385239&quot;&gt; 
  &lt;strong style=&quot;display:block;margin:12px 0 4px&quot;&gt;
    &lt;a href=&quot;http://www.slideshare.net/robertgreiner/test-driven-development-at-10000-feet&quot; title=&quot;Test Driven Development at 10,000 Feet&quot; target=&quot;_blank&quot;&gt;Test Driven Development at 10,000 Feet&lt;/a&gt;
  &lt;/strong&gt; 
&lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/10385239&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; 
&lt;div style=&quot;padding:5px 0 12px&quot;&gt; 
  View more &lt;a href=&quot;http://www.slideshare.net/&quot; target=&quot;_blank&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/robertgreiner&quot; target=&quot;_blank&quot;&gt;Robert Greiner&lt;/a&gt; 
&lt;/div&gt; 
&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;I have the source presentation on &lt;a href=&quot;https://github.com/robertgreiner/tdd-overview&quot;&gt;Github&lt;/a&gt; if you'd like to contribute.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using Ruby to get information about a Git or Subversion commit</title>
   <link href="http://robertgreiner.com/2011/09/using-ruby-to-get-information-about-a-git-or-subversion-commit/"/>
   <updated>2011-09-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/09/using-ruby-to-get-information-about-a-git-or-subversion-commit</id>
   <content type="html">&lt;p&gt;
The following code gets information about a recent commit and finds the number of test lines of code and production lines of code added.  You can also set a TLoc/PLoc threshold and call a simple &lt;code&gt;pass?&lt;/code&gt; method to ensure your checkin has an &quot;appropriate&quot; number of test lines checked in.
&lt;/p&gt;

&lt;p&gt;
While the definition of a &quot;good&quot; ratio of test lines of code per production lines of code will definitely vary for each project, knowing whether or not a commit contains test lines of code at all can definitely be useful.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1536620.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
class GitHistory

  attr_reader :test_lines_of_code, :production_lines_of_code, :current_commit_id, :previous_commit_id, :diff, :has_java_or_test_code

  def initialize(commit_id = nil)
    @commit_id= commit_id unless commit_id.nil?
    if commit_id.nil?:
      getLatestCommit
    end
    @has_java_or_test_code = false
    set_defaults
    get_change_list
    find_lines_of_code_added
  end
  
  def getLatestCommit
      commit_id = execute &quot;git rev-parse --verify HEAD&quot;
      @commit_id = commit_id.chop!
  end
  
  def ratio_score
    @test_lines_of_code / @production_lines_of_code
  end

  def pass?
    if has_java_or_test_code
      return ratio_score &gt; 0
    end
    true
  end

  def results
    puts &quot;Prod Lines: &quot; &lt; &lt; &quot;%2.0f&quot; % @production_lines_of_code
    puts &quot;Test Lines: &quot; &lt;&lt; &quot;%2.0f&quot; % @test_lines_of_code
    puts &quot;Ratio Score: &quot; &lt;&lt; &quot;%2.2f&quot; % ratio_score
  end

  private

  def recent_checkin_ids
    execute &quot;git rev-list HEAD^ --reverse --max-count=100&quot;
  end

  def set_defaults
    @production_lines_of_code = 0
    @test_lines_of_code = 0
  end

  def get_change_list
    if @commit_id.scan(/[a-zA-Z]/).length.zero?
      @diff = execute &quot;git log --numstat --grep=svn\.swacorp\.com\/svn\/commerce\/trunk@#{@commit_id} | grep ^[0-9]&quot;
    else
      @diff = execute &quot;git show #{@commit_id} --numstat | grep ^[0-9]&quot;
    end
  end

  def find_current_commit_id
    @commit_id = execute(&quot;git rev-parse HEAD&quot;).strip
  end

  def find_previous_commit_id
    @previous_commit_id = execute(&quot;git rev-parse HEAD^&quot;).strip
  end

  def find_lines_of_code_added
    @diff.each_line do |line|
      changed_lines = line.split[0].to_f
      if line.downcase.include? 'test'
        @test_lines_of_code += changed_lines
        @has_java_or_test_code = true
      elsif line.downcase.include? '.java'
        @production_lines_of_code += changed_lines
        @has_java_or_test_code = true
      end
    end

    @production_lines_of_code = 1 unless @production_lines_of_code.nonzero?
  end

  def execute(command, directory = &quot;.&quot;)
    directory = ARGV.first unless ARGV.empty?
    `cd #{directory}; #{command}`
  end

end
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NumberText&#58; Converting numbers into words in C#</title>
   <link href="http://robertgreiner.com/2011/08/numbertext-converting-numbers-into-words-in-csharp/"/>
   <updated>2011-08-22T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/08/numbertext-converting-numbers-into-words-in-csharp</id>
   <content type="html">&lt;p&gt;
I created a project over the weekend called &lt;a href=&quot;http://github.com/robertgreiner/NumberText&quot;&gt;NumberText&lt;/a&gt; which provides a &lt;code&gt;ToText()&lt;/code&gt; method that will return the textual representation of an integer.
&lt;/p&gt;

&lt;p&gt;
Let's say that we have the number &lt;code&gt;1234567&lt;/code&gt; and want to output &lt;code&gt;one million two hundred thirty four thousand five hundred sixty seven&lt;/code&gt;.  Using an extension method, we can call &lt;code&gt;ToText()&lt;/code&gt; directly on an integer data type which gives the perception that &lt;code&gt;ToText()&lt;/code&gt; is built right in to the .NET framework.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1536615.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;strong&gt;NumberTextExample.cs&lt;/strong&gt;

&lt;pre&gt;
using System;
using NumberText;

namespace UsageExample {
  class NumberTextExample {
    static void Main(string[] args) {
      int testNumber = 1234567;
      Console.WriteLine(testNumber.ToText());
      Console.WriteLine(98765.ToText());
      Console.ReadKey();
    }
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Getting started with NumberText is super simple.  Either add a reference to the NumberText.dll in your project, or add the NumberText.cs class in for more fine-grained control.
&lt;/p&gt;

&lt;p&gt;
NumberText is hosted on &lt;a href=&quot;https://github.com/robertgreiner/NumberText&quot;&gt;Github&lt;/a&gt; under the &lt;a href=&quot;http://ospl.ws/&quot;&gt;Open Source Public License.&lt;/a&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Some Thoughts on Automated Testing and the Impact it has on Corporate Culture</title>
   <link href="http://robertgreiner.com/2011/07/some-thoughts-on-automated-testing-and-the-impact-it-has-on-corporate-culture/"/>
   <updated>2011-07-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/07/some-thoughts-on-automated-testing-and-the-impact-it-has-on-corporate-culture</id>
   <content type="html">&lt;p&gt;
I've been thinking a lot lately on how implementing an automated testing (specifically, TDD) project affects a company.  I think these problems are much less of an issue on projects that start out using TDD from day one but will become increasingly more severe as time goes on and entropy sets in.
&lt;/p&gt;

&lt;p&gt;
There are several issues with implementing TDD as a policy at a company:

&lt;ol&gt;
  &lt;li&gt;Management Support&lt;/li&gt;
  &lt;li&gt;Measuring Success&lt;/li&gt;
  &lt;li&gt;Developer Buy In&lt;/li&gt;
  &lt;li&gt;Severe Burnout&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;h4&gt;Management Support&lt;/h4&gt;

&lt;p&gt;Management buy in is crucial.  Without it, you cannot hope to achieve the level of change needed to implement TDD.  Unfortunately, this can also be the most difficult issue to overcome.&lt;/p&gt;

&lt;p&gt;
It’s hard to justify putting forth a huge automated testing or refactoring effort without being able to add direct business value at the end of the project.  No manager is going to want to stop developing new features altogether while a suitable amount of defect fixing, refactoring, and test creation takes place.  A well articulated plan needs to be put forth to management with clear goals on what TDD will achieve before we can hope to move forward with any kind of blessing.&lt;/p&gt;

&lt;p&gt;
Not to mention that the act of performing TDD by definition requires more of an upfront investment than simply hacking out code.  This is a problem because TDD can skew existing metrics for planning time.  How would you like it if one of your employees came up to you one day and said “Sorry boss, but everything I’ve been working on for the past six months has been artificially skewing all of your data points related to how long tasks take, which makes them invalid.”
&lt;/p&gt;

&lt;p&gt;
Remember, without management support, your TDD efforts are likely to die quickly.
&lt;/p&gt;

&lt;h4&gt;Measuring Success&lt;/h4&gt;

&lt;p&gt;
Now that we have management buy in, how do we go about accurately measuring the success or failure of our testing project?  Do we use code coverage or number of tests over time?  Should we measure how many defects are being covered with our tests?  Do we have code reviews for our tests or trust the programmers to take care of everything?
&lt;/p&gt;

&lt;p&gt;
Code coverage and test creation numbers are pointless if developers are not writing good tests.  These metrics are the easiest to gather, but provide the least value.
&lt;/p&gt;

&lt;p&gt;
I think the best measurement of success is to show that the total number of defects per release decrease over time.  However, this comes with its own cost of taking a long time to prove that your efforts are paying off down the line.
&lt;/p&gt;

&lt;p&gt;
Whatever metric or combinations of metrics you end up using, remember the end goal &lt;strong&gt;release faster and allow the ability to change code with impunity.&lt;/strong&gt;
&lt;/p&gt;

&lt;h4&gt;Developer Buy In&lt;/h4&gt;

&lt;p&gt;
This is one issue I don’t think companies adequately prepare for.  Developer buy in is a huge issue and it can be extremely difficult to achieve.
&lt;/p&gt;

&lt;p&gt;
Here are some of the most common excuses that developers who do not want to start TDD will come up with.

&lt;ul&gt;
&lt;li&gt;”I don’t have time.”&lt;/li&gt;
&lt;li&gt;”My manager expects results, not tests.”&lt;/li&gt;
&lt;li&gt;”We will just let QA test for bugs.”&lt;/li&gt;
&lt;li&gt;”Now is not a good time to start.”&lt;/li&gt;
&lt;li&gt;”I don’t know how to get started.”&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
Less informed developers will view the new testing strategy as a direct attack on their day-to-day productivity and will end up fighting you every step of the way.
&lt;/p&gt;

&lt;p&gt;
I won’t drone on about the benefits of TDD.  Other blog posts do this &lt;a href=&quot;http://geekswithblogs.net/leesblog/archive/2008/04/30/the-benefits-of-test-driven-development.aspx&quot;&gt;better than I can&lt;/a&gt;.  The key point here is to expect a certain level of push-back from developers when you start implementing TDD.
&lt;/p&gt;

&lt;h4&gt;Severe Burnout&lt;/h4&gt;

&lt;p&gt;
Whether we get good developer support or not we still have the added issue of the toll implementing automated testing in a project takes on the entire development community.  The sheer amount of effort needed to sufficiently test a poorly written method with a high &lt;a href=&quot;http://en.wikipedia.org/wiki/Cyclomatic_complexity&quot;&gt;cyclomatic complexity&lt;/a&gt; is mind boggling.   
&lt;/p&gt;

&lt;p&gt;
Let’s face it.  A developer is not going to want to spend several hours mocking up a test case for a defect that takes 30 minutes to fix.
&lt;/p&gt;

&lt;p&gt;
This is an issue that can likely be mitigated by spreading out the pain across as many developers as possible and alternating work assignments between writing new code and fixing defects.
&lt;/p&gt;

&lt;h4&gt;Where do I go from here?&lt;/h4&gt;

&lt;p&gt;
I think the key to success here is to strive for continual improvement.  Nobody started out as an expert on day one.
&lt;/p&gt;

&lt;p&gt;
A great place to start is to read &lt;a href=&quot;http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;qid=1311206387&amp;sr=8-1&quot;&gt;Clean Code&lt;/a&gt; by Uncle Bob.  This is a great jumping off point and will get you started down the right path of writing clean, testable code.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Later Equals Never</title>
   <link href="http://robertgreiner.com/2011/07/later-equals-never/"/>
   <updated>2011-07-15T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/07/later-equals-never</id>
   <content type="html">&lt;p&gt;
When developing software, it is far too easy to hack something together knowing full well you can do a better job and justifying your actions by saying “meh, I’ll fix it later.”
&lt;/p&gt;

&lt;p&gt;
We’ve all been in this situation before (and I’m just as guilty as anyone else) where we have some tests that need written, some code that needs refactoring, or a pattern that needs to be implemented and we trick ourselves into thinking that we will “fix it” later. 
&lt;/p&gt;

&lt;p&gt;
Next time you find yourself thinking this way, just stop.  Stop and think about what you can do at that moment to make your code better and &lt;strong&gt;do it&lt;/strong&gt;!
&lt;/p&gt;

&lt;p&gt;
Later never comes, do the work now and have something to show for your efforts.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using bind() to Write Even Less Code with jQuery</title>
   <link href="http://robertgreiner.com/2011/06/using-bind-to-write-even-less-code-with-jquery/"/>
   <updated>2011-06-14T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/06/using-bind-to-write-even-less-code-with-jquery</id>
   <content type="html">&lt;p&gt;
Let's say our client wants us to code something up that dynamically highlights a row when the user moves the cursor in it, and restores the row back to its previous state once the mouse cursor leaves the row.
&lt;/p&gt;

&lt;p&gt;
This can be accomplished easily in jQuery by chaining together the &lt;code&gt;mouseenter()&lt;/code&gt; and &lt;code&gt;mouseleave()&lt;/code&gt; methods.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1536598.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
$('.row').mouseenter(function() {
    $(this).toggleClass('highlight');
}).mouseleave(function() {
    $(this).toggleClass('highlight');
});
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Simple, right?  This solution may work for the scenario above, but there are two significant issues staring us right in the face.
&lt;/p&gt;

&lt;p&gt;
First, this solution does not scale well.  Chaining methods together can create some really compact and fantastic functionality.  However, it can also lead to code that is difficult to read and even harder to debug.  If our customer comes back to us and wants additional functionality added to each row, we could be setting ourselves up for some problems down the line.
&lt;/p&gt;

&lt;p&gt;
Second, we have the issue of code duplication.  In the first example we have two identical calls to &lt;code&gt;toggleClass()&lt;/code&gt; which is never a good idea.
&lt;/p&gt;

&lt;p&gt;
Luckily, jQuery provides us with an elegant solution to our problem, the &lt;code&gt;bind()&lt;/code&gt; method.
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;bind()&lt;/code&gt; will attach one or more events to a set of elements. The following code will produce the same functionality as the first example.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1536601.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
$('.row').bind('mouseenter mouseleave', function(e) {
    $(this).toggleClass('highlight');
});
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;bind()&lt;/code&gt; also gives us the flexibility of adding additional events to our selector's elements without having to add any more lines of code.  All we have to do is add another space-delimited event in the &lt;code&gt;bind()&lt;/code&gt; method.
&lt;/p&gt;

&lt;p&gt;
Using &lt;code&gt;bind()&lt;/code&gt; is a subtle way to make your code cleaner and simpler without having to do any extra work.  In fact, you actually need to do less work to accomplish the same goal.  Isn't jQuery great?
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mark Cuban shows how to be a leader</title>
   <link href="http://robertgreiner.com/2011/06/mark-cuban-shows-how-to-be-a-leader/"/>
   <updated>2011-06-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/06/mark-cuban-shows-how-to-be-a-leader</id>
   <content type="html">&lt;p&gt;
Sometimes being a leader means taking a step back from the spotlight and giving someone else the oppourtunity to recieve some credit.  That's exactly what Mark Cuban did last night after his Dallas Mavericks team beat the Miami Heat to win their first ever world championship.
&lt;/p&gt;

&lt;p&gt;
Traditionally, the owner is the first to get handed the trophy after a team wins the championship, but Mark Cuban requested the trophy first be handed to Don Carter the founder and original owner of the Dallas Mavericks.
&lt;/p&gt;

&lt;iframe width=&quot;500&quot; height=&quot;314&quot; src=&quot;http://www.youtube.com/embed/UTyFvaHm3A0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;
Cuban's gesture was 100% class and it sets a great example for anyone out there wanting to be a leader.
&lt;/p&gt;

&lt;p&gt;
Congratulations Dallas for bringing home your first world championship.  May there be many more.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>What You Need to Know to Get Started With jQuery</title>
   <link href="http://robertgreiner.com/2011/05/what-you-need-to-know-to-get-started-with-jquery/"/>
   <updated>2011-05-26T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/05/what-you-need-to-know-to-get-started-with-jquery</id>
   <content type="html">&lt;p&gt;
&lt;a href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt; provides a great way for web developers to build cross-browser JavaScript enabled applications.  This article aims at getting you up and running with jQuery as quickly as possible without assuming any prior jQuery or JavaScript knowledge.  
&lt;/p&gt;

&lt;p&gt;
If you are interested in getting started with jQuery but don't know where to begin, you are in the right place.
&lt;/p&gt;

&lt;h3&gt;Step 0: Obtain jQuery&lt;/h3&gt;

&lt;p&gt;
Before we do anything, we need to get our paws on the jQuery library.  There are two ways to do this.  
&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Download jQuery&lt;/strong&gt; - The easiest way to do this is to head on over to the &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery website&lt;/a&gt; and grab the latest copy.  I think this is probably the most common way web developers get jQuery.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Use a jQuery CDN&lt;/strong&gt; - Instead of downloading jQuery and placing it on your web server, you can let someone else host the jQuery library for you.  I prefer this option.  If you want to learn how to do this (and why it's a good idea) you can check out &lt;a href=&quot;http://robertgreiner.com/2011/05/using-a-content-delivery-network-to-host-jquery/&quot;&gt;my previous post&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;The jQuery() function&lt;/h3&gt;

&lt;p&gt;
This is the path with which all jQuery goodness flows through.  Before you can truly take advantage of the power of jQuery, you first must find the HTML or CSS element that you want to start processing on.
&lt;/p&gt;

&lt;p&gt;
The &lt;code&gt;jQuery()&lt;/code&gt; function takes a selector/element/etc... that will be used later for processing.
&lt;/p&gt;

&lt;p&gt;
The nice folks at jQuery also provided a shortcut for &lt;code&gt;jQuery()&lt;/code&gt; which is &lt;code&gt;$()&lt;/code&gt;.  All of the examples you see online will contain the shorthand version.
&lt;/p&gt;

&lt;p&gt;
I'll get into this in more detail in a later post.
&lt;/p&gt;

&lt;h3&gt;Getting ready with $(document).ready()&lt;/h3&gt;

&lt;p&gt;
&lt;code&gt;$(document).ready()&lt;/code&gt; will likely be in every one of your jQuery enabled web applications. 
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;$(document)&lt;/code&gt; creates a jQuery wrapper around the document object (also known as the DOM).  This will allow you to call jQuery API methods on the web document.
&lt;/p&gt;

&lt;p&gt;
The &lt;code&gt;ready()&lt;/code&gt; method will detect when a page has loaded and is ready to use.  This will occur after all of the elements are loaded into the DOM and before any of the images are loaded.
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;ready()&lt;/code&gt; takes a handler as its parameter which contains the method to be called once the DOM is loaded.  You can specify an actual method to be called here, or simply use an anonymous method (which is the de facto standard).
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
$(document).ready(function() {
  //This is where your code goes
});
&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;Demo time&lt;/h3&gt;

&lt;p&gt;
Now that we have the basics down, it is time to see jQuery in action.  Here is a really simple HTML 5 skeleton that loads in jQuery from Microsoft's CDN  and pops up an &lt;code&gt;alert()&lt;/code&gt; window to let us know jQuery is loaded.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1536587.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
    &amp;lt;title&amp;gt;jQuery Example&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; type=&quot;text/css&quot; /&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.microsoft.com/ajax/jquery/jquery-1.6.1.min.js&quot;&amp;gt;
&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
      //$(document).ready() is cross-browser
      $(document).ready(function() {
        alert(&quot;jQuery popup!&quot;);
      });
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Congratulations!  You have just created your very first jQuery application.
&lt;/p&gt;

&lt;h3&gt;Getting to know the docs&lt;/h3&gt;

&lt;p&gt;
Before you move on from here, it might be best to take a quick look at the &lt;a href=&quot;http://docs.jquery.com/Main_Page&quot;&gt;jQuery documentation&lt;/a&gt; just to get a feel for what all jQuery is capable of and how the syntax looks.
&lt;/p&gt;

&lt;p&gt;
This part is completely optional, but chances are you'll find yourself here really soon so it might be best to get familiar with the docs sooner rather than later.
&lt;/p&gt;

&lt;h3&gt;What's Next?&lt;/h3&gt;

&lt;p&gt;
Now that we have jQuery up and running on our website, it would be super nice to start doing meaningful work.  After all, we didn't go through all of this just to display a dumb pop-up window, right?
&lt;/p&gt;

&lt;p&gt;
In one of my next articles, I'll go over the single most important piece of functionality in jQuery, the &lt;a href=&quot;http://api.jquery.com/category/selectors/&quot;&gt;selector&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using a Content Delivery Network to host jQuery</title>
   <link href="http://robertgreiner.com/2011/05/using-a-content-delivery-network-to-host-jquery/"/>
   <updated>2011-05-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/05/using-a-content-delivery-network-to-host-jquery</id>
   <content type="html">&lt;p&gt;
A &lt;a href=&quot;http://en.wikipedia.org/wiki/Content_delivery_network&quot;&gt;Content Delivery Network&lt;/a&gt; (CDN) is a system of computers that exist all over the world and cache files for users to access.  CDNs can greatly reduce the load time of a page by offering files at a higher bandwidth from a server that is physically closer to your visitor than your web server might be.
&lt;/p&gt;

&lt;p&gt;
Web developers can leverage the use of CDNs (and the good graces of Google and Microsoft) to host their jQuery Library for faster access and improved performance.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Why should I use a CDN to host jQuery?&lt;/strong&gt;

&lt;ul&gt;
  &lt;li&gt;The jQuery library download time will be reduced.  Your users in Europe will hit the CDN in Europe and your users in the US should hit the US CDN.  As a result, this will reduce your overall page load time.&lt;/li&gt;
  &lt;li&gt;The jQuery library will already be cached in the visitor's browser if they visited another website that references the same jQuery library.  In this case, the visitor won't even have to download the jQuery library.&lt;/li&gt;
  &lt;li&gt;It's free!&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;strong&gt;How do I use a CDN to host jQuery?&lt;/strong&gt;

&lt;p&gt;
Luckily for us, both Microsoft and Google already host jQuery on their CDNs.  All we have to do now is reference the hosted jQuery library.  It doesn't matter which one you use, I'm sure most people just decide based on which company they like better.
&lt;/p&gt;

&lt;p&gt;
For Microsoft:

&lt;script src=&quot;https://gist.github.com/1536573.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;head&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.microsoft.com/ajax/jquery/jquery-1.6.1.min.js&quot;&gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
For Google:

&lt;script src=&quot;https://gist.github.com/1536577.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre class=&quot;brush:html&quot; style=&quot;overflow:scroll&quot;&gt;
&amp;lt;head&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot;   src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;strong&gt;What if the CDN is down?&lt;/strong&gt;

&lt;p&gt;So, the above method is all fine and good, but what if your user can't access the CDN for some reason?  This would cause all of your super-cool jQuery features to stop working and essentially break your website causing your user to have flashbacks of the late 1990's.  How tragic!&lt;/p&gt;

&lt;p&gt;As a backup option you can still host jQuery on your web server and only reference it if your visitor somehow fails to load the CDN hosted jQuery library.&lt;/p&gt;

&lt;p&gt;Add this method below your CDN jQuery reference.  This code will check to see if jQuery is loaded and if it isn't the script will load the jQuery library from your web server.&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1536579.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre class=&quot;brush:js&quot;&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
//%3E = &amp;lt;
//%3C = &amp;gt;
//jQuery.js still needs to be on your server.
if (typeof jQuery == 'undefined') {
  document.write(unescape(&quot;%3Cscript src='jQuery.js'&quot; + &quot;type='text/javascript'%3E%3C/script%3E&quot;));
}
&lt;/script&gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now you can take advantage of the benefits of the CDN and still have a contingency plan if for some reason the CDN is unavailable.
&lt;/p&gt;

&lt;p&gt;
As a final note, this solution is really geared for internet sites where you will have users from all over the world.  For intranet sites, you are probably better of hosting jQuery locally on the intranet.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Why Can't All Software Work Like This?</title>
   <link href="http://robertgreiner.com/2011/04/why-cant-all-software-work-like-this/"/>
   <updated>2011-04-21T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/04/why-cant-all-software-work-like-this</id>
   <content type="html">&lt;p&gt;
Why can't all software work like this?  
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/heaven.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/heaven.png&quot; alt=&quot;&quot; title=&quot;heaven&quot; width=&quot;374&quot; height=&quot;478&quot; class=&quot;left&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
As users, we tend to really mess up from time to time.  Whether we forget to save our work, send an email without an attachment, or have a web form clear out all of the info you just spent 7 minutes filling out because you didn't type in a backup telephone number.  Wouldn't it be nice if software cleaned up after the messes we create?
&lt;/p&gt;

&lt;p&gt;
As programmers, we tend to only code for the &quot;happy path&quot; and convinently forget about all of the things that could (and most defnitely will) go wrong.
&lt;/p&gt;

&lt;p&gt;
What's something you could do on your current project to help clean up a user's mess? 
&lt;/p&gt;

&lt;p&gt;
To actually experience the feeling of this occurring in software, you can &lt;a href=&quot;http://robertgreiner.com/2011/04/why-cant-all-software-work-like-this/&quot;&gt;try out the actual game&lt;/a&gt;.
&lt;/p&gt;

&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;

&lt;embed src=&quot;http://www.gudmagazine.com/games/heaven/Heavenx.swf&quot; menu=&quot;false&quot; quality=&quot;high&quot; width=&quot;320&quot; height=&quot;400&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot;&gt;&lt;/embed&gt;

&lt;p&gt;
Sources: &lt;a href=&quot; http://xkcd.com/888/&quot;&gt;xkcd&lt;/a&gt; and &lt;a href=&quot;http://www.gudmagazine.com/games/heaven/&quot;&gt;Heaven the game&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shortening URLs with uURL</title>
   <link href="http://robertgreiner.com/2011/04/shortening-urls-with-uurl/"/>
   <updated>2011-04-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/04/shortening-urls-with-uurl</id>
   <content type="html">&lt;p&gt;
&lt;a href=&quot;http://uurl.co&quot;&gt;uURL&lt;/a&gt; (micro URL) is a hassle-free URL shortener that focuses on creating super-short URLs and redirecting the user to their final destination quickly and efficiently.
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/uurl.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/uurl-300x221.png&quot; alt=&quot;uURL - URL shortening service&quot; title=&quot;uURL&quot; width=&quot;300&quot; height=&quot;221&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
The key to a good URL shortening service centers around the &lt;em&gt;redirection&lt;/em&gt;.  Being able to redirect users quickly will improve usability and help them forget that they are going through a 3rd party to get to the website they want to view.
&lt;/p&gt;

&lt;p&gt;
Redirecting to another webpage is easy in ASP .NET MVC 3.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530654.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public ActionResult Index(string shortName) {

  //Get the URL from the short name.
  UrlRepository repo = new UrlRepository();
  string url = repo.GetUrl(shortName);

  //If the URL doesn't contain a parameter, return the View.
  if (string.IsNullOrEmpty(url)) {
    return View();
  }

  //Re-direct the user to their desired website.
  return Redirect(url);
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
If the user comes to the site with parameters in the URL then we know that they are interested in being redirected to another site and we don't even want to return the View to them.  By doing this we can actually redirect the user right from the Controller and skip the added hassle of forcing the user's browser to render all of the View elements.
&lt;/p&gt;

&lt;p&gt;
The source code for uURL can be found on &lt;a href=&quot;https://github.com/robertgreiner/uURL&quot;&gt;Github&lt;/a&gt; and is released under the &lt;a href=&quot;http://ospl.ws&quot;&gt;Open Source Public License&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
uURL is free to &lt;a href=&quot;http://uurl.co&quot;&gt;use and enjoy&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How to Get Your Entire Work Item History in TFS</title>
   <link href="http://robertgreiner.com/2011/04/how-to-get-your-entire-work-item-history-in-tfs/"/>
   <updated>2011-04-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/04/how-to-get-your-entire-work-item-history-in-tfs</id>
   <content type="html">&lt;p&gt;
The more I use &lt;a href=&quot;http://msdn.microsoft.com/en-us/vstudio/ff637362?ppud=4&quot;&gt;TFS&lt;/a&gt; at work the more I like it.  However, with large development teams the sheer number of work items that are created over time can be staggering and searching through them to find a particular work item you are interested in can be extremely tedious.
&lt;/p&gt;

&lt;p&gt;
Today I ran into an issue where I needed to track down some information on a work item I completed several months ago and had since been assigned to someone in our test group.  Tracking down this particular work item outside of TFS would have been a small nightmare so I decided to try and come up with a query that would pull back every single work item I have ever been associated with.
&lt;/p&gt;

&lt;p&gt;
The query to do this is actually pretty simple and requires two conditions:

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;History Contains @Me&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Or Assigned To = @Me&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/query_editor.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/query_editor-300x120.png&quot; alt=&quot;&quot; title=&quot;query_editor&quot; width=&quot;300&quot; height=&quot;120&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
&lt;em&gt;History Contains @Me&lt;/em&gt; will pull back every work item that you have ever interacted with whether you associated a changeset with it, assigned it to someone else, or simply closed the work item because it was a duplicate.  This condition alone is very powerful and will give you a complete history of every work item you have ever worked on.
&lt;/p&gt;

&lt;p&gt;
The &lt;em&gt;Assigned To = @Me&lt;/em&gt; condition is gravy at this point.  This will allow you to catch all of the work items that are assigned to you that you haven't worked on yet (and thus, built no history in).
&lt;/p&gt;

&lt;p&gt;
You can add some additional coolness to your query by sorting by specific column types.  This will allow you to scan through your work items more efficiently.
&lt;/p&gt;

&lt;p&gt;
I prefer the following columns to be sorted (in this order)

&lt;ol&gt;
  &lt;li&gt;State - Ordering by State first will keep all of your Active work items at the top of the list. &lt;/li&gt;
  &lt;li&gt;Next Action - This will keep all of your Queued and Coding work items together.&lt;/li&gt;
  &lt;li&gt;ID - This will keep the newer work items above the older ones.&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/column_options_sorting.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/column_options_sorting-300x242.png&quot; alt=&quot;&quot; title=&quot;column_options_sorting&quot; width=&quot;300&quot; height=&quot;242&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
Finally, adding a few extra columns to your query will help give you the bigger-picture context for each work item without forcing you to open it. 
&lt;/p&gt;

&lt;p&gt;
Here is what I use, your mileage may vary depending on your development workflow.
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/column_options_fields.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/column_options_fields-300x242.png&quot; alt=&quot;&quot; title=&quot;column_options_fields&quot; width=&quot;300&quot; height=&quot;242&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
By adding this &lt;em&gt;superset&lt;/em&gt; query in TFS you will be able to obtain a more complete picture of all of your past work items whether or not they are still assigned to you.  This makes things especially handy for when you are trying to hunt down details for work you completed months or years in the past.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Generating Random Data with DataBot</title>
   <link href="http://robertgreiner.com/2011/04/generating-random-data-with-databot/"/>
   <updated>2011-04-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/04/generating-random-data-with-databot</id>
   <content type="html">&lt;p&gt;
Have you ever wanted to generate hundreds of realistic looking database rows in a quick and hassle free way?  If your answer was &quot;yes&quot; then you're in luck!  
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://databot.info&quot;&gt;DataBot&lt;/a&gt; is a free online utility that lets you dynamically create a database table that resembles your development environment.  Once you have the table set up the way you want it, you can export up to 1000 rows at a time in SQL, XML, or CSV.
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/databot.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/databot-300x224.png&quot; alt=&quot;&quot; title=&quot;databot&quot; width=&quot;300&quot; height=&quot;224&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
Currently, DataBot can generate the following column types for all of your data generation needs:

&lt;ol&gt;
  &lt;li&gt;ID&lt;/li&gt;
  &lt;li&gt;First Name&lt;/li&gt;
  &lt;li&gt;Last Name&lt;/li&gt;
  &lt;li&gt;Phone Number&lt;/li&gt;
  &lt;li&gt;Birth Month&lt;/li&gt;
  &lt;li&gt;Drivers License Number&lt;/li&gt;
  &lt;li&gt;City&lt;/li&gt;
  &lt;li&gt;State&lt;/li&gt;
  &lt;li&gt;Zip&lt;/li&gt;
  &lt;li&gt;Street Number&lt;/li&gt;
  &lt;li&gt;Street Name&lt;/li&gt;
  &lt;li&gt;Apartment Number&lt;/li&gt;
  &lt;li&gt;Birth Day&lt;/li&gt;
  &lt;li&gt;Birth Month&lt;/li&gt;
  &lt;li&gt;Birth Year&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
Now, you don't have to worry about manually coming up with all of your test data and we can finally put the days of &lt;em&gt;TestUser1&lt;/em&gt;, &lt;em&gt;TestUser2&lt;/em&gt;, ... behind us.
&lt;/p&gt;

&lt;p&gt;
The source code for DataBot can be found on &lt;a href=&quot;https://github.com/robertgreiner/DataBot&quot;&gt;Github&lt;/a&gt; and is released under the &lt;a href=&quot;http://ospl.ws&quot;&gt;Open Source Public License&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
DataBot is free to &lt;a href=&quot;http://databot.info&quot;&gt;use and enjoy&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Generating an XML Document Using LINQ to XML</title>
   <link href="http://robertgreiner.com/2011/03/generating-an-xml-document-using-linq-to-xml/"/>
   <updated>2011-03-14T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/03/generating-an-xml-document-using-linq-to-xml</id>
   <content type="html">&lt;p&gt;
In the past, programmaticly creating XML documents in any programming language was extremely tedious and error-prone and .NET was no exception. Fortunately, LINQ remedied this for us in .NET 3.0.
&lt;/p&gt;

&lt;p&gt;
In this post, I will demonstrate how mind-numbingly easy it is to create an XML document using LINQ to XML.  Once you do this, you will never want to go back to the old ways of generating XML again.
&lt;/p&gt;

&lt;p&gt;
Let's start by creating an XML document that contains all of the processes a system is running.  Fortunately for us, LINQ makes this extremely easy.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530629.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
private static XDocument GetProcesses() {
    return new XDocument(
        new XElement(&quot;Processes&quot;,
            from p in Process.GetProcesses()
            orderby p.ProcessName ascending
            select new XElement(&quot;Process&quot;,
                new XAttribute(&quot;Name&quot;, p.ProcessName),
                new XAttribute(&quot;ProcessID&quot;, p.Id))));
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Easy, right?  Notice how LINQ even allows us to order the process by their IDs in a way that is easy to read and understand.
&lt;/p&gt;

&lt;p&gt;
Now, if you are used to &lt;a href=&quot;http://www.aspnettutorials.com/tutorials/database/XML-Csharp.aspx&quot;&gt;generating XML documents the old C# 2.0 way&lt;/a&gt; then this should be even more exiting because this same bit of functionality would take about four times the amount of code to accomplish.  These new LINQ classes allow us do do things much more efficiently and succinctly.  Let's dive in to them and learn how they work.
&lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;code&gt;&lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx&quot;&gt;XDocument&lt;/a&gt;&lt;/strong&gt;&lt;/code&gt; will contain your entire XML document.  You add &lt;code&gt;XElement&lt;/code&gt; and &lt;code&gt;XAttribute&lt;/code&gt; objects to your &lt;code&gt;XDocument&lt;/code&gt;.
  &lt;/li&gt;

  &lt;li&gt;
    &lt;code&gt;&lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx&quot;&gt;XElement&lt;/a&gt;&lt;/strong&gt;&lt;/code&gt; holds a single XML element.  An &lt;code&gt;XElement&lt;/code&gt; object can be added to an &lt;code&gt;XDocument&lt;/code&gt; or another &lt;code&gt;XElement&lt;/code&gt; object.
  &lt;/li&gt;

  &lt;li&gt;
    &lt;code&gt;&lt;strong&gt; &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.xml.linq.xattribute.aspx&quot;&gt;XAttribute&lt;/a&gt;&lt;/strong&gt;&lt;/code&gt; contains a single attribute name/value pair that is contained within an &lt;code&gt;XElement&lt;/code&gt; object.
  &lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
Once the &lt;code&gt;XDocument&lt;/code&gt; is generated, a simple .ToString() will return the entire document to us in a printable format.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530633.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
XDocument xdoc = GetProcesses();
Console.WriteLine(xdoc.ToString());
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
If you run this on your machine, you should get something like this:
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/linq_results.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/linq_results-300x162.png&quot; alt=&quot;&quot; title=&quot;linq_results&quot; width=&quot;300&quot; height=&quot;162&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
I uploaded this sample project to my &lt;a href=&quot;https://github.com/robertgreiner/CodeSamples/tree/master/asp-mvc/MVC3Layouts&quot;&gt;Github&lt;/a&gt; account if you want to use it to help you learn these concepts better.  The project is released under the &lt;a href=&quot;http://ospl.ws&quot;&gt;Open Source Public License&lt;/a&gt; which  means you can use it for free in any one of your projects without having to worry about licensing or attribution.  Enjoy!
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Where Did My Master Pages Go?! An Introduction to Layouts in ASP .NET MVC 3</title>
   <link href="http://robertgreiner.com/2011/03/layouts-in-asp-net-mvc-3/"/>
   <updated>2011-03-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/03/layouts-in-asp-net-mvc-3</id>
   <content type="html">&lt;p&gt;
One of the new features of ASP .NET MVC 3 is the Layout. Layouts in MVC 3 replace the master pages that we have been faithfully using over the past several years.
&lt;/p&gt;

&lt;p&gt;
I thought I'd put together this little demo to show you how to get started with Layouts in ASP .NET MVC 3.
&lt;/p&gt;

&lt;h3&gt;The Layout&lt;/h3&gt;

&lt;p&gt;
First, let's start off by creating our Layout.  You can create a new layout by right-clicking on the View folder you want to apply the layout to and select &lt;code&gt;Add new Item&lt;/code&gt; =&gt; &lt;code&gt;MVC 3 Layout Page (Razor)&lt;/code&gt;.  
&lt;/p&gt;

&lt;p&gt;
By convention, all Layout pages are prefixed with an underscore so they can be differentiated from normal Razor Views.
&lt;/p&gt;

&lt;p&gt;
As you'd expect, the Layouts you create are only accessible by the Views that are located in the same folder.  If you want your Layout to be used by all of your Views across your application, then the Layout should be placed in the Shared folder.
&lt;/p&gt;


&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/add_layout_page.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/add_layout_page.png&quot; alt=&quot;&quot; title=&quot;add_layout_page&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1571469.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;strong&gt;_Layout.cshtml&lt;/strong&gt;
&lt;pre&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;This is the Home Layout page!&amp;lt;/h1&amp;gt;
    &amp;lt;div&amp;gt;
        @RenderBody()
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
My absolute favorite thing about the Razor View Engine is its simplicity.  This is a much cleaner way to implement master page type functionality in a web application.  Notice the absence of ContentPlaceHolders and other fluff that isn't needed anymore.  Plus, you get the added benefit of using HTML 5 by default.
&lt;/p&gt;

&lt;p&gt;
The Razor View Engine uses the &lt;code&gt;@RenderBody()&lt;/code&gt; method in place of a content place holder.  Razor is smart enough to know what to include from your View s you don't have to worry about telling it.
&lt;/p&gt;

&lt;p&gt;
In this example, our Layout will include all of the necessary HTML scaffolding for our page and include an &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; tag with some information about our site.
&lt;/p&gt;

&lt;h3&gt;The Model&lt;/h3&gt;

&lt;p&gt;
Now, we can create a simple Model.  The &lt;code&gt;Person&lt;/code&gt; class will hold some primitive information about a human.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1571476.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;strong&gt;Person.cs&lt;/strong&gt;
&lt;pre&gt;
public class Person {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string TwitterHandle { get; set; }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;h3&gt;The Controller&lt;/h3&gt;

&lt;p&gt;
We can create a new Controller by right-clicking the Controllers folder and selecting &lt;code&gt;Add&lt;/code&gt; =&gt; &lt;code&gt;Controller&lt;/code&gt;.  Remember, your controllers should always end in the word &lt;em&gt;Controller&lt;/em&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/add_controller.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/add_controller.png&quot; alt=&quot;&quot; title=&quot;add_controller&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1571479.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;strong&gt;HomeController.cs&lt;/strong&gt;
&lt;pre&gt;
public class HomeController : Controller
{
    private Person p = new Person();

    public ActionResult Index()
    {
        p.FirstName = &quot;Robert&quot;;
        p.LastName = &quot;Greiner&quot;;
        p.TwitterHandle = &quot;@robert_greiner&quot;;
        return View(p);
    }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This is a standard controller that will be called when the website root is requested by the user's browser.  In here, we simply build up our model object with some data and send it to the View.
&lt;/p&gt;

&lt;h3&gt;The View&lt;/h3&gt;

&lt;p&gt;
All that is left to do now is to create our View, assign our Layout to it, and print out the contents of our &lt;code&gt;Person&lt;/code&gt; object.
&lt;/p&gt;

&lt;p&gt;
Right-click the Home folder in your project and click &lt;code&gt;Add&lt;/code&gt; =&gt; &lt;code&gt;View&lt;/code&gt; to set the options for our new View.  We will want to create a strongly-typed view and set the Layout page to the one we created at the beginning of this post.  Your options should roughly match the screenshot below.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/add_view.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/add_view.png&quot; alt=&quot;&quot; title=&quot;add_view&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;p&gt;

&lt;p&gt;
Once our view is created, we can add the code needed to print out the contents of our Person object.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1571481.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;strong&gt;Index.cshtml&lt;/strong&gt;
&lt;pre&gt;
@model MVC3Layouts.Models.Person

@{
    ViewBag.Title = &quot;Index&quot;;
    Layout = &quot;~/Views/Home/_Layout.cshtml&quot;;
}

&amp;lt;h2&gt;Index&amp;lt;/h2&gt;

&amp;lt;h3&gt;Person Information&amp;lt;/h3&gt;
@Model.FirstName&amp;lt;br /&gt;
@Model.LastName&amp;lt;br /&gt;
@Model.TwitterHandle&amp;lt;br /&gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;@model MVC3Layouts.Models.Person&lt;/code&gt; will strongly type our View to the &lt;code&gt;Person&lt;/code&gt; class.  This allows us to directly reference the members of &lt;code&gt;Person&lt;/code&gt; directly from the &lt;code&gt;Model&lt;/code&gt; object.
&lt;/p&gt;

&lt;p&gt;
Notice how clean Razor allows us to keep our Views?  This new syntax allows the web developer to focus on what is important (good markup and content) without getting bogged down with heavy domain-specific syntax.
&lt;/p&gt;

&lt;h3&gt;The Results&lt;/h3&gt;

&lt;p&gt;
This View will render the following HTML page:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/output.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/output.png&quot; alt=&quot;&quot; title=&quot;output&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
And that's it!  We now have a fully-functioning ASP .NET MVC 3 site that uses Layouts.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Enabling ASP .NET MVC 3 on Shared Web Hosting</title>
   <link href="http://robertgreiner.com/2011/03/enabling-asp-net-mvc-3-on-shared-web-hosting/"/>
   <updated>2011-03-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/03/enabling-asp-net-mvc-3-on-shared-web-hosting</id>
   <content type="html">&lt;p&gt;
I recently installed the new &lt;a href=&quot;http://www.asp.net/mvc/mvc3&quot;&gt;ASP .NET MVC 3&lt;/a&gt; framework I could start checking out some of its new features.  Unfortunately, most of the shared hosting platforms out there (Godaddy, etc.) do not yet support ASP .NET MVC 3 and typically don't provide a time-frame for when they will make it available to their customers.  This is an obvious problem for anyone wanting to use their existing Windows hosting accounts to host one of their newly created ASP .NET MVC 3 projects.
&lt;/p&gt;

&lt;p&gt;
Luckily, there is a workaround if your host already supports some level of ASP .NET MVC.  Most shared Windows hosting accounts already support ASP .NET MVC 2 by now, and if they don't, then you are probably better of finding a new host.
&lt;/p&gt;

&lt;p&gt;
In order to get your ASP .NET MVC 3 application working with your existing Windows hosting account you simply need to package some of the MVC 3 assemblies from your development machine along with your web application.  The following DLLs should be added to the &lt;code&gt;~/bin&lt;/code&gt; directory of your MVC 3 application.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies&lt;/strong&gt;
&lt;pre&gt;
Microsoft.Web.Infrastructure.dll
System.Web.Helpers.dll
System.Web.Razor.dll
System.Web.WebPages.Deployment.dll
System.Web.WebPages.dll
System.Web.WebPages.Razor.dll
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\&lt;/strong&gt;
&lt;pre&gt;
System.Web.Mvc.dll
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
NOTE: these paths are for 64-bit versions of Windows.  If you are still running 32-bit Windows, simply remove the &lt;code&gt;(x86)&lt;/code&gt; after Program Files.
&lt;/p&gt;

&lt;p&gt;
Did this work for you?  Let me know!
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Converting Numbers Between Bases in .NET</title>
   <link href="http://robertgreiner.com/2011/02/converting-numbers-between-bases-in-net/"/>
   <updated>2011-02-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/02/converting-numbers-between-bases-in-net</id>
   <content type="html">&lt;p&gt;
I was goofing off last night when I was waiting for my wife to get out of class and came up with &lt;a href=&quot;http://basemaster.net&quot;&gt;BaseMaster&lt;/a&gt;.  BaseMaster is a simple online base conversion utility that takes a (valid) number from one base and converts it to another.
&lt;/p&gt;

&lt;p&gt;
It turns out that converting numbers between bases is extremely easy in .NET.  Microsoft was nice enough to overload the &lt;code&gt;Convert.ToInt64(num, base)&lt;/code&gt; method to allow conversions to base 10.  Conversely, the &lt;code&gt;Convert.ToString(num, base)&lt;/code&gt; medhod will convert a base 10 number to a specified base.  The only catch is that the bases have to be &lt;code&gt;2, 8, 10, or 16&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
These two methods allow a pretty easy conversion method to be written that will handle all of the conversions I'm interested in.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530607.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public static string Convert(string num, int fromBase, int toBase) {
  string result = &quot;&quot;;
  try {
    long decValue = System.Convert.ToInt64(num, fromBase);
    result = System.Convert.ToString(decValue, toBase);
  } catch (System.Exception) {
    result = &quot;ERR&quot;;
  }
  return result.ToUpper();
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
The key here is to convert the user-input number to base 10 and then convert the base 10 number to the desired base.  This way you don't have to worry about catching every special case where a user would want to convert from one base to another.
&lt;/p&gt;

&lt;p&gt;
Also, a &lt;code&gt;System.FormatException&lt;/code&gt; will get thrown if the input number has invalid characters for it, so you should keep that in mind if you ever need to do something similar.
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2011/base_master.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/base_master-300x300.png&quot; alt=&quot;&quot; title=&quot;base_master&quot; width=&quot;300&quot; height=&quot;300&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
The remaining source code can be found on &lt;a href=&quot;http://github.com/robertgreiner/BaseMaster&quot;&gt;Github&lt;/a&gt; and is released under the &lt;a href=&quot;http://ospl.ws&quot;&gt;Open Source Public License&lt;/a&gt;.  
&lt;/p&gt;

&lt;p&gt;
BaseMaster is free to use and enjoy.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Efficient Page Reloading in ASP .NET</title>
   <link href="http://robertgreiner.com/2011/02/efficient-page-reloading-in-asp-net/"/>
   <updated>2011-02-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/02/efficient-page-reloading-in-asp-net</id>
   <content type="html">&lt;p&gt;
Today I ran into a situation where I needed to change some session state information on an ASP page I was developing and have it instantly update the current page.  This can be accomplished with the following code: 
&lt;/p&gt;

&lt;p&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;
//Stop processing and reload the current page
Server.Transfer(Request.Path);
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;Server.Transfer()&lt;/code&gt; transfers execution to a specified ASP page that does not force a new page request.  This is more efficient than the old &lt;code&gt;Response.Redirect()&lt;/code&gt; way of doing things.
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;Request.Path&lt;/code&gt; will get the path of the current request.  Which, more simply put, will point straight back to the page you are currently on.
&lt;/p&gt;

&lt;p&gt;
Put these two together and you have a recipe for success when you want to make your page stop processing and begin again.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Need a License for Your Project? Try the Open Source Public License!</title>
   <link href="http://robertgreiner.com/2011/02/need-a-license-for-your-project-try-the-open-source-public-license/"/>
   <updated>2011-02-18T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/02/need-a-license-for-your-project-try-the-open-source-public-license</id>
   <content type="html">&lt;p&gt;
There are plenty of fantastic &lt;a href=&quot;http://en.wikipedia.org/wiki/GNU_General_Public_License&quot;&gt;open&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Microsoft_Public_License&quot;&gt;source&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/MIT_license&quot;&gt;licenses&lt;/a&gt; out there.  They are created to make sure great developers can write and release their code to the public without having to worry about getting taken advantage of.  These licenses are ultra-detailed and their creators do their level best to make sure every possible scenario is covered and no loopholes exist.
&lt;/p&gt;

&lt;p&gt;
But, what if your project is so small that you really don't care about who copies your code?  What if you post a snippet of code on your blog that you want everyone to use free-of-charge?  What if your project is so awesome that you want to give it away for free and you don't even care if you get credit for it or not?  In any one of these cases, the above license options may be a bit more than you need for your project.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Enter the &lt;a href=&quot;http://ospl.ws&quot;&gt;Open Source Public License&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
The OSPL allows you to release your digital creations to the world completely free (as in freedom and beer) without worrying about a more complex license restricting usage.  This license was designed with smaller projects in mind that are intended to be completely free.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
OPEN SOURCE PUBLIC LICENSE
Version 1, October 2010

http://www.ospl.ws

Copyright (C) 2010 Robert Greiner
robert@robertgreiner.com

Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.

OPEN SOURCE PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. The work released under this license can be used, modified, distributed, and/or released free of charge and royalty free.
1. No attribution is required for any reason during the use of the work released under this license.
2. There is no warranty provided for the work released under this license.
3. The copyright holder and any modifier cannot be held liable for any damages occurred during the use of this work.
&lt;/pre&gt;
&lt;/p&gt;

&lt;h1&gt;FAQ&lt;/h1&gt;

&lt;p&gt;
&lt;strong&gt;Why do I need this license?  Can't I just post my code on the internet for all to use?&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Absolutely not.  By default anything you write yourself and post online is licensed and copyrighted to you specifically.  Other people or companies can not legally use your code without your permission.
&lt;/p&gt;

&lt;p&gt;
Check out this &lt;a href=&quot;http://en.wikipedia.org/wiki/Free_content&quot;&gt;Wikipedia page&lt;/a&gt; on Free Content to learn more.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Is this the best option for all software projects?&lt;/strong&gt;  
&lt;/p&gt;

&lt;p&gt;
Of course not. This is just one of many options that you have to make sure your creations get shared at the exact level you are comfortable with.  If this license is &lt;em&gt;too open&lt;/em&gt; for you to feel comfortable, then you should definitely not use it.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Can I use this license on projects that are not code related?&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Of course! This license was designed for all digital creations, not just source code.
&lt;/p&gt;

Enjoy.</content>
 </entry>
 
 <entry>
   <title>How to set a default browser when debugging in VisualStudio 2010</title>
   <link href="http://robertgreiner.com/2011/02/how-to-set-a-default-browser-when-debugging-in-visualstudio-2010/"/>
   <updated>2011-02-16T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/02/how-to-set-a-default-browser-when-debugging-in-visualstudio-2010</id>
   <content type="html">&lt;p&gt;
I am constantly switching &lt;em&gt;preferred&lt;/em&gt; browsers for my day-to-day browsing.  But, when I am writing web applications I actually prefer my browser to be Internet Explorer for one simple reason: &lt;strong&gt;it saves time&lt;/strong&gt;. 
&lt;/p&gt;

&lt;p&gt;
Visual Studio knows when you close down the IE window that is running your current application and is nice enough to stop the debugger for you.  This saves time and effort when developing software because you don't have to manually click stop every time you are finished debugging.  And, when you are writing code, reducing the time between debug iterations can be a huge boost to your productivity.
&lt;/p&gt;

&lt;p&gt;
This presents a problem for most of us, since we typically use default browsers other than IE.  However, Visual Studio is nice enough to allow us to set a default browser for opening files from within Visual Studio (including debugging.)
&lt;/p&gt;


&lt;p&gt;
Follow these steps if you want to change your default browser in Visual Studio:
&lt;ol&gt;
&lt;li&gt;Right-click any ASP Page or Windows Form in the Solution Explorer.&lt;/li&gt;
&lt;li&gt;Select &lt;em&gt;Browse With...&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Highlight your preferred browser in the box on the left.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Set as Default&lt;/em&gt; button.  You can also set the default size here if you wish.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Browse&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Done!&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
Now, you can have different default browsers for development and web surfing.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Good Practices to Follow Before Checking in Source Code</title>
   <link href="http://robertgreiner.com/2011/02/good-practices-to-follow-before-checking-in-source-code/"/>
   <updated>2011-02-08T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/02/good-practices-to-follow-before-checking-in-source-code</id>
   <content type="html">&lt;p&gt;
Here are a few nuggets of wisdom to consider before you check in source code to your version control system.  Like any other software development system/rule-set/paradigm, this is merely advice.  If you want to do everything on this list, great.  If you want to use part of it, feel free.  If you think it's lame and don't want to follow any of the advice on this list, that's fine also.
&lt;/p&gt;

&lt;ul&gt;

  &lt;li&gt;
    &lt;strong&gt;Always &lt;em&gt;Get latest&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt; - You should never try to check in code that is written on an old codebase.  Get latest for your whole project and build it before you try checking anything in.
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strong&gt;Look at the diffs of the files you are about to check in&lt;/strong&gt; - Did you miss something?  Are all of the files there?  Do you remove all of your debug code?
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strong&gt;Do not check in commented out code&lt;/strong&gt; - if you need that code later, you can look at the revision history of that file and get it back.  There is no need to have commented out code in your production system anymore.
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strong&gt;Run unit tests&lt;/strong&gt; - If you have unit tests, you should run them at least every time you are ready to check in your files.  Some developers might argue that you should run them more often, I would argue that this is a minimum.
  &lt;/li&gt;

  &lt;li&gt;
    &lt;strong&gt;Write check-in comments&lt;/strong&gt; - Always add relevant comments to your check-ins.  What did this new code accomplish?  Did you fix something or add a new feature?
  &lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;
Did I miss something?  Let me know and I'll add it to the list.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Now I know how they felt when sliced bread came out</title>
   <link href="http://robertgreiner.com/2011/01/now-i-know-how-they-felt-when-sliced-bread-came-out/"/>
   <updated>2011-01-27T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/01/now-i-know-how-they-felt-when-sliced-bread-came-out</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/sliced-bread.jpg&quot; alt=&quot;&quot; title=&quot;Best Thing Since Sliced Bread!&quot; style=&quot;width:274px;height:300px;&quot; class=&quot;left&quot; /&gt; 
Before sliced bread version 1.0 was released everyone just cut their own bread manually without giving it a second thought (well, except for the guy who invented the machines to automatically slice the bread I suppose).  Now, at the time, it probably didn’t seem like such a big deal.  After all, in the grand scheme of things, what’s an extra minute or two when preparing dinner?  That frame of mind is the same reason I think most people don't shell out the extra cash to buy a &lt;a href=”http://en.wikipedia.org/wiki/Solid_state_drive”&gt;solid state drive&lt;/a&gt; for their primary machine.  After all, what's a few extra milliseconds to open or save a file?
&lt;/p&gt;

&lt;p&gt;
I finally decided to splurge one week and buy a solid state drive.  I had been putting it off for some time, even after reading &lt;a href=”http://www.hanselman.com/blog/UpgradingMyLenovoW500ToAOCZVertex250GBSATAIISolidStateDiskSSD.aspx”&gt;rave reviews&lt;/a&gt; discussing the improved performance, durability, and coolness that SSDs bring to the table.
&lt;/p&gt;

&lt;p&gt;
After doing some research online I came across the &lt;a href=”http://www.amazon.com/gp/product/B004BDORNI/ref=wms_ohs_product”&gt;Kingston SSDNow V100 128GB SATA II 3GB/s 2.5 Inch Solid State Drive SV100S2/128GZ&lt;/a&gt; which seemed like the best mix of cost and storage space.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Technical Details&lt;/strong&gt;
&lt;ul&gt;
  &lt;li&gt;Brand Name: Kingston&lt;/li&gt;
  &lt;li&gt;Model: SV100S2/128GZ&lt;/li&gt;
  &lt;li&gt;Hard Disk Size: 128 GB&lt;/li&gt;
  &lt;li&gt;Warranty: 3 years warranty&lt;/li&gt;
  &lt;li&gt;Hardware Platform: PC&lt;/li&gt;
  &lt;li&gt;Hard Disk Description: Internal hard drive&lt;/li&gt;
  &lt;li&gt;Form Factor: 2.5-Inch&lt;/li&gt;
  &lt;li&gt;Width: 2.8 inches&lt;/li&gt;
  &lt;li&gt;Depth: 3.9 inches&lt;/li&gt;
  &lt;li&gt;Height: 0.4 inches&lt;/li&gt;
  &lt;li&gt;Weight: 2.8 Ounces&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/kingston_ssd.jpg&quot; alt=&quot;&quot; title=&quot;Kingston Solid State Drive&quot; class=&quot;center&quot; /&gt;

&lt;p&gt;
I must say, after about a week of solid usage this thing is well worth the money.  I’ve always thought my laptop was very responsive (and by most standards, it was) but adding the SSD makes everything even faster.  
&lt;/p&gt;

&lt;p&gt;
One of the keys to improving your system’s performance is to improve bottlenecks.  And, as anyone with more than 5 minutes of technical experience will tell you, the hard drive is orders of magnitude slower than any other component on your computer.   Now, you may not really notice the hard drive latency hitting your productivity during your normal day-to-day usage, but those milliseconds will keep adding up over time and end up improving your productivity that much more in the long run.
&lt;/p&gt;

&lt;p&gt;
Also, if you upgrade to a solid state drive and aren’t running Windows 7 you might want to check out &lt;a href=”http://www.tweaktown.com/articles/3116/tweaktown_s_solid_state_drive_optimization_guide/index.html”&gt;some of the articles on optimizing your operating system&lt;/a&gt; for use with solid state drives.  There are a few OS features you won’t need anymore.  Goodbye defrag!
&lt;/p&gt;

&lt;p&gt;
So, if you’re like me and have been on the fence for a while, let me just offer this additional piece of advice:  &lt;strong&gt;do it!&lt;/strong&gt; You don’t want to keep slicing your bread manually, do you?
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;http://blog.marcusstuartvannini.com/wp-content/uploads/2010/07/001-sliced-bread.jpg&quot;&gt;http://blog.marcusstuartvannini.com/wp-content/uploads/2010/07/001-sliced-bread.jpg&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Pick Any Two</title>
   <link href="http://robertgreiner.com/2011/01/pick-any-two/"/>
   <updated>2011-01-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2011/01/pick-any-two</id>
   <content type="html">&lt;p&gt;
I saw this image over Graphic Design and think the same excuse is made when developing software.
&lt;/p&gt;

&lt;img src=&quot;http://robertgreiner.com/uploads/images/2011/graphic_design.jpg&quot; alt=&quot;&quot; title=&quot;Graphic Design&quot; width=&quot;480&quot; height=&quot;621&quot; class=&quot;center&quot; /&gt;

&lt;p&gt;
I know it would be impossible to keep all three categories running full-time, but I do think there are situations where teams can rise to the occasion and provide outstanding value at a decent cost by a certain deadline.
&lt;/p&gt;

&lt;p&gt;
If this is you right now, see if you can impress everyone and save the day.  If you are over a team that is currently dealing with this, inspire them to achieve their goals, but beware of burnout.
&lt;/p&gt;

&lt;div style=&quot;font-size: 10px;&quot;&gt;&lt;a href=&quot;http://thirdeyehush.tumblr.com/post/2625152199&quot;&gt;Source&lt;/a&gt;&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Merry Christmas!</title>
   <link href="http://robertgreiner.com/2010/12/merry-christmas/"/>
   <updated>2010-12-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/12/merry-christmas</id>
   <content type="html">&lt;p&gt;
This is a little early, but I'll be pretty busy moving to a new place before the end of the year and I don't know how much blogging time I'll have.
&lt;/p&gt;

&lt;p&gt;
Hopefully this can hold you over.
&lt;/p&gt;

&lt;p&gt;
Merry Christmas!
&lt;/p&gt;

&lt;img src=&quot;http://imgs.xkcd.com/comics/tree.png&quot; alt=&quot;&quot; title=&quot;XKCD Christmas&quot; class=&quot;aligncenter size-full&quot; /&gt;</content>
 </entry>
 
 <entry>
   <title>Putting the Three Rules of TDD Into Practice</title>
   <link href="http://robertgreiner.com/2010/12/putting-the-three-rules-of-tdd-into-practice/"/>
   <updated>2010-12-08T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/12/putting-the-three-rules-of-tdd-into-practice</id>
   <content type="html">&lt;p&gt;
I've been thinking alot lately about how to &lt;a href=&quot;http://robertgreiner.com/2010/11/practice-better/&quot;&gt;practice better&lt;/a&gt; at software development.  One of the things I want to get really good at is unit testing.  I think unit testing is vital to the success of a software project. Good unit tests can reduce your overall debug time and can help give you confidence that your code changes aren't breaking anything.  However, as anyone who has written more than four lines of code can attest to, writing unit tests is similar to eating vegetables or working out.  You know it's good for you and can pay huge dividends in the future, yet we still don't do it.
&lt;/p&gt;

&lt;p&gt;
So, the obvious question here is: if unit tests are so good, what is stopping us from writing them?  Assuming that we can go ahead and agree to the assertion (see what I did there?) that unit tests are indeed helpful and worth writing (which is a controversial statement in itself), I think the main reason developers neglect writing tests is due to a lack of standardization.  Developers just don't know where to get started sometimes.  When do I write tests?  How many tests do I write?  When do I run my tests?  What if I know a change works, do I write a test for it anyway?
&lt;/p&gt;

&lt;p&gt;
This is where Uncle Bob's article can really help us out.  Here, Uncle Bob outlines three very specific rules that can clear up any of the questions you may have been struggling with.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd&quot;&gt;The Three Rules of TDD&lt;/a&gt;

&lt;ol&gt;
  &lt;li&gt;You are not allowed to write any production code unless it is to make a failing unit test pass.&lt;/li&gt;
  &lt;li&gt;You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.&lt;/li&gt;
  &lt;li&gt;You are not allowed to write any more production code than is sufficient to pass the one failing unit test.&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
At first, trying to follow these rules is going to be pretty tough.  Very tough actually.  I'm still trying to get into the test-first mindset and it's going to be difficult to break away from all those years of doing development a specific way. However, I know that this is an area of development that I am weak in, and anything I can do to improve how well I write unit tests is welcome.
&lt;/p&gt;

&lt;p&gt;
Ready to get started?  Uncle Bob suggests checking out &lt;a href=&quot;http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata&quot;&gt;The Bowling Game Kata&lt;/a&gt;.  Check it out and let me know what you think.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Fixing the "TypeInitializationException was unhandled" exception</title>
   <link href="http://robertgreiner.com/2010/11/fixing-the-typeinitializationexception-was-unhandled-exception/"/>
   <updated>2010-11-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/11/fixing-the-typeinitializationexception-was-unhandled-exception</id>
   <content type="html">&lt;p&gt;
I ran into this issue today so I thought I'd share.
&lt;/p&gt;

&lt;p&gt;
According to the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.typeinitializationexception.aspx&quot;&gt;docs&lt;/a&gt;:
&lt;/p&gt;

&lt;p&gt;
&lt;blockquote&gt;
When a class initializer fails to initialize a type, a TypeInitializationException is created and passed a reference to the exception thrown by the type's class initializer. The InnerException property of TypeInitializationException holds the underlying exception.

TypeInitializationException uses the HRESULT COR_E_TYPEINITIALIZATION, that has the value 0x80131534.

For a list of initial property values for an instance of TypeInitializationException, see the TypeInitializationException constructors.
&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
This error occured in my project because I had elements in my App.config file that were not recognized. This is most commonly caused by using an invalid setting in the config file.  
&lt;/p&gt;

&lt;p&gt;
Once I removed the invalid elements, everything worked fine again.
&lt;/p&gt;

&lt;p&gt;
If you are having this problem, double-check your App.config file and make sure you haven't included anything wrong.
&lt;/p&gt;

&lt;p&gt;
Happy debugging, I hope this solves your problem.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Practice Better</title>
   <link href="http://robertgreiner.com/2010/11/practice-better/"/>
   <updated>2010-11-22T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/11/practice-better</id>
   <content type="html">&lt;p&gt;
I read a few really great articles this week that completely changed my perspective on both the amount of time and effort I spend on practicing my craft as well as the methods I go about developing software from day to day.
&lt;/p&gt;

&lt;p&gt;
The first article I read was &lt;a href=&quot;http://sites.google.com/site/steveyegge2/being-the-averagest&quot;&gt;Being the Averagest&lt;/a&gt; by one of my heroes; &lt;a href=&quot;http://steve-yegge.blogspot.com/&quot;&gt;Steve Yegge&lt;/a&gt;.  This is a great article that will be sure to make even the most talented developer a little uncomfortable.  Steve's article shows us that programmers grow more complacient over time because there is no way to quantitatively measure how good of a programmer you are.  This leads to a false sense of awesomeness and keeps us from reaching our full potential.
&lt;/p&gt;

&lt;p&gt;
Steve says that humans tend to practice what they are already comfortable with instead of pushing the boundaries to actually &lt;strong&gt;make significant progress&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;blockquote&gt;
I think I should reiterate a distinction I made earlier: programmers usually are learning new things on the job, but their self-directed study is typically just reinforcing what they're already comfortable with. C++ programmers learn more C++, Java programmers learn more Java, Perl programmers learn more Perl. Linux users ignore Windows and vice-versa. UI developers don't learn tools or systems programming, and vice-versa. People stay in their comfort zones.

This isn't just true of programmers, of course. As a guitarist, I constantly have to fight the urge to practice the way all bad guitarists do worldwide; namely, to play the songs you already know from beginning to end, hoping that next time through you won't make the same mistakes. With that style, all you're doing is practicing your mistakes. The right way to practice a piece is a lot harder and far less instantly gratifying, but it's the only way to move up to the next level as a guitarist. (That took me a decade to figure out as well, even though people all around me had been trying to tell me. It took an embarrassing lesson with David Russell, a grandmaster guitarist, before I finally paid attention.)

People pushing within their comfort zone may feel like they're learning more, but it's really just more of the same. And it's highly unlikely to push them past the Blub Threshold and into a higher stack-rank bucket, or into a different job category or job level.
&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
So, the key here is to &lt;em&gt;practice better&lt;/em&gt;.  We have to get out of our comfort zones and work on things that will drastically improve our understanding of programming/math/science/etc.  
&lt;/p&gt;

&lt;p&gt;
How do you practice better?  Simple, by &lt;strong&gt;reading&lt;/strong&gt; and &lt;strong&gt;writing&lt;/strong&gt;.  I think that technical books are a fantastic resource and much more important that people give them credit for.  Sure you can find almost any type of tutorial online that will help you on your current project, but what if you want a much deeper understanding of the source material?  Stuffing your brain full of different language features that you normally wouldn't encounter is a great way to learn things that you normally wouldn't.
&lt;/p&gt;

&lt;p&gt;
Next, and most importantly, we need to actually &lt;strong&gt;write code&lt;/strong&gt; and lots of it.  Reading in our profession just isn't enough, we need to reinforce that knowledge by actually doing something.  It is only though doing that we actually begin to understand what is really going on.
&lt;/p&gt;

&lt;p&gt;
Now that we know what needs to be done, how do we put it into practice?  I think working towards a certification is a step in the right direction.  Certifications are tricky because you are never quite sure how much value the actual piece of paper  will give to your career.  Most people think that their time could be better spent doing something else.  However, in this case, it's not about the piece of paper at all, &lt;strong&gt;it's about the journey&lt;/strong&gt;.  At the end of the day, when you get a technical certification, you have completed all of the necessary steps that says &lt;em&gt;this person has an in-depth understanding of X&lt;/em&gt;.
&lt;/p&gt;

&lt;p&gt;
Another great way to improve our existing skillset is to practice a new development methodology.  One promising article I came across is Uncle Bob's &lt;a href=&quot;http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd&quot;&gt;Three  Rules of Test Driven Design&lt;/a&gt;.  I have been looking for a way to improve the quality and consistency of my unit tests both at work and on personal projects and I think this is a great way to get started.  Now, do I think TDD will magically make every software project a success?  &lt;em&gt;Of course not&lt;/em&gt;.  However, when trying to improve a specific skillset, it can be useful to practice a new methodology and make your own decisions when to use it and when it can be ignored.
&lt;/p&gt;

&lt;p&gt;
We need to constantly be looking for ways to practice and improve our technical skills, especially in such a fast moving industry.  Hopefully this article got you thinking about what you can do to practice better.  &lt;em&gt;Remember, this isn't an overnight thing, it's more of a &lt;a href=&quot;http://norvig.com/21-days.html&quot;&gt;ten year&lt;/a&gt; thing.&lt;/em&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using jQuery to Dynamically Disable and Enable an Element</title>
   <link href="http://robertgreiner.com/2010/11/using-jquery-to-dynamically-disable-and-enable-an-element/"/>
   <updated>2010-11-16T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/11/using-jquery-to-dynamically-disable-and-enable-an-element</id>
   <content type="html">&lt;p&gt;
There are a few situations where it might be benficial to disable input controls on a form.  You can enable and disable elements on a page dynamically with jQuery by setting their &lt;em&gt;attributes&lt;/em&gt; accordingly.
&lt;/p&gt;

&lt;p&gt;
&lt;h3&gt;Disable a Control&lt;/h3&gt;

An element can be disabled by using jQuery's &lt;a href=&quot;http://api.jquery.com/attr/#attr2&quot;&gt;attr()&lt;/a&gt; method.  Let's use a credit card field as an example.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
    //attr(attributeName, value);
    //this is equivalent to &amp;lt;some_tag disabled=&quot;disabled&quot; ...&amp;gt;
    $('.creditCard').attr('disabled', 'disabled');
&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;Enable a Control&lt;/h3&gt;

&lt;p&gt;
To re-enable the element, the &lt;a href=&quot;http://api.jquery.com/removeAttr/&quot;&gt;removeAttr()&lt;/a&gt; method should be used.  This will completely remove the &lt;em&gt;disabled&lt;/em&gt; attribute from the element instead of just blanking it out.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
    $('.creditCard').removeAttr('disabled');
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
This adds another tool to help improve the overall user experience and reduce the chances for input error.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Which Programming Language Should I Use to Build My Application?</title>
   <link href="http://robertgreiner.com/2010/10/which-programming-language-should-i-use-to-build-my-application/"/>
   <updated>2010-10-27T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/10/which-programming-language-should-i-use-to-build-my-application</id>
   <content type="html">&lt;p&gt;
&lt;em&gt;&quot;Which programming language should I use for X?&quot;&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
My dad used to say &lt;em&gt;&quot;If I had a dollar for every time I've heard that question, I would retire tomorrow.&quot;&lt;/em&gt; and, I have to admit, I'm starting to empathise more and more every time I hear this criminally overasked question.
&lt;/p&gt;

&lt;p&gt;
For those of you who came here seeking an answer, allow me to save you some time and frustration: &lt;strong&gt;It doesn't matter!&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Don't believe me? Let's take a look at just a small subset of hit applications and what technology they use:
&lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com&quot;&gt;StackOverflow&lt;/a&gt; - ASP .NET MVC&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://youtube.com&quot;&gt;YouTube&lt;/a&gt; - Python&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://reddit.com&quot;&gt;Reddit&lt;/a&gt; - Python / Django&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://facebook.com&quot;&gt;Facebook&lt;/a&gt; - PHP&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt; - Ruby on Rails&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://worldofwarcraft.com&quot;&gt;World of Warcraft&lt;/a&gt; - C++ / LUA &lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.android.com/&quot;&gt;Android OS&lt;/a&gt; - Java&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
See where this is going?  All of these applications do vastly different things and use different technologies but they all have one thing in common.  &lt;strong&gt;Awesomeness&lt;/strong&gt;.  They all do at least one thing really well and that provides the &lt;em&gt;secret sauce&lt;/em&gt; to their success.
&lt;/p&gt;

&lt;p&gt;
The hard part of making any software project successful is &lt;strong&gt;building a community&lt;/strong&gt;, you know, the people who are going to actually &lt;strong&gt;use your software&lt;/strong&gt; and (hopefully) &lt;strong&gt;fork over their hard earned cash&lt;/strong&gt;.  Focus on building great software that improves the lives of your target users and watch everything else fall into place.
&lt;/p&gt;

&lt;p&gt;
Remember, nobody cares that Facebook was written in PHP, they just want to be able to update their relationship status and cyber-spy on all of their friends.
&lt;/p&gt;

&lt;p&gt;
Your project will probably have the same chances of success by picking a programming language randomly out of a hat as it would if you obsess for months over finding the &lt;em&gt;&quot;perfect technology&quot;&lt;/em&gt;.
&lt;/p&gt;

&lt;p&gt;
If you are building the project yourself, pick the language you are most familiar with.  If you are hiring developers to build it for you, find a really smart one to get your project off the ground and let her decide.
&lt;/p&gt;

&lt;p&gt;
Stop obsessing over technology and &lt;strong&gt;start buliding something&lt;/strong&gt;, get it released, and get some real feedback.
&lt;/p&gt;

&lt;p&gt;
Rinse and repeat.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>10,000 StackOverflow Rep!</title>
   <link href="http://robertgreiner.com/2010/10/10000-stackoverflow-rep/"/>
   <updated>2010-10-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/10/10000-stackoverflow-rep</id>
   <content type="html">&lt;p&gt;
I finally did it!  After 432 days, 11 Questions, and 272 answers I finally reached a reputation score of 10,000.  This was a goal I set out for myself since I first learned about StackOverflow.
&lt;/p&gt;


&lt;h3&gt;Why is 10k rep so important?&lt;/h3&gt;

&lt;p&gt;
For those of you who don't know, StackOverflow uses reputation score as a means to gauge a level of &quot;trust&quot; the system has for each user.  For instance, you don't have the right to vote up a question until you achieve 15 reputation.  Want to help out by editing poorly written post?  You need 2,000 reputation first.  As you keep participating in StackOverflow and build more and more reputation additional &lt;a href=&quot;http://stackoverflow.com/privileges&quot;&gt;privileges&lt;/a&gt; become available to you.
&lt;/p&gt;

&lt;p&gt;
The final milestone in this reputation scheme is at 10,000 reputation.  At this level, you gain the highest level of priviledge possible without being elected a &lt;a href=&quot;http://blog.stackoverflow.com/2009/05/welcome-new-community-moderators/&quot;&gt;community moderator&lt;/a&gt;.
&lt;/p&gt;


&lt;h3&gt;How I achieved 10,000 reputation&lt;/h3&gt;

&lt;p&gt;
This topic has been slightly controversial over the short lifetime of StackOverflow.  I've read a few blog posts (not important enough to link here) providing dishonest tactics for maximizing your reputation gained per question.  However, in my mind, this is equivelant to cheating in school.  Sure, you may get a better grade for it, but what does it really buy you?  If you graduate and don't know how to be productive in your industry, then you have only failed yourself.  Not to mention what happens if you get caught.  Your credibility will be shot and all of your hard work and effort will amount to nothing.
&lt;/p&gt;

&lt;p&gt;
That being said, I will provide 3 tips on how to (honestly) gain 10,000 reputation on Stackoverflow:
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Be curtious.&lt;/strong&gt;  This sound simple enough, but a little kindness goes a long way.  Remember, the people asking these questions are having real problems that they are looking to you to help them with.  A little kindness goes a long way.  Also, if someone has a better answer than you, or they gave a similar answer quicker than you.  You should delete your question and upvote them.  This ensures the best answers go to the top of the page, and I'm sure this is what you would want on your question.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;This isn't a race.&lt;/strong&gt; There are tons of people on StackOverflow with more rep than me.  They are all probably much smarter than me and seem to answer orders of magnitude more questions than I do. &lt;strong&gt;This doesn't matter one bit.&lt;/strong&gt;  This isn't a race, this is all about improving your knowledge through helping others.  If you are in this for kudos, you probably could better spend your time doing something else.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;If you don't know the answer off of the top of your head, look it up!&lt;/strong&gt;  Part of teaching/helping others involves learning.  I don't know much about, say, Ruby but some of the questions asked on StackOverflow are beginner level and can be answered with a little bit of research.  Doing this increases your overall skillset and teaches you about other aspects of your field.
&lt;/p&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;
Anyway, here's my obligotory 10,000 StackOverflow reputation post.  It's taken a long time but it has been worth it.  I plan on still answering questions and helping the programming community as much as possible.  For those of you who have made it this far, congratulations.  For those of you who haven't, don't give up!  I'll see you at the finish line soon enough.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A List Apart&#59; The Survey for People Who Make Websites 2010</title>
   <link href="http://robertgreiner.com/2010/10/a-list-apart-the-survey-for-people-who-make-websites-2010/"/>
   <updated>2010-10-19T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/10/a-list-apart-the-survey-for-people-who-make-websites-2010</id>
   <content type="html">&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/i-took-the-2010-survey.gif&quot; alt=&quot;I took the survey&quot; title=&quot;I took the survey&quot; width=&quot;180&quot; height=&quot;46&quot; class=&quot;&quot; style=&quot;margin-right: 10px;&quot; /&gt;

&lt;p&gt;
I just got finished taking the annual &lt;a href=&quot;http://alistapart.com/articles/survey2010&quot;&gt;Survey for People Who Make Websites&lt;/a&gt; that &lt;a href=&quot;http://alistapart.com/&quot;&gt;A List Apart&lt;/a&gt; hosts every year.  If you have ever worked on or managed people who work on websites, then you should hop on over an take the survey.
&lt;/p&gt;

&lt;p&gt;
Surveys like these are an important part of our young industry and can help us better understand the current state of web development.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>LoanGeek.net a Simple Online Mortgage Calculator</title>
   <link href="http://robertgreiner.com/2010/10/loangeek-net-a-simple-online-mortgage-calculator/"/>
   <updated>2010-10-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/10/loangeek-net-a-simple-online-mortgage-calculator</id>
   <content type="html">&lt;p&gt;
I'm currently in the process of buying a house and (for those of you who don't know) it is a royal pain in the ass.  Everywhere you turn you are expected to make a potentially life altering decision about something you know nothing about and will end up costing you well over three times what you gross in a year.  So yes, it's a bit stressful.  But, I digress.
&lt;/p&gt;

&lt;p&gt;
One of the more complicated aspects of purchasing a new home is understanding the loan process.  In fact, the total monthly cost of a house is much more than the simple principal/interest type loan you get when you buy a car or borrow money for education.  In fact, there are several other factors that add up to the total monthly payment of a home.
&lt;/p&gt;

&lt;p&gt;
For instance, most loans require you to have &quot;Mortgage Insurance&quot; or PMI if you don't have 20% equity in your home.  This means that you have to pay a 1% per year premium on your house until you own enough of your house that you are no longer a huge liability.
&lt;/p&gt;

&lt;p&gt;
Also, you have costs like property tax (another 2.3+%), insurance, HOA dues, and the list goes on and on.
&lt;/p&gt;

&lt;p&gt;
So, to combat the intense stress of buying a new home and force myself to understand exactly what is going on behind the scenes I decided to create my own mortgage calculator application to break down precisely what my payment would be under a specific set of circumstances.
&lt;/p&gt;

&lt;p&gt;
Are there other mortgage calculators out there? Sure.  But, most of them are ugly, riddled with adds, and don't take all of the different monthly costs into account.
&lt;/p&gt;

&lt;p&gt;
So, without further ado, I present to you &lt;a href=&quot;http://loangeek.net&quot;&gt;LoanGeek&lt;/a&gt;.
&lt;/p&gt;

&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/loangeek.jpg&quot; alt=&quot;&quot; title=&quot;LoanGeek Online Mortgage Calculator&quot; width=&quot;500&quot; height=&quot;301&quot; class=&quot;center&quot; /&gt;

&lt;p&gt;
The source code is available on &lt;a href=&quot;http://github.com/robertgreiner/LoanGeek&quot;&gt;Github&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Also, for those of you who are interested.  This is how I calculated the principal and interest payments.  I got the formula off of &lt;a href=&quot;http://www.hughchou.org/calc/formula.html&quot;&gt;Hugh Chou's&lt;/a&gt; website.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530512.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
/**
 * How to Calculate Loan Amortization Schedules/Tables by Hand
 * http://www.hughchou.org/calc/formula.html
 * 
 * P = Principal
 * I = Annual interest rate
 * L = Loan Term (years)
 * 
 * J = Monthly interest in decimal form. 
 * J = I / (12 * 100)
 * 
 * N = Number of months over which the loan is amortized.
 * N = L * 12
 * 
 * M = Monthly Payment
 * 
 * M = P * ( J / ( 1 - (1 + J)^-N ) )
 */
private double CalculatePrincipalAndInterest() {
  double principalAndInterest = 0.0;

  MonthlyInterestMultiplier = InterestRate / (12 * 100);
  AmortizedMonths = LoanTerm * 12;

  double amortizedExpression = (1 - (Math.Pow((1 + MonthlyInterestMultiplier), -AmortizedMonths)));
  principalAndInterest = Principal * (MonthlyInterestMultiplier / amortizedExpression);

  InterestOnlyMonthly = Principal * MonthlyInterestMultiplier;
  PrincipalOnlyMonthly = principalAndInterest - InterestOnlyMonthly;

  return principalAndInterest;
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
If you are buying a house soon, I hope that you find this useful.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Validating Input with ASP .NET MVC 2</title>
   <link href="http://robertgreiner.com/2010/10/validating-input-with-asp-net-mvc-2/"/>
   <updated>2010-10-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/10/validating-input-with-asp-net-mvc-2</id>
   <content type="html">&lt;p&gt;
There aren't many web applications that do not accept user input of some sort.  That being said, you inevitably have to trust the user to &lt;em&gt;actually do something&lt;/em&gt; in order for your application to do interesting things.
&lt;/p&gt;

&lt;p&gt;
The problem is, what if the user enters something you don't expect them to?  This can lead to all sorts of unexpected behaviors from a simple error to a full-blown attack on your site.
&lt;/p&gt;

&lt;p&gt;
Luckily, the .NET framework makes it easy to add validation to your MVC project.
&lt;/p&gt;

&lt;p&gt;
The code I'm using here is for one of my open source projects called &lt;a href=&quot;http://loangeek.net&quot;&gt;LoanGeek&lt;/a&gt;.  The &lt;a href=&quot;http://github.com/robertgreiner/LoanGeek&quot;&gt;source code&lt;/a&gt; is also available on Github.
&lt;/p&gt;

&lt;h3&gt;The Model&lt;/h3&gt;

&lt;p&gt;
In the model, we have the main class that is going to hold all of the information about a particular mortgage loan.  The model is a great place to define what members we want to validate since this is where we define the structure behind our application.
&lt;/p&gt;

&lt;p&gt;
Without validation, we might have something that looks similar to this:
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530471.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
namespace LoanGeek.Models {
  public class LoanData {
    public double Principal { get; set; }
    public double Interestate { get; set; }
    public int LoanTerm { get; set; }
    ...
    ...
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now, all we have to do is take our existing model, find the members that we want the user to input, and make sure we add validation for each member.  This can be done by using &lt;em&gt;declarative attributes&lt;/em&gt;. 
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530481.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
namespace LoanGeek.Models {
  public class LoanData {

    [Required(ErrorMessage = &quot;Please enter your the total loan amount.&quot;)]
    public double Principal { get; set; }

    [Required(ErrorMessage = &quot;Please enter the interest rate.&quot;)]
    public double Interestate { get; set; }

    [Required(ErrorMessage = &quot;Please enter the number of years of the loan.&quot;)]
    public int LoanTerm { get; set; }
    ...
    ...
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now we have explicitly defined all of the data fields that are required for the user to enter.  On to the Controller!
&lt;/p&gt;

&lt;h3&gt;The Controller&lt;/h3&gt;

&lt;p&gt;
Once the user clicks submit the ModelState will attempt to validate before the View is loaded again.  Here, we can check to see if the user inputed valid data into our application and handle the result accordingly.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530487.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
[HttpPost]
public ActionResult Index(LoanData loanData) {
  if (ModelState.IsValid) {
    return View(&quot;Index&quot;, loanData);
  } else {
    return View();
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This will return an empty View if there was a problem validating any of the fields.
&lt;/p&gt;

&lt;h3&gt;The View&lt;/h3&gt;

&lt;p&gt;
Finally, where the rubber meets the road.  In the View, we simply need to output the validation summary and let the framework do the rest.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530494.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
&amp;lt;% using (Html.BeginForm()) { %&amp;gt;
  &amp;lt;%: Html.ValidationSummary() %&amp;gt;
  ...
  ...
&amp;lt;% } %&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Once we have this final bit in place, our application is protected against incorrect user input.  As an added bonus, the framework will also validate against the different datatypes in your model and display an error when invalid characters are entered.
&lt;/p&gt;

&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/loangeek_error.jpg&quot; alt=&quot;&quot; title=&quot;LoanGeek Validation Example&quot; width=&quot;500&quot; height=&quot;304&quot; class=&quot;center&quot; /&gt;

&lt;p&gt;
So there you have it.  A simple way to validate user input in ASP .NET MVC 2.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Never Deliver a Prototype</title>
   <link href="http://robertgreiner.com/2010/09/never-deliver-a-prototype/"/>
   <updated>2010-09-28T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/09/never-deliver-a-prototype</id>
   <content type="html">&lt;p&gt;
&lt;strong&gt;Never&lt;/strong&gt; deliver a prototype.  I know this sounds simple, but it's important.  
&lt;/p&gt;

&lt;p&gt;
It's very easy to upload the latest version of your code to a client's server &lt;em&gt;just to give a demo&lt;/em&gt; and accidentally leave it there.  Then, before you know it, your client is off trying to use your software like it's finished which can lead to all sorts of problems.
&lt;/p&gt;

&lt;p&gt;
If you have to give a demo, fine.  In fact, I encourage it.  Demos show progress and ensure you and your client are on the same page.  This can correct potentially disastrous issues and communication lapses early on in the project and help ensure everyone wins.  However, no matter how clear you think you are making yourself when you explain to them that this is &quot;for demonstration purposes only&quot;, I promise that the second you turn your back you might as well have said &quot;Sure, it's done!  Have at it.&quot;
&lt;/p&gt;

&lt;p&gt;
The last thing you want is for someone who doesn't know what they are doing to damage your reputation because you thought it would be cool to show the client some pet feature they didn't even ask for.
&lt;/p&gt;

&lt;p&gt;
Never deliver a prototype.  Never, ever.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Don't Blame the Person. Blame the Problem.</title>
   <link href="http://robertgreiner.com/2010/09/dont-blame-the-person-blame-the-problem/"/>
   <updated>2010-09-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/09/dont-blame-the-person-blame-the-problem</id>
   <content type="html">&lt;p&gt;
When I walked into work and saw a red cane hanging on my friend Ian's cube I knew that he committed some (probably untested) code to the repository the night before that caused the automated nightly build (or unit tests) to fail.  In other words, Ian &lt;strong&gt;broke the build&lt;/strong&gt;.  This was one of the ways my old software team tried to keep things fresh and hold everyone on the team accountable for silly mistakes.  
&lt;/p&gt;

&lt;p&gt;
If you were the one that broke the build, not only did you become the new proud owner of the &lt;em&gt;cane of shame&lt;/em&gt;, but, you were also responsible for delivering all of the release disks to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_configuration_management&quot;&gt;SCM&lt;/a&gt; lab and additionally tasked with building and delivering integration disks to the test engineers.  This punishment typically went on for about a month (until the responsibilities --not the cane-- got transferred to a random group member) or until the next poor sucker broke the build.
&lt;/p&gt;

&lt;p&gt;
This method seemed to work on the surface, at least, I know it did for me.  I never committed anything to the repository until I updated one of my clean projects, built it, and ran all of the unit tests.  Easy, right?  Why doesn't everyone on the team do this?  Why can't they just &lt;strong&gt;be more careful&lt;/strong&gt;?
&lt;/p&gt;

&lt;p&gt;
The problem with this approach is it becomes increasingly easy to get into the blame game.  If developers are breaking the build on any kind of regular basis maybe the problem isn't with the developers in the first place. Maybe there is a problem with the development &lt;em&gt;environment&lt;/em&gt;.  
&lt;/p&gt;

&lt;p&gt;
If a team member is swamped with work and checks in their code carelessly, this is a &lt;strong&gt;scheduling issue&lt;/strong&gt;.  Or, if a developer is working on too many different things at once and forgets to check in some of his files, this is a &lt;strong&gt;work allocating issue&lt;/strong&gt;.  What if a programmer changes some code that breaks another programmers code?  Isn't that his fault?  Maybe, but more than likely the problem could be a &lt;strong&gt;lack of unit tests&lt;/strong&gt;.  See the trend?  All of these are problems that can lead to broken builds, buggy code, and burned out developers.  But, all of these problems are also &lt;strong&gt;solvable&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Instead of asking employees to &lt;em&gt;be more careful&lt;/em&gt; or forcing them to take another training class on how to use that crappy in-house bug tracking system your company built.  Maybe it's time to be a little more aggressive about finding the actual root of the problem and &lt;strong&gt;work on solving that&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Being proactive about problems that arise and trying to solve the root of the problem itself is vital to any software team.  After all, it's all fun and games to harass your team members by hanging a red cane on their cube wall when they screw up. But, what happens when someone in upper management (who probably doesn't understand development) realizes that they can start attaching numbers and running reports that provide details for each individual developer and how many errors they've made over the course of the year?  This is the nightmare scenario that can at best lead to a &lt;a href=&quot;http://en.wikipedia.org/wiki/Cover_your_ass&quot;&gt;CYA&lt;/a&gt; environment and at worst create a culture where team members stab each other in the back to avoid blame.
&lt;/p&gt;

&lt;p&gt;
Instead of blaming the person for screwing something up, we need to start &lt;strong&gt;blaming the problem&lt;/strong&gt;.  When an error occurs, the best approach is to find the root of the error and try to fix it.  The key here is to do everything you can to reduce the &lt;strong&gt;probability of making mistakes&lt;/strong&gt;.  
&lt;/p&gt;

&lt;p&gt;
Maybe it's time to write unit tests for that legacy code, or, build that script to automate some tedious task that everyone on your team has to do every week.  Step up, be the hero, and solve the problem.  Trust me, you'll be better off in the long run.
&lt;/p&gt;

&lt;p&gt;
Think about it.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Google auto unsubscribe helps reduce spam even more</title>
   <link href="http://robertgreiner.com/2010/09/google-auto-unsubscribe-helps-reduce-spam-even-more/"/>
   <updated>2010-09-14T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/09/google-auto-unsubscribe-helps-reduce-spam-even-more</id>
   <content type="html">&lt;p&gt;
I was pleasantly surprised today when I reported an email as spam through Gmail and was asked if I would like Gmail to attempt to unsubscribe me from the messaging service that sent me the spam.
&lt;/p&gt;

&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/unsubscribe.png&quot; alt=&quot;&quot; title=&quot;GmailAutoUnsubscribe&quot; width=&quot;468&quot; height=&quot;176&quot; class=&quot;center&quot; /&gt;

&lt;p&gt;
I even received a confirmation message seconds later telling me I was unsubscribed from the mailing list.
&lt;/p&gt;

&lt;p&gt;
This was a pleasant experience from a mail provider that already provides an excellent mail service. Apparently, this has been &lt;a href=&quot;http://lifehacker.com/5319723/gmail-offers-to-automatically-unsubscribe-you-from-mailing-lists&quot;&gt;going on for a couple of months&lt;/a&gt; and I only just now noticed it.  I suppose that's a testament to the superb spam filtering Gmail implements.
&lt;/p&gt;

&lt;p&gt;
So, rejoice fellow spam haters, we now have another spam combating tool in our arsenal.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using Extension Methods in .NET</title>
   <link href="http://robertgreiner.com/2010/09/using-extension-methods-in-net/"/>
   <updated>2010-09-03T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/09/using-extension-methods-in-net</id>
   <content type="html">&lt;p&gt;
Extension methods are a handy way of adding your own custom methods to a class when you normally wouldn't be able to.  .NET treats extension methods exactly like instance methods.  In fact, in your day-to-day .NET programming you may be calling extension methods and not even know it.
&lt;/p&gt;

&lt;p&gt;
Let's say we have access to an API with a simple &lt;strong&gt;Person&lt;/strong&gt; class.  Also, for the purposes of this post, let's say we don't have access to extend or modify this class.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530442.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public class Person {
  
  public Person(string first, string middle, string last) {
    FirstName = first;
    MiddleName = middle;
    LastName = last;
  }

  public string FirstName { get; set; }
  public string MiddleName { get; set; }
  public string LastName { get; set; }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
In order to get the full name of a &lt;strong&gt;Person&lt;/strong&gt; we'd have to do something like this:
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530445.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
Person p = new Person(&quot;Robert&quot;, &quot;N&quot;, &quot;Greiner&quot;);
string fullName = String.Format(&quot;{0} {1}&quot;, p.FirstName, p.LastName);
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This is perfectly fine, but what if you have to do this in several places?  You'd either have to copy/paste this code wherever you needed it (bad idea, what if your boss came in later and said that she really wanted to use middle name also?  Then, you'd have to go manually change every line of code that gets the full name) or you could create a stand alone method to return the full name (a better option, but the new method would be separate from the class). Wouldn't it have been nice if the original authors of the class included a method to return a Person's full name?  This is where extension methods come in handy.  We can add a &lt;strong&gt;FullName()&lt;/strong&gt; method and have it treated as if it was part of the class the whole time.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530446.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public static class ExtensionMethods {
  public static string FullName(this Person p) {
    return String.Format(&quot;{0} {1}&quot;, p.FirstName, p.LastName);
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This is the syntax for creating an extension method.  There are a few things to note here:

&lt;ol&gt;
  &lt;li&gt;Extension methods must reside in a &lt;strong&gt;public static class&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Extension methods must be &lt;strong&gt;static&lt;/strong&gt;
  &lt;/li&gt;&lt;li&gt;Extension methods must use the &lt;strong&gt;this&lt;/strong&gt; keyword in the parameter list of the function.  This is how .NET knows what object to attach your extension method to (in this case, the &lt;strong&gt;Person&lt;/strong&gt; class.)&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
Now that we have our extension method, we can call &lt;strong&gt;FullName()&lt;/strong&gt; just like any other method belonging to the &lt;strong&gt;Person&lt;/strong&gt; class.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530447.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
Person p = new Person(&quot;Robert&quot;, &quot;N&quot;, &quot;Greiner&quot;);
string fullName = p.FullName();
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Did you notice how the &lt;strong&gt;FullName()&lt;/strong&gt; was declared statically, but is eventually treated as if it is an instance method?  In fact, .NET treats all C# and VB extension methods in the exact same way as instance methods.
&lt;/p&gt;

&lt;p&gt;
But, what about encapsulation?  What if I don't want parts of my class to be exposed publicly under any circumstances?  Don't worry, extension methods don't have access to any private or protected methods in a class.
&lt;/p&gt;

&lt;p&gt;
This is a bit of a contrived example, in the real world, you would likely just modify or extend &lt;strong&gt;Person&lt;/strong&gt; to add the &lt;strong&gt;FullName()&lt;/strong&gt; method.  You can just as easily add an extension method to a class you don't have access to:
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530452.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
public static class ExtensionMethods {
  public static string RemoveSpaces(this string s) {
    return s.Replace(&quot; &quot;, &quot;&quot;);
  }
}
...
string text = &quot;This is a text string.&quot;;
text = text.RemoveSpaces();
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Extension methods are a great way to add a level of simplicity and tidiness to your application.  However, extension methods should be used in moderation.  They are not always the right answer in every situation and should only be used when they make sense.  Typically, if you can modify or extend the existing client code, you should.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Grouping Radio Buttons in ASP .NET MVC 2</title>
   <link href="http://robertgreiner.com/2010/08/grouping-radiobuttons-in-asp-mvc-2/"/>
   <updated>2010-08-27T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/08/grouping-radiobuttons-in-asp-mvc-2</id>
   <content type="html">&lt;p&gt;
Here's a simple issue I ran into today when dealing with radio buttons in an ASP .NET MVC 2 application.
&lt;/p&gt;

&lt;p&gt;
Radio buttons should only allow the user to select a single option out of multiple choices.  This should be enforced by only allowing one radio button to be selected for each option set.  But, what if your application has multiple options that all need radio buttons?  How do you distinguish the radio buttons from one option from the other.
&lt;/p&gt;

&lt;p&gt;
This is where groups comes in.  By setting the &lt;strong&gt;GroupName&lt;/strong&gt; property for each of your radio buttons, you can specify which buttons to associate to an option.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530437.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
&amp;lt;div&amp;gt;
  &amp;lt;asp:RadioButton ID=&quot;ActionMatch&quot; GroupName=&quot;RegexActions&quot; Checked=&quot;true&quot; Text=&quot;Match&quot; runat=&quot;server&quot; /&amp;gt;
  &amp;lt;asp:RadioButton ID=&quot;ActionReplace&quot; GroupName=&quot;RegexActions&quot; Text=&quot;Replace&quot; runat=&quot;server&quot; /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Also, note that in ASP .NET MVC 2 there is no default group, so you must define a &lt;strong&gt;GroupName&lt;/strong&gt; in order for the radio buttons to work properly.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How to properly style HTML tables</title>
   <link href="http://robertgreiner.com/2010/08/how-to-properly-style-html-tables/"/>
   <updated>2010-08-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/08/how-to-properly-style-html-tables</id>
   <content type="html">&lt;p&gt;
Some folks would argue that you should &lt;a href=&quot;http://www.maximumpc.com/article/features/the_7_most_misused_html_tags_and_how_fix_them&quot;&gt;never use tables&lt;/a&gt;.  And, for the most part, I agree. 
&lt;/p&gt;

&lt;p&gt;
I believe that HTML markup should be meaningful, and therefore, you shouldn't use tags for something they weren't intended for (such as laying out a web page.)  However, tables were put into the HTML standard for a reason, displaying &lt;a href=&quot;http://webdesign.about.com/od/tables/a/aa122605.htm&quot;&gt;tabular data&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
For instance, if we have a database of employees and we want to print a report that contains our top performers, their salary, and contact information a table would be the perfect candidate.
&lt;/p&gt;

&lt;p&gt;
Here's a fictitious example of what a web page might return from a database of employees.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530430.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;table id=&quot;employees&quot;&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;th&amp;gt;First Name&amp;lt;/th&amp;gt;
    &amp;lt;th&amp;gt;Last Name&amp;lt;/th&amp;gt;
    &amp;lt;th&amp;gt;Salary&amp;lt;/th&amp;gt;
    &amp;lt;th&amp;gt;Extension&amp;lt;/th&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;Albert&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;Einstien&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;$500,000&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;3141&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;Alan&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;Turing&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;$300,000&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;1243&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;Nikola&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;Tesla&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;$300,500&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;0987&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
  &amp;lt;tr&amp;gt;
    &amp;lt;td&amp;gt;Bill&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;Gates&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;$100,000,000&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;2222&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This, in my humble opionion is perfectly acceptable.  We have tabular data that belongs in an HTML table.  But, what do we do from here?  The table returned is drab and needs some styling to look as sharp as the rest of the site.  Let's add some style.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530429.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
#employees {
  width:100%;
  border-collapse:collapse;
}

#employees td, #runners th {
  border:1px solid #28647f;
  padding:3px 7px 2px 7px;
}

#employees th {
  font-size:1.2em;
  text-align:left;
  padding-top:5px;
  padding-bottom:4px;
  background-color:#26394c;
  color:#FFFFFF;
}

#employees tr.alt td {
  color:#000;
  background-color:#d3e5f2;
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Better!  This turned our drab table from the 90's into something that looks clean and professional.
&lt;/p&gt;

&lt;p&gt;
Remember, you should only use tables for displaying tabular data.  If you want a good way to lay out the graphics on your web page, then check out &lt;a href=&quot;http://www.w3schools.com/css/&quot;&gt;this tutorial&lt;/a&gt; to help get you started.
&lt;/p&gt;

&lt;p&gt;
You can view the entire web page &lt;a href=&quot;http://robertgreiner.com/uploads/html/employees.html&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Are You a Student? Great, Here's a Free One-Year Amazon Prime Subscription</title>
   <link href="http://robertgreiner.com/2010/08/are-you-a-student-great-heres-a-free-one-year-amazon-prime-subscription/"/>
   <updated>2010-08-03T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/08/are-you-a-student-great-heres-a-free-one-year-amazon-prime-subscription</id>
   <content type="html">&lt;p&gt;
If you're a student with a valid email address, head on over to &lt;a href=&quot;http://www.amazon.com/gp/student/signup/info&quot;&gt;Amazon&lt;/a&gt; and get a free one year subscription to Amazon Prime.
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Amazon Prime free for one year ($79 value)&lt;/li&gt;
  &lt;li&gt;Unlimited FREE Two-Day Shipping on textbooks and millions of other items&lt;/li&gt;
  &lt;li&gt;No minimum order size&lt;/li&gt;
  &lt;li&gt;Upgrades to One-Day shipping for $3.99/item&lt;/li&gt;
  &lt;li&gt;E-mail alerts for exclusive deals and promotions&lt;/li&gt;
  &lt;li&gt;It's free for students - sign up by providing your school and major&lt;/li&gt;
&lt;/ul&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/student_amazon_prime.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/student_amazon_prime-300x206.jpg&quot; alt=&quot;&quot; title=&quot;student_amazon_prime&quot; width=&quot;300&quot; height=&quot;206&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
Now there's no excuse for you to not have your books in time for class, eh?
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Disallow&#58; /harming/humans.  A lesson in Easter Eggs from Last.fm</title>
   <link href="http://robertgreiner.com/2010/07/disallow-harminghumans-a-lesson-in-easter-eggs-from-last-fm/"/>
   <updated>2010-07-27T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/07/disallow-harminghumans-a-lesson-in-easter-eggs-from-last-fm</id>
   <content type="html">&lt;p&gt;
Adding &lt;a href=&quot;http://en.wikipedia.org/wiki/Easter_egg_%28media%29&quot;&gt;Easter eggs&lt;/a&gt; to your application is a great way to reward your frequent users with a bit of a surprise out of the blue.  Easter eggs allow you to have a little bit of fun with your user base without being too explicit.
&lt;/p&gt;

&lt;p&gt;
The problem, however, is finding the right balance of fun and professionalism.  After all, you still want to hold on to the hard earned respect your users give you for providing them with a high quality software application.  Easter eggs that are too extreme, blatant, or political can end up having the opposite effect and create a negative experience for your users.
&lt;/p&gt;

&lt;p&gt;
Here's a great example of an Easter egg that &lt;a href=&quot;http://last.fm/robots.txt&quot;&gt;Last.fm&lt;/a&gt; placed in their robots.txt file.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
User-Agent: *
Disallow: /music?
Disallow: /widgets/radio?
Disallow: /show_ads.php

Disallow: /affiliate/
Disallow: /affiliate_redirect.php
Disallow: /affiliate_sendto.php
Disallow: /affiliatelink.php
Disallow: /campaignlink.php
Disallow: /delivery.php

Disallow: /music/+noredirect/

Disallow: /harming/humans
Disallow: /ignoring/human/orders
Disallow: /harm/to/self

Allow: /
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
The last lines are a reference to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Three_Laws_of_Robotics&quot;&gt;Three Laws of Robotics&lt;/a&gt; created by &lt;a href=&quot;http://en.wikipedia.org/wiki/Isaac_Asimov&quot;&gt;Isaac Asimov&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
This is a very subtle and perfectly placed Easter egg that will likely resonate with the types of users that will go digging around in a site's robots.txt file.
&lt;/p&gt;

&lt;p&gt;
You also get the added benefit of &lt;a href=&quot;http://news.ycombinator.com/item?id=1552002&quot;&gt;healthy discussion&lt;/a&gt; when your Easter eggs are discovered.
&lt;/p&gt;

&lt;p&gt;
Next time you're looking for an interesting way to make your product stand out from the competition, why not let your users stumble on an Easter egg?
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Creating a Google Custom Search Engine to Search Your Favorite Sites.</title>
   <link href="http://robertgreiner.com/2010/07/creating-a-google-custom-search-engine-to-search-your-favorite-sites/"/>
   <updated>2010-07-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/07/creating-a-google-custom-search-engine-to-search-your-favorite-sites</id>
   <content type="html">&lt;p&gt;
I was goofing off online the other day and came across Google's &lt;a href=&quot;http://www.google.com/cse/&quot;&gt;Custom Search Engine&lt;/a&gt;.  Creating a CSE allows you to leverage the power of Google's search engine while keeping the search constrained to a very small subset of sites.  This can be especially useful if one of the sites you use frequently has very poor searching capabilities (ahem... I'm talking to you &lt;a href=&quot;http://reddit.com&quot;&gt;reddit&lt;/a&gt;.)
&lt;/p&gt;

&lt;p&gt;
I went ahead and created &lt;a href=&quot;http://searchstackoverflow.com&quot;&gt;my own Custom Search Engine&lt;/a&gt; to search &lt;a href=&quot;http://www.stackoverflow.com&quot;&gt;StackOverflow&lt;/a&gt; and &lt;a href=&quot;http://meta.stackoverflow.com&quot;&gt;StackOverflow Meta&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/SearchStackOverflow.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/SearchStackOverflow.jpg&quot; alt=&quot;&quot; title=&quot;SearchStackOverflow&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
If you are interested in extending what I already have or want a jumping off point for your own project, you can check out the code for StackSearch &lt;a href=&quot;http://github.com/robertgreiner/StackSearch&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Setting an MP3 as Your Alarm on the Android</title>
   <link href="http://robertgreiner.com/2010/06/setting-an-mp3-as-your-alarm-on-android/"/>
   <updated>2010-06-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/06/setting-an-mp3-as-your-alarm-on-android</id>
   <content type="html">&lt;p&gt;
I had a little bit of trouble with this today and thought I'd share.
&lt;/p&gt;

&lt;p&gt;
If you plan on using the built-in alarm on the HTC EVO (Android 2.1) and want to wake up to the soft melodies of one of your favorite songs instead of the blasting simulated alarm sounds the EVO provides, follow these simple steps.
&lt;/p&gt;

&lt;p&gt;
&lt;ol&gt;
	&lt;li&gt;Plug your EVO into your computer and select &quot;use as drive&quot;.&lt;/li&gt;
	&lt;li&gt;Create a folder called &quot;alarms&quot; in the root of your SD card.&lt;/li&gt;
	&lt;li&gt;Place your desired .mp3 file in the folder (I renamed mine to have the word &quot;alarm&quot; in the file name.)&lt;/li&gt;
	&lt;li&gt;Disconnect your EVO.&lt;/li&gt;
	&lt;li&gt;Reboot your phone.&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
Now, when you go to set your alarm tone, your mp3 file should be there.  This method is better than rooting your Android phone, changing the file format of your music file, and placing the file in the phone's limited on-board storage.
&lt;/p&gt;

&lt;p&gt;
By the way, the full write-up on the EVO is coming soon, I just wanted to play around with it for a little while before I gave my thoughts.  Check back for more updates.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Setting an MP3 as Your Alarm on the HTC EVO</title>
   <link href="http://robertgreiner.com/2010/06/setting-an-mp3-as-your-alarm-on-the-htc-evo/"/>
   <updated>2010-06-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/06/setting-an-mp3-as-your-alarm-on-the-htc-evo</id>
   <content type="html">&lt;p&gt;
I had a little bit of trouble with this today and thought I'd share.
&lt;/p&gt;

&lt;p&gt;
If you plan on using the built-in alarm on the HTC EVO (Android 2.1) and want to wake up to the soft melodies of one of your favorite songs instead of the blasting simulated alarm sounds the EVO provides, follow these simple steps.
&lt;/p&gt;

&lt;p&gt;
&lt;ol&gt;
	&lt;li&gt;Plug your EVO into your computer and select &quot;use as drive&quot;.&lt;/li&gt;
	&lt;li&gt;Create a folder called &quot;alarms&quot; in the root of your SD card.&lt;/li&gt;
	&lt;li&gt;Place your desired .mp3 file in the folder (I renamed mine to have the word &quot;alarm&quot; in the file name.)&lt;/li&gt;
	&lt;li&gt;Disconnect your EVO.&lt;/li&gt;
	&lt;li&gt;Reboot your phone.&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
Now, when you go to set your alarm tone, your mp3 file should be there.  This method is better than rooting your Android phone, changing the file format of your music file, and placing the file in the phone's limited on-board storage.
&lt;/p&gt;

&lt;p&gt;
By the way, the full write-up on the EVO is coming soon, I just wanted to play around with it for a little while before I gave my thoughts.  Check back for more updates.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>LifeHack&#59; Getting More At Starbucks</title>
   <link href="http://robertgreiner.com/2010/06/lifehack-getting-more-at-starbucks/"/>
   <updated>2010-06-10T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/06/lifehack-getting-more-at-starbucks</id>
   <content type="html">&lt;p&gt;
&lt;em&gt;This post is not programming related.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Today we did a little social experiment and I’d like to share the results.
&lt;/p&gt;

&lt;p&gt;
On one of my weekly excursions to &lt;a href=&quot;http://www.starbucks.com&quot;&gt;Starbucks&lt;/a&gt; with a few of my work-friends I noticed that the &lt;a href=&quot;http://en.wikipedia.org/wiki/Barista&quot;&gt;barista&lt;/a&gt; always makes more &lt;a href=&quot;http://www.starbucks.com/menu/drinks/frappuccino-blended-beverages&quot;&gt;Frappuccino&lt;/a&gt; than is needed to completely fill up the requested cup size.  This makes sense if you think about it because you definitely don’t want to short-change your customers by not filling their $4.50 coffee all the way to the top.  So, the question remains, what happens to all of that extra coffee goodness that doesn’t have the misfortune to make it into your cup?  It gets quickly washed down the sink so the pitcher can be used to make the next drink.
&lt;/p&gt;

&lt;p&gt;
Today, one of us asked for a “Solo Grande Coffee Frap” (just like always) but with the added request of &quot;hey, would you mind putting that in a &lt;a href=&quot;http://answers.yahoo.com/question/index?qid=20090207062948AAMalRO&quot;&gt;Venti&lt;/a&gt; cup?&quot;&quot;  The cashier obliged and informed us that all of the cups at Starbucks are conveniently marked with measurement lines so any size of coffee could be poured into any cup (brilliant.)
&lt;/p&gt;

&lt;p&gt;
So, just like clockwork, the barista begins filling orders and eventually gets to our experiment order and dumps the entire pitcher’s contents into the Venti cup.  Success!
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/starbucks.jpg&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://robertgreiner.com/uploads/images/2010/starbucks_400_669.jpg&quot; title=&quot;Starbucks Extra Coffee&quot; class=&quot;&quot; width=&quot;400&quot; height=&quot;669&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
So, if you ever wished you could get a drink at Starbucks between Grande and Venti, now you can.  I’m not sure if this works everywhere but it’s worth a try.
&lt;/p&gt;

&lt;p&gt;
By the way, I took this picture with my super cool &lt;a href=&quot;http://www.sprint.com/evo&quot;&gt;HTC EVO&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Have you tried this?  Did it work?  Leave a comment.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Installing Git on Windows with msysgit</title>
   <link href="http://robertgreiner.com/2010/06/installing-git-on-windows-with-msysgit/"/>
   <updated>2010-06-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/06/installing-git-on-windows-with-msysgit</id>
   <content type="html">&lt;p&gt;
The installation process for msysgit is extremely straightforward and an older tutorial is already &lt;a href=&quot;http://help.github.com/win-git-installation/&quot;&gt;available on Github&lt;/a&gt;.  However, I figured that it would be a good idea to have an updated installation tutorial available to all the new gitters out there.
&lt;/p&gt;

&lt;p&gt;
These are the installation options I used to install &lt;a href=&quot;http://code.google.com/p/msysgit/downloads/list&quot;&gt;Git-1.7.0.2-preview20100309.exe&lt;/a&gt; on Windows.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git1.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git1.jpg&quot; alt=&quot;&quot; title=&quot;1&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git2.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git2.jpg&quot; alt=&quot;&quot; title=&quot;2&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git3.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git3.jpg&quot; alt=&quot;&quot; title=&quot;3&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git4.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git4.jpg&quot; alt=&quot;&quot; title=&quot;4&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;&lt;p style=&quot;text-align: center; margin-bottom: 20px;&quot;&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can enable the options to show a Git GUI or Bash shell if you want that option to be available every time you right-click on something in Windows Explorer.  I just didn't want that much space taken up on my right-click menu.&lt;/p&gt;&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git5.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git5.jpg&quot; alt=&quot;&quot; title=&quot;5&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git6.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git6.jpg&quot; alt=&quot;&quot; title=&quot;6&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git7.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git7.jpg&quot; alt=&quot;&quot; title=&quot;7&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git8.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git8.jpg&quot; alt=&quot;&quot; title=&quot;8&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git9.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git9.jpg&quot; alt=&quot;&quot; title=&quot;9&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
And, that's it!  Now you have Git installed on your Windows machine and can create &lt;a href=&quot;http://www.kernel.org/pub/software/scm/git/docs/everyday.html&quot;&gt;your first Git repository&lt;/a&gt; or &lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/getting-started-with-git-and-tortoisegit-on-windows/&quot;&gt;install Tortoise Git&lt;/a&gt;.  Happy version controlling.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A Sneak Peak at Office 2010</title>
   <link href="http://robertgreiner.com/2010/06/a-sneak-peak-at-office-2010/"/>
   <updated>2010-06-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/06/a-sneak-peak-at-office-2010</id>
   <content type="html">&lt;p&gt;
I just finished installing Office 2010 a few minutes ago and thought I'd share some screenshots.  The look and feel is very similar to Office 2007, so there won't be as much of a learning curve to step up to for those of you who are already used to 2007.  Also, it doesn't look like the ribbon (which I kind of like) is going away any time soon.
&lt;/p&gt;

&lt;p&gt;
Honestly, I don't like the graphics in Office 2010 at all.  I think it's pretty hideous and the &lt;em&gt;black&lt;/em&gt; layout is even worse.  Hopefully, this will get addressed by the time Office 2010 is released to the public.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;Click on one of the thumbnails for a full sized image.  &lt;strong&gt;Note:&lt;/strong&gt; All screenshots are using the included black color scheme.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Here's a screenshot of Word 2007 to compare with the Office 2010 images.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/word_2007.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/word_2007-300x180.jpg&quot; alt=&quot;&quot; title=&quot;word_2007&quot; width=&quot;300&quot; height=&quot;180&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;Microsoft Word 2007&lt;/p&gt;

&lt;p&gt;
And, here are the screenshots of some of the software in the Office 2010 suite.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/word_2010.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/word_2010-300x231.jpg&quot; alt=&quot;&quot; title=&quot;word_2010&quot; width=&quot;300&quot; height=&quot;231&quot; class=&quot;aligncenter size-medium wp-image-102&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;Microsoft Word 2010&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/powerpoint.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/powerpoint-300x231.jpg&quot; alt=&quot;&quot; title=&quot;powerpoint&quot; width=&quot;300&quot; height=&quot;231&quot; class=&quot;aligncenter size-medium wp-image-100&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;Microsoft PowerPoint 2010&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/excel_splash.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/excel_splash-300x201.jpg&quot; alt=&quot;&quot; title=&quot;excel_splash&quot; width=&quot;300&quot; height=&quot;201&quot; class=&quot;aligncenter size-medium wp-image-99&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;Microsoft Excel 2010 Splash Screen&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/excel.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/excel-300x230.jpg&quot; alt=&quot;&quot; title=&quot;excel&quot; width=&quot;300&quot; height=&quot;230&quot; class=&quot;aligncenter size-medium wp-image-98&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;Microsoft Excel 2010&lt;/p&gt;

&lt;p&gt;
If you are interested in learning more about the differences between Office 2007 and 2010, check out &lt;a href=&quot;http://www.pcworld.com/article/182504/office_2007_vs_office_2010_ribbons.html&quot;&gt;this PC World article&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
What do you think of the new look-and-feel?  Feel free to comment.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Microsoft, What Happened?!</title>
   <link href="http://robertgreiner.com/2010/06/microsoft-what-happened/"/>
   <updated>2010-06-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/06/microsoft-what-happened</id>
   <content type="html">&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/steve-ballmer.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/steve-ballmer-150x150.jpg&quot; alt=&quot;&quot; title=&quot;steve-ballmer&quot; width=&quot;150&quot; height=&quot;150&quot; class=&quot;left&quot; /&gt;&lt;/a&gt;
I just read an interesting and heartbreaking &lt;a href=&quot;http://37signals.com/svn/posts/2380-you-couldnt-pay-me-to-work-for-ballmer&quot;&gt;article on 37signals&lt;/a&gt; that is a very frank discussion of the poor job Steve Ballmer is doing running &lt;a href=&quot;http://microsoft.com&quot;&gt;Microsoft&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
I'm not going to try and hide the fact that I've always been a pretty big Microsoft fan.  After all, they drive a majority of the software I use every day to be productive, and I've grown to love (and financially depend on) developing in &lt;a href=&quot;http://www.microsoft.com/net/&quot;&gt;.NET&lt;/a&gt;.  I also think that Microsoft is especially gracious to their development community (especially when you compare them to &lt;a href=&quot;http://www.mobilecrunch.com/2010/02/20/over-5000-apps-stricken-from-the-apple-app-store-new-rules-in-place/&quot;&gt;the&lt;/a&gt; &lt;a href=&quot;http://www.electronista.com/articles/10/06/03/editorial.questions.apples.short.term.app.goals/&quot;&gt;jerks&lt;/a&gt; at &lt;a href=&quot;http://www.paulgraham.com/apple.html&quot;&gt;Apple&lt;/a&gt;).
&lt;/p&gt;

&lt;p&gt;
The stagnation of Microsoft's profits is especially devastating because of the future effect it will have on the market and development community.  When Bill Gates ran the show it fostered some really intense competition between Microsoft and Apple.  This competition led to better products, which in turn, led to more productive and happy customers.  Now, Microsoft is on the decline (or at the very best stuck on a plateau) and Apple doesn't have a Goliath to compete with anymore.  In this environment, &lt;strong&gt;everyone loses&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/microsoft_stock.png&quot;&gt;&lt;img class=&quot;center&quot; title=&quot;microsoft_stock&quot; src=&quot;http://robertgreiner.com/uploads/images/2010/microsoft_stock.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;205&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;&lt;em&gt;Here's an overview of Microsoft's stock while Gates and Ballmer were in charge.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
Now, do I think that Ballmer is 100% to blame for Microsoft's performance in the past decade?  Not entirely.  There are plenty of things going on in the world that can affect a company's earnings.  But, I will say that I think Ballmer is a huge part of the reason Microsoft isn't doing as good as it could be. And, if Bill Gates was still CEO, I imagine that he would have found a way to make Microsoft profitable.
&lt;/p&gt;

&lt;p&gt;
Let me just end with this.  If you are in charge of leading people - no matter how many - &lt;strong&gt; the image you portray will play a huge part in how your team performs&lt;/strong&gt; and I think this 37signals article shows that.  When you lead, it is vital that you set a good example for those working under you so that you all can be awesome.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using Stopwatches and Timers in .NET</title>
   <link href="http://robertgreiner.com/2010/06/using-stopwatches-and-timers-in-net/"/>
   <updated>2010-06-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/06/using-stopwatches-and-timers-in-net</id>
   <content type="html">&lt;p&gt;
Two problems that plague new programmers and seasoned professionals alike is the need to delay program execution and get an accurate time how long something takes to execute.  Luckily, there are probably a few thousand ways to solve each problem.  Unfortunately, most of them center around laziness (the bad kind) and unreliability.  In this article, I'll attempt to show you how to implement the different Timer and Stopwatch classes in .NET to help ensure your application will work as intended for years to come.  Because, let's face it, you probably aren't going to be re-factoring any time soon.
&lt;/p&gt;

&lt;h2&gt;Timers&lt;/h2&gt;

&lt;p&gt;
First, we'll start of with an introduction to Timers and how &lt;strong&gt;not&lt;/strong&gt; to implement them.  Timers allow you to control the execution of your application by being able to define when an action takes place.  
&lt;/p&gt;

&lt;p&gt;
I remember in my very first high-school programming class, we were instructed to move a circle from one end of the screen to the other.  The problem every student eventually encountered was, the circle had already moved to the edge of the screen by the time the graphics got loaded and we didn't get to see any animation.  This happened because the function that incremented the (x,y) position finished running too quickly to actually notice any movement. Obviously, this takes all of the fun out actually being able to see your circle slide across the screen so something needed to be done.
&lt;/p&gt;

&lt;p&gt;
We needed to come up with a way to slow each iteration of the &lt;code&gt;increment()&lt;/code&gt; function so we could actually see what was going on.  The idea that my teacher gave at the time was to create a blank &lt;code&gt;for loop&lt;/code&gt; that counted to 1000.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530295.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
//Bad Code, do not use.
function moveCircle() {
  for (int x = 0; x &lt; 1000; x++) {
    //do nothing
  }
  //increment (x,y) position
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
As you can probably imagine, this method slowed the incrementing down just enough to let a classroom full of 30 students witness their very first animated program (Hazzah!)  However, even though this was a good-enough solution for a classroom, it's a horrible idea for anything that will eventually end up having more than one user.
&lt;/p&gt;

&lt;p&gt;
The obvious problem with the above solution (besides that it is lazy and sloppy) is the fact that, while counting a loop from 1 to 1000 on my computer today may take one second, that same loop getting executed a year from now will run in half the time or less.  Not to mention, if I wanted to convert my sweet new screen-saver-circle-moving-app to run on the iPad (assuming &lt;a href=&quot;http://monotouch.net/&quot;&gt;Mono Touch&lt;/a&gt; is still supported a year from now, &lt;a href=&quot;http://shiftyjelly.wordpress.com/2010/06/01/sentence-first-verdict-afterwards/&quot;&gt;but that's a post for another day&lt;/a&gt;), then what?
&lt;/p&gt;

&lt;p&gt;
Now, fast forward 4 years to the end of college.  Obviously, we're so much smarter than we were in high school and learned tons of new programming skills that will land us a sweet gig after graduation. Right?  Let's say we're in our senior design class and we run in to a similar issue with the execution of our application.  Something is just running too quickly and we need a way to slow it down a little bit.  John being the teacher's pet and an overall slacker will suggest this awesome delay function he learned in high school but, you won't be convinced. You remember coding this up years ago and figure there must be a better way.  So, you hop on to Google and ask how to delay execution of a function in .NET, hit &quot;I'm feeling lucky&quot;, and copy/paste the first thing on the screen that looks like it just might do the trick.  Now, you can take your neat code snippet back to the team and show them how smart you really are.   Unfortunately, the snippet - while shorter in length - really isn't that much better.  
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
//Bad Code, do not use.
Thread.Sleep(1000);
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
Now, we're a little better off than we were in high school, but we still have issues with precision.  After all, there is no guarantee that your method will wait exactly one second before executing and now you have issues with things like oversleeping (as if we don't have enough to worry about in that department in our own personal lives) or undersleeping.  But, we end up using the code anyway and get through our Senior Project class relatively unscathed.
&lt;/p&gt;

&lt;p&gt;
Fast forward a few years and now we're professional developers that a company relies on to come up with intelligent and well thought out solutions that won't break down when one of your customers decides to buy a new computer.  What do we do now?
&lt;/p&gt;


&lt;strong&gt;Enter Timers&lt;/strong&gt;

&lt;p&gt;
Timers allow us to accomplish the things we wanted to do in the previous two examples but can't do reliably without some help from our framework.  Here, we'll look at how to use timers in .NET (the right way) so we don't have to re-live the high-school or college glory days of (noob) programming.
&lt;/p&gt;

&lt;p&gt;
There are actually 3 types of timer classes in .NET: &lt;code&gt;System.Timers.Timer&lt;/code&gt;, &lt;code&gt;System.Threading.Timer&lt;/code&gt;, and &lt;code&gt;System.Windows.Forms.Timer&lt;/code&gt;.  Each Timer class has a specific function and is useful in its own way.  Below are some examples of each type of Timer and some situations in which you might find them useful.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx&quot;&gt;System.Timers.Timer&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
This Timer is a server-based timer which executes Elapsed events over a recurring interval.  The key here, is that this timer &lt;strong&gt;generates recurring events in an application&lt;/strong&gt;.  You would use the &lt;code&gt;System.Timers.Timer&lt;/code&gt; Class when you need to ensure something gets executed at a specific time (like a system up-time heartbeat request).  These timers work well in a multi-threaded environment since the server could technically exist anywhere.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530304.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
//using System.Timers
public void runTimer() {
    Timer aTimer = new Timer(10000);

    aTimer.Elapsed += new ElapsedEventHandler(RunEvent);
    aTimer.Interval = 1000;
    aTimer.Enabled = true;
}

//This method will get called every second until the timer stops or the program exits.
public void RunEvent(object source, ElapsedEventArgs e) {
    Console.WriteLine(&quot;RunEvent() called at &quot; + DateTime.Now.ToLongTimeString());
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;&quot;&gt;System.Threading.Timer&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
The &lt;code&gt;System.Threading.Timer&lt;/code&gt; Class is designed to execute a method at specified intervals.  It should be pointed out up-front that this timer is not actually thread-safe.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530309.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
//using System.Threading;
public void runTimer() {
    int timeout = Timeout.Infinite;
    int interval = 1000;
    TimerCallback callback = new TimerCallback(RunEvent);

    Timer timer = new Timer(callback, null, timeout, interval);
    timer.Change(0, 1000);
}
public void RunEvent(object state) {
    Console.WriteLine(&quot;RunEvent() called at &quot; + DateTime.Now.ToLongTimeString());
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx&quot;&gt;System.Windows.Forms.Timer&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
This timer is designed for an environment that involves a GUI and is single-threaded.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530316.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
//using System.Windows.Forms
private void FormTimer_Load(object sender, EventArgs e) {
    Timer timer = new Timer();
    timer.Interval = 1000;
    timer.Tick += new EventHandler(RunEvent);
    timer.Start();
}

private void RunEvent(object sender, System.EventArgs e) {
    boxStatus.AppendText(&quot;RunEvent() called at &quot; + DateTime.Now.ToLongTimeString() + &quot;\n&quot;);
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;h2&gt;Stopwatch&lt;/h2&gt;

&lt;p&gt;
We've just examined ways to delay execution in a .NET application, but what if we want to measure the elapsed time between two events in our application?  Fortunately, .NET provides the Stopwatch Class (&lt;code&gt;System.Diagnostics.Stopwatch&lt;/code&gt;) which allows us to accurately measure elapsed time in a software application.
&lt;/p&gt;

&lt;p&gt;
Without the stopwatch class, you'd have to resort to something like this:
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530325.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
//Bad Code, do not use.
int start = System.DateTime.Now.Millisecond;
//run stuff
int stop = System.DateTime.Now.Millisecond;
int elapsedTime = stop - start;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This code would do what you needed, but let's see if .NET has a way to do this a little more cleanly and reliably.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx&quot;&gt;System.Diagnostics.Stopwatch&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
.NET's Stopwatch Class gives you the ability to accurately measure elapsed time.  A Stopwatch instance can measure elapsed time over several intervals with the total elapsed time calculated by adding all of the intervals together.
&lt;/p&gt;

&lt;p&gt;
The following example is a different way to get the elapsed time of program execution for the above example:
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530322.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
//using System.Diagnostics;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
//Do Stuff
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
The &lt;code&gt;stopwatch.Elapsed&lt;/code&gt; result is stored as a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.timespan%28v=VS.71%29.aspx&quot;&gt;TimeSpan Structure&lt;/a&gt; and is formatted as &lt;code&gt;d.hh:mm:ss.ff&lt;/code&gt;:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;d = days&lt;/li&gt;
&lt;li&gt;hh = hours&lt;/li&gt;
&lt;li&gt;mm = minutes&lt;/li&gt;
&lt;li&gt;ss = seconds&lt;/li&gt;
&lt;li&gt;ff = fractions of a second&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
This concludes our long winded look at the different ways to delay program execution (Timers) and accurately measure elapsed execution time (Stopwatch).  Next time you are faced with either of these challenges in your programming exploits, I hope that this article helps you get through it easier.
&lt;/p&gt;

&lt;p&gt;
Feel free to leave a comment or follow me on Twitter &lt;a href=&quot;http://twitter.com/robert_greiner&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Need More Time to Get Stuff Done?  Try Sprinting.</title>
   <link href="http://robertgreiner.com/2010/06/need-more-time-to-get-stuff-done-try-sprinting/"/>
   <updated>2010-06-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/06/need-more-time-to-get-stuff-done-try-sprinting</id>
   <content type="html">&lt;p&gt;
Let’s face it, we’re all busy people.  We fill our lives with stuff to do – some important, and some not-so-important – and always feel like we should be doing more.
&lt;/p&gt;

&lt;p&gt;
Unfortunately for programmers, this problem is compounded by the fact that we need to stay on top of an ever expanding and changing field.  So, how do we make the time to work on personal projects, study for a certification exam, go back to school, or contribute to open source while still being able to maintain a sense of stability and balance in our lives? 
&lt;/p&gt;

&lt;p&gt;
One potential solution is to break up some (or all) of your tasks into digestible chunks and work each chunk as a “sprint”.  A sprint is where you focus intensely on a single task until it is complete and then move onto the next one.  Sound familiar?  It should, what I just described is a simple implementation of an &lt;a href=”http://en.wikipedia.org/wiki/Agile_software_development”&gt;agile software development&lt;/a&gt; method called &lt;a href=”httphttp://en.wikipedia.org/wiki/Scrum_(development)”&gt;Scrum&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/scrum.png&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/scrum-300x150.png&quot; alt=&quot;&quot; title=&quot;scrum&quot; width=&quot;300&quot; height=&quot;150&quot; class=&quot;left&quot; /&gt;&lt;/a&gt;
&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; You aren't technically required to stick to the 2-4 week sprint length, if you have a couple of hours every other weekend available to try this out, just do that.  However, I would not recommend skipping multiple days during a sprint since they tend to work better when you accomplish as much as possible in a contiguous block of time.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
The problem with most tasks is the fact that they are not trivial and can’t be completed in one sitting.  This causes us to become flustered and most people end up procrastinating because they simply don’t know where to get started.  This is not a new idea, in fact the idea of breaking large tasks into smaller more manageable ones – sometimes referred to as chunking –  works well in all areas of life from &lt;a href=&quot;http://en.wikipedia.org/wiki/Parallel_computing&quot;&gt;parallel computing&lt;/a&gt; to &lt;a href=&quot;http://www.renewal.ca/nlp27.htm&quot;&gt;corporate performance improvement&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
So, next time you are trying to find the time to get some personal work done, or need to find a way to eliminate procrastination in your life try sprinting, you might be surprised as to how productive you really are.
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;How do you eat a whale? &lt;strong&gt;One bite at a time...&lt;/strong&gt;&lt;/code&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Iterating Through a Dictionary in C#</title>
   <link href="http://robertgreiner.com/2010/05/iterating-through-a-dictionary-in-csharp/"/>
   <updated>2010-05-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/05/iterating-through-a-dictionary-in-csharp</id>
   <content type="html">&lt;p&gt;
A &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/xfhwa508.aspx&quot;&gt;Dictionary&lt;/a&gt; allows you to store items in a collection using a key/value paring.  By storing your data this way, you get all of the functionality of a standard .NET &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx&quot;&gt;Collection&lt;/a&gt; with the added benefits of &lt;a href=&quot;http://en.wikipedia.org/wiki/Hash_function&quot;&gt;Hashing&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
I'm going to start off by showing you how to get data into a Dictionary.  Then, I'll move on to how to access specific data entries.  And, finally, I'll demonstrate two methods of iterating through the Dictionary.  This should give you enough information to get started with Dictionaries if you've never seen them before, and hopefully, teach you something new if you are already familiar with them.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Inserting Into a Dictionary&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
First, let's get some data into our Dictionary by adding some of the hard workers of &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Office&quot;&gt;Dunder Mifflin&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
Dictionary&amp;lt;int, Person&amp;gt; employees = new Dictionary&amp;lt;int, Person&amp;gt;();
employees.Add(1000, new Person(&quot;Jim Halpert&quot;));
employees.Add(1001, new Person(&quot;Pam Halpert&quot;));
employees.Add(1002, new Person(&quot;Andy Bernard&quot;));
employees.Add(1003, new Person(&quot;Dwight Schrute&quot;));
employees.Add(1004, new Person(&quot;Michael Scott&quot;));
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Retrieving Data From a Dictionary&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Now that we have our employees in memory, we can access them in near constant time (&lt;a href=&quot;http://en.wikipedia.org/wiki/Big_O_notation&quot;&gt;O(1)&lt;/a&gt;) by using their ID.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
Person p = employees[1003];  //Select Dwight
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Iterating Through a Dictionary&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Finally, we can iterate through the Dictionary to print a list of all Dunder Mifflin employees.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
foreach (KeyValuePair&amp;lt;int, Person&amp;gt; employee in employees) {
   Console.WriteLine(employee.Value.Name);
}
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
If you are using C# 3.0 or later, you can make use of the implicit type &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb383973.aspx&quot;&gt;var&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
foreach (var employee in employees) {
   Console.WriteLine(employee.Value.Name);
}
&lt;/pre&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How to Add an RSS Feed to Any Website</title>
   <link href="http://robertgreiner.com/2010/05/how-to-add-an-rss-feed-to-any-website/"/>
   <updated>2010-05-16T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/05/how-to-add-an-rss-feed-to-any-website</id>
   <content type="html">&lt;p&gt;
I wanted a quick and easy way for my portfolio page to show a dynamic list of what I've been blogging about on CreatingCode.  Google makes this extremely easy by offering an &lt;a href=&quot;http://code.google.com/apis/ajaxfeeds/&quot;&gt;API&lt;/a&gt; that does all of the behind the scenes work for you.  They even have a feed control wizard that will generate the code for you.  
&lt;/p&gt;

&lt;p&gt;
Here is a snippet of what the feed control wizard generated for this site.
&lt;/p&gt;


&lt;script src=&quot;https://gist.github.com/1530203.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
&amp;lt;!-- ++Begin Dynamic Feed Wizard Generated Code++ --&amp;gt;
  &amp;lt;!--
  // Created with a Google AJAX Search and Feed Wizard
  // http://code.google.com/apis/ajaxsearch/wizards.html
  --&amp;gt;

  &amp;lt;!--
  // The Following div element will end up holding the actual feed control.
  // You can place this anywhere on your page.
  --&amp;gt;
  &amp;lt;div id=&quot;feed-control-creatingcode&quot;&amp;gt;
    &amp;lt;span style=&quot;color:#676767;font-size:11px;margin:10px;padding:4px;&quot;&amp;gt;Loading...&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;!-- Google Ajax Api
  --&amp;gt;
  &amp;lt;script src=&quot;http://www.google.com/jsapi?key=notsupplied-wizard&quot;
    type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;

  &amp;lt;!-- Dynamic Feed Control and Stylesheet --&amp;gt;
  &amp;lt;script src=&quot;http://www.google.com/uds/solutions/dynamicfeed/gfdynamicfeedcontrol.js&quot;
    type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;style type=&quot;text/css&quot;&amp;gt;
    @import url(&quot;http://www.google.com/uds/solutions/dynamicfeed/gfdynamicfeedcontrol.css&quot;);
  &amp;lt;/style&amp;gt;

  &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    function LoadDynamicFeedControlCreatingCode() {
      var feeds = [
	{title: 'CreatingCode',
	 url: 'http://www.robertgreiner.com/?feed=rss2'
	}];
      var options = {
        stacked : true,
        horizontal : false,
        title : &quot;CreatingCode&quot;
      }

      new GFdynamicFeedControl(feeds, 'feed-control-creatingcode', options);
    }
    // Load the feeds API and set the onload callback.
    google.load('feeds', '1');
    google.setOnLoadCallback(LoadDynamicFeedControlCreatingCode);
  &amp;lt;/script&amp;gt;
&amp;lt;!-- ++End Dynamic Feed Control Wizard Generated Code++ --&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;</content>
 </entry>
 
 <entry>
   <title>Share the Awesomeness&#59; Creating Cheap (and Easy) Technical Videos.</title>
   <link href="http://robertgreiner.com/2010/05/share-the-awesomeness-creating-cheap-and-easy-technical-videos/"/>
   <updated>2010-05-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/05/share-the-awesomeness-creating-cheap-and-easy-technical-videos</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/flip.jpg&quot; alt=&quot;&quot; title=&quot;flip&quot; width=&quot;242&quot; height=&quot;300&quot; class=&quot;left&quot; /&gt;I really enjoy attending technical events, especially programming talks.  Almost every major city in America has several User Group meetings where (in my case) programmers/techies who are interested in a specific language or technology can all get together and talk about the various projects they are working on, or invite people to come and talk about new technology that is being developed to improve the overall quality of the development process.
&lt;/p&gt;

&lt;p&gt;
Unfortunately, most of the information shared at these meetings is very transient and only gets absorbed by a very small subset of the total number of people that may be interested in a given topic.  This problem occurs because of the locality of these meetings.  For instance, some developers either do not have the time (due to work, school, etc.) to attend user group meetings or they simply live a few hours away from the closest meeting and it is not practical for them to drive three hours to go to an hour long meeting.
&lt;/p&gt;

&lt;p&gt;
This is an unfortunate problem because these local groups have an upper-limit on how large they can get due to the number of interested people who live or work in the immediate surrounding area.  So, the question must be asked, how can we get all of this awesome information into the hands of anyone who is interested?  And the simple answer: video recording.
&lt;/p&gt;

&lt;p&gt;
In the past, the point of entry for recording, editing, and distributing homebrew videos was fairly high.  You had to start off with a nice camcorder, buy the necessary software and hardware to get the thing hooked up to your computer, and find a way to make sure the videos you made could be easily distributed.  This is quite a bit of work and personal expense burdened on anyone who wanted to be able to share the great content being broadcasted at these meetings.
&lt;/p&gt;

&lt;p&gt;
Luckily, current technology allows homebrew videos to be created easier (and cheaper) than ever.  Here is my solution:
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Video Recording&lt;/strong&gt; - I recently purchased the &lt;a href=&quot;http://www.theflip.com/products_flip_ultra_specs.II.shtml&quot;&gt;Flip Ultra HD&lt;/a&gt; which costs $199 USD and stores two full hours of HD recording.  And the best part, the video is stored on the Flip HD recorder in MPEG-4 format and can be pulled directly off of the recorder via a built in USB connection.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Video Distribution&lt;/strong&gt; - Now that the video has been recorded and copied to the computer, there are two good options for hosting and distributing the videos online.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;The free option:&lt;/em&gt; &lt;a href=&quot;http://youtube.com&quot;&gt;YouTube&lt;/a&gt;.  This makes sense for most folks who want to distribute their homebrew videos to the world.  Unfortunately, YouTube only allows your videos to be 10 minutes in length (which doesn't work so well for longer talks).
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;The premier option:&lt;/em&gt; &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.  The Vimeo plus membership will run you a whopping $60 USD for an entire year and will give you 5GB of HD upload space per week, allows embedding into your website/blog, and -in my opinion- delivers top-notch video playback.
&lt;/p&gt;

&lt;p&gt;
So there we have it, for less than $300 it is possible to make awesome technical information available to those who otherwise would not be able to experience it.  Obviously, this solution will work just as well for anyone wanting to publish their own videos to the world, I'm just more interested in technical topics.  The intent of this post was to provide some insight as to how easy it is to record and share quality information.
&lt;/p&gt;

&lt;p&gt;
&lt;span style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;http://theflip.com&quot;&gt;Flip&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Thwarting Spammers With reCAPTCHA</title>
   <link href="http://robertgreiner.com/2010/05/thwarting-spammers-with-recaptcha/"/>
   <updated>2010-05-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/05/thwarting-spammers-with-recaptcha</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/spam-in-a-can.jpg&quot; alt=&quot;&quot; title=&quot;spam-in-a-can&quot; width=&quot;150&quot; height=&quot;150&quot; class=&quot;left&quot; /&gt;One day, while going out to lunch, I checked my phone and noticed 20 new email messages from Wordpress asking me to review new comments to my blog.  I instantly knew something was wrong because I don't generally get that many comments in such a short amount of time.  After reviewing all of my email messages, I confirmed that every last one of them was asking me to approve a spam comment.  By the time I got back to my desk to deal with my new spam issue, I found over 100 messages awaiting my rejection.
&lt;/p&gt;

&lt;p&gt;
Strangely enough, I had some mixed feelings towards this lame (and ultimately futile) spam attack.  On one hand, I was super annoyed to have to deal with this problem.  But, on the other hand, I was at least a little bit encouraged to see that my blog was getting web-crawled by something out there (at the time of this writing I am completely over the encouraged part and now just plain annoyed.)
&lt;/p&gt;

&lt;p&gt;
My first plan to stop the barrage of spam comments I was receiving was to simply blacklist the IP address making all of the bad comment requests.  After all, every single spam comment had the exact same text, so that means they should be coming from the same IP address, right?  Wrong!  Either this particular spambot was spoofing new IP addresses for each spam comment it made or it was sending the requests from several different - likely infected - slave machines all over the world.
&lt;/p&gt;

&lt;h3&gt; CAPTCHA to the rescue!&lt;/h3&gt;

&lt;p&gt;
First off, a &lt;a href=&quot;http://en.wikipedia.org/wiki/Captcha&quot;&gt;CAPTCHA&lt;/a&gt; is a challenge that asks a human to type the letters generated in an image into a text field.  Since computers don't know how to read text off of images (that well) we can be assured - at least for now - that only humans will be able to solve CAPTCHA puzzles.
&lt;/p&gt;

&lt;h3&gt;Enter reCAPTCHA&lt;/h3&gt;

&lt;p&gt;
&lt;a href=&quot;http://recaptcha.net/learnmore.html&quot;&gt;reCAPTCHA&lt;/a&gt; is a CAPTCHA implementation that can be tied into any webpage that accepts user input to ensure the site's webforms aren't being automatically generated by a bot.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Why reCAPTCHA?&lt;/strong&gt; Simple, because every time you solve a reCAPTCHA puzzle, you are actually working towards something productive.
&lt;/p&gt;

&lt;p&gt;
&lt;blockquote&gt;reCAPTCHA improves the process of digitizing books by sending words that cannot be read by computers to the Web in the form of CAPTCHAs for humans to decipher. More specifically, each word that cannot be read correctly by OCR is placed on an image and used as a CAPTCHA. This is possible because most OCR programs alert you when a word cannot be read correctly.&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
Cool, huh?  Not only do you get the benefit of a spam-free site, you also get to have a direct influence of perpetualizing human knowledge by assisting in the digitization of books!  Go ahead and give yourself a pat on the back, I'll wait.
&lt;/p&gt;

&lt;h3&gt;Installing reCAPTCHA&lt;/h3&gt;

&lt;p&gt;
Installing reCAPTCHA is a breeze.  There are several different installation methods available, it's up to you to pick the one that best fits your site.  Either way, you'll need an &lt;a href=&quot;https://admin.recaptcha.net/recaptcha/createsite/?app=php&quot;&gt;API key&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://recaptcha.net/plugins/php/&quot;&gt;PHP Instructions&lt;/a&gt; - use these if you are running a normal website that takes user input, or a blog other than Wordpress.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://recaptcha.net/plugins/wordpress/&quot;&gt;Wordpress Instructions&lt;/a&gt; -use these instructions if you already have a Wordpress blog.
&lt;/p&gt;

&lt;h3&gt;And there we have it&lt;/h3&gt;

&lt;p&gt;
After installing reCAPTCHA the spam assult on my blog stopped instantly and I haven't seen another spam comment since.  The only downside is that normal human commentors (such as yourself) have to be inconvenienced a little bit to post a comment, and for this, I apologize.
&lt;/p&gt;

&lt;p&gt;
Having problems with spam comments or contacts?  CAPTCHA seems to be a solution that's just good enough to re-take control of your website and reCAPTCHA is a great implementation that works well and is easy to use.  This is just a small victory in the never ending war against spam, I'm going to celebrate by posting a new article that won't get any spam comments.
&lt;/p&gt;

&lt;p&gt;
&lt;div class=&quot;linktext&quot;&gt;Image From: &lt;a href=&quot;http://preparednesspro.files.wordpress.com/2009/04/spam-in-a-can.jpg&quot;&gt;preparednesspro.files.wordpress.com&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Expressing Many-to-Many Relationships in Hibernate</title>
   <link href="http://robertgreiner.com/2010/05/expressing-many-to-many-relationships-in-hibernate/"/>
   <updated>2010-05-02T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/05/expressing-many-to-many-relationships-in-hibernate</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/hibernate_logo.jpg&quot; alt=&quot;&quot; title=&quot;hibernate_logo&quot; width=&quot;300&quot; height=&quot;83&quot; class=&quot;left&quot; /&gt;As humans, we tend to think of the world in objects.  For instance, my &lt;strong&gt;car&lt;/strong&gt; has four &lt;strong&gt;tires&lt;/strong&gt; and my &lt;strong&gt;body&lt;/strong&gt; has a pair of &lt;strong&gt;arms&lt;/strong&gt; and &lt;strong&gt;legs&lt;/strong&gt;.  Since everything around us is thought of as objects, then why would we want to write code that stores data relationally?  The short answer is; &lt;strong&gt;we are forced to&lt;/strong&gt; based on the way traditional databases store data.
&lt;/p&gt;

&lt;p&gt;
Let’s say for instance we have a group of Students that wish to enroll in several University Courses.  Storing the Students and Courses in a relational database is trivial, however, how do we express Students that are &lt;strong&gt;enrolled&lt;/strong&gt; in Courses?  This is a typical many-to-many relationship where any number of students can be enrolled in any number of courses.
&lt;/p&gt;

&lt;p&gt;
In the world of databases, a single table is created for Students and another for Courses.  Then, a third table is created that holds the students that are enrolled in each course.  The Enrolled table is called a &lt;strong&gt;cross-reference table&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
This poses a problem for object oriented languages such as Java, C#, and Ruby because, while we don’t mind creating separate Student and Course objects, creating a third Enrolled object is poor OO design and will create unnecessary complexities in our code.
&lt;/p&gt;


&lt;h3&gt;The Code&lt;/h3&gt;

&lt;p&gt;
This is a more programmer-friendly way to store Students, Courses, and the Enrollment of Students in Courses.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530147.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;strong&gt;Student.java&lt;/strong&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
public class Student {

  private long sid;
  private String firstName;
  private String lastName;
  private double gpa;

  Student() {} //Default constructor

  public Student(String firstName, String lastName, double gpa) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.gpa = gpa;
  }

  //Getters and Setters are mandatory for every class
  //that gets mapped using Hibernate
  public void setSid(long sid) {
    this.sid = sid;
  }

  public long getSid() {
    return this.sid;
  }

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public double getGpa() {
    return this.gpa;
  }

  public void setGpa(double gpa) {
    this.gpa = gpa;
  }
}
&lt;/pre&gt;
&lt;strong&gt;Course.java&lt;/strong&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
public class Course {
  
  long cid;
  String name;
  Set students = new HashSet();

  public Course() {}

  public Course(String name) {
    this.name = name;
  }

  public long getCid() {
    return this.cid;
  }

  public void setCid(long cid) {
    this.cid = cid;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Set getStudents() {
    return students;
  }

  public void setStudents(Set students) {
    this.students = students;
  }

  public void addStudent(Student student) {
    this.students.add(student);
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now, when we need to perform an action on a Course all of the Student objects associated with that Course are passed along with it.  This is a much better way of handling the issue of enrollment, but how does this data get stored back to the database?  After all, it’s great that we can write code at the level of objects, but at the end of the day, all application data still needs to be stored back in a relational model.
&lt;/p&gt;


&lt;h3&gt;Enter Hibernate&lt;/h3&gt;

&lt;p&gt;
By using an Object-Relational Mapping (ORM) tool such as Hibernate, programmers can continue to write code in terms of objects and the ORM tool will worry about how to store the data in a relational model.  In Hibernate, this can be achieved by creating mapping files that &lt;em&gt;teach&lt;/em&gt; Hibernate how to store the data in an object.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Using Mapping Files&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
Continuing our Students-&amp;gt;Courses example, let’s create the mapping files necessary to teach Hibernate how to store each object’s data.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1530160.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;strong&gt;Student.hbm.xml&lt;/strong&gt;
&lt;pre class=&quot;xml&quot;&gt;
&amp;lt;hibernate-mapping&amp;gt;

  &amp;lt;class name=&quot;example.hibernate.Student&quot; table=&quot;students&quot;&amp;gt;

    &amp;lt;id name=&quot;sid&quot; column=&quot;sid&quot;&amp;gt;
      &amp;lt;generator /&amp;gt;
    &amp;lt;/id&amp;gt;

    &amp;lt;property name=&quot;firstName&quot; column=&quot;first_name&quot; /&amp;gt;
    &amp;lt;property name=&quot;lastName&quot; column=&quot;last_name&quot;/&amp;gt;
    &amp;lt;property name=&quot;gpa&quot; column=&quot;gpa&quot; /&amp;gt;

  &amp;lt;/class&amp;gt; 

&amp;lt;/hibernate-mapping&amp;gt;
&lt;/pre&gt;
&lt;strong&gt;
Course.hbm.xml&lt;/strong&gt;
&lt;pre class=&quot;xml&quot;&gt;
&amp;lt;hibernate-mapping&amp;gt;

  &amp;lt;class name=&quot;example.hibernate.Course&quot; table=&quot;courses&quot;&amp;gt;

    &amp;lt;id name=&quot;cid&quot; column=&quot;cid&quot;&amp;gt;
      &amp;lt;generator /&amp;gt;
    &amp;lt;/id&amp;gt;

    &amp;lt;property name=&quot;name&quot; column=&quot;course_name&quot; /&amp;gt;

    &amp;lt;set name=&quot;students&quot; table=&quot;list&quot; lazy=&quot;true&quot;&amp;gt;
      &amp;lt;key column=&quot;cid&quot;/&amp;gt;
      &amp;lt;many-to-many column=&quot;sid&quot;/&amp;gt;
    &amp;lt;/set&amp;gt;

  &amp;lt;/class&amp;gt;

&amp;lt;/hibernate-mapping&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
See how the many-to-many relationship in the Course mapping file is expressed?  This tells hibernate that a relationship exists between Courses and Students and also gives specifics on what the relationship is and how (and where) to store the relationship in the database.
&lt;/p&gt;

&lt;p&gt;
Now, we can treat our objects as objects and teach our ORM tool how to persist the data back to the database.
&lt;/p&gt;

&lt;p&gt;
Did you notice that I didn’t even start talking about Hibernate until the latter half of this article?  ORM tools allow us to write code and not worry about how to store our application’s data back to the database.
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;http://hibernate.org&quot;&gt;Hibernate&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How to Make Sure Your Website is Classified Properly With McAfee TrustedSource</title>
   <link href="http://robertgreiner.com/2010/04/how-to-make-sure-your-website-is-classified-properly-with-mcafee-trustedsource/"/>
   <updated>2010-04-24T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/04/how-to-make-sure-your-website-is-classified-properly-with-mcafee-trustedsource</id>
   <content type="html">&lt;p&gt;
If you run a website, you might want to check out how McAfee categorizes it.  In order for your site to come up unimpeded on company internet connections that use McAfee WebWasher it has to be classified properly.
&lt;/p&gt;

&lt;p&gt;
This website used to be classified as &quot;Medium Risk&quot; because it was un-categorized by the WebWasher service.  This means that everytime someone wants to view one of the pages on this site, they have to bypass a warning message.  Luckily, one of my readers informed me of this (Thanks Phil), otherwise I would have never known about it.
&lt;/p&gt;

&lt;p&gt;
Having your website classified improperly can significantly reduce your traffic during business hours.
&lt;/p&gt;

&lt;p&gt;
In order to check what your website is classified as, go to &lt;a href=&quot;http://www.trustedsource.org&quot;&gt;http://www.trustedsource.org&lt;/a&gt; and check.  If you don't agree with your classification, you can submit a re-classification request and someone will take a look at it for you.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/trusted_source_screenshot.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/trusted_source_screenshot-300x257.jpg&quot; alt=&quot;&quot; title=&quot;trusted_source_screenshot&quot; width=&quot;300&quot; height=&quot;257&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Making sure your website is classified properly is your responsibility, don't assume anyone is going to do it for you.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Write Better Code&#59; Using Nullable With C#</title>
   <link href="http://robertgreiner.com/2010/04/write-better-code-using-nullable-with-csharp/"/>
   <updated>2010-04-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/04/write-better-code-using-nullable-with-csharp</id>
   <content type="html">I'm sure if you have ever written code for more than 45 seconds, you have more than likely come across a need to check whether or not a variable has been assigned a value.

&lt;strong&gt;This is probably how about 99% of us do it: &lt;/strong&gt;

&lt;script src=&quot;https://gist.github.com/1530098.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
int age = 0;

//some code that gets user input

if (age == 0) {
  Console.WriteLine(&quot;Fail! Please enter a valid age.&quot;);
} else {
  Console.WriteLine(&quot;You are now &quot; + age + &quot; years old&quot;);
}
&lt;/pre&gt;
&lt;/noscript&gt;

The above code is bad for three reasons:

&lt;ol&gt;
	&lt;li&gt;&lt;em&gt;The code is error prone.&lt;/em&gt;  Why do things on your own, when the language provides a simple consistent way of doing things?&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;The code isn't standardized.&lt;/em&gt;  What if you assign 0 as the official &quot;un-assigned&quot; check for all of your strings, but Johnny Programmer (in his super awesome wisdom) decides to initialize all of his un-assigned integers with -1, then what?  Now you are forced to add unnecessary rules to your coding standards to ensure yours and Johnny's code plays together nicely.  This is lame.&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;The code isn't optimized. &lt;/em&gt;The fewest amount of bits to compare per if statement the better.  why compare multiple Bytes when you can compare a simple boolean?  This can end up costing you precious milliseconds.&lt;/li&gt;
&lt;/ol&gt;

What...?  What's that you ask?  What is a better way to check to see if a variable has been assigned a value?  I thought you'd never ask!

&lt;strong&gt;The super awesome way that will win you the respect of your co-workers, and maybe, the girl of your dreams (but probably not): &lt;/strong&gt;

&lt;script src=&quot;https://gist.github.com/1530106.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
//This is shorthand, you can also write the
//following statement as: 
//Nullable&amp;lt;int&amp;gt; age = null;
//Note: Shorthand only works with C#
 
int&amp;#63; age = null;

//some code that gets user input

//since we are using a Nullable here the Value
//and HasValue members for your variable.
if (!age.HasValue) {
  Console.WriteLine(&quot;Fail! Please enter a valid age.&quot;);
} else {
  Console.WriteLine(&quot;You are now &quot; + age.Value + &quot; years old&quot;);
}
&lt;/pre&gt;
&lt;/noscript&gt;

The better code makes use of Nullable.  This provides a consistent and error-free way to check to see if your variables have been assigned a value.  

This is a very easy way to improve the overall quality of your code, and, who doesn't want that?</content>
 </entry>
 
 <entry>
   <title>Writing a Simple URL Reverser Using C#</title>
   <link href="http://robertgreiner.com/2010/04/writing-a-simple-url-reverser-using-csharp/"/>
   <updated>2010-04-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/04/writing-a-simple-url-reverser-using-csharp</id>
   <content type="html">&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/undo.png&quot; alt=&quot;&quot; title=&quot;undo&quot; width=&quot;128&quot; height=&quot;128&quot; class=&quot;left&quot; /&gt;Shortened URLs have become a fact of life, especially with the advent of micro-blogging, where you only have a limited number of characters for a single post.  Unfortunately, very few shortened URLs give you a clue about where you will actually end up when you click on them.  Not only is this a security concern, but I like to have a good idea of where I'm going before I click on a link.

&lt;h3&gt;Enter ReverseURL&lt;/h3&gt;

&lt;a href=&quot;http://github.com/robertgreiner/ReverseURL&quot;&gt;ReverseURL&lt;/a&gt; is an ASP .NET page that will take a shortened URL and tell you where it is actually pointing to.

The code to figure this out is actually pretty straightforward since the URL shortening services take care of all of the redirecting.

&lt;script src=&quot;https://gist.github.com/1530070.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
private string reverseUrl(string shortenedUrl) {
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(shortenedUrl);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    Uri uri = response.ResponseUri;
    return uri.AbsoluteUri;
}
&lt;/pre&gt;
&lt;/noscript&gt;

ReverseURL is hosted on &lt;a href=&quot;http://github.com/robertgreiner/ReverseURL&quot;&gt;Github&lt;/a&gt; so feel free to grab a copy for yourself or contribute your own changes.

&lt;h3&gt;Hosted ReverseURL&lt;/h3&gt;

You can also see ReverseURL in action at &lt;a href=&quot;http://wheredoesthislinkgo.com&quot;&gt;http://wheredoesthislinkgo.com&lt;/a&gt;.  Eventually, I have plans to host a URL reversal web service here and create a Firefox plugin to help bring URL reversal to the masses.

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/wheredoesthislinkgo.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/wheredoesthislinkgo-300x234.jpg&quot; alt=&quot;&quot; title=&quot;wheredoesthislinkgo&quot; width=&quot;300&quot; height=&quot;234&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

Next time you are caught staring at a shortened URL, remember that you have options before you click on it.  A little investigation up front may save you from some headaches in the future.

&lt;div style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;http://dryicons.com/images/icon_sets/blue_velvet/png/128x128/undo.png&quot;&gt;dryicons&lt;/a&gt;&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Bill Gates Open Letter to Hobbyists from 1976</title>
   <link href="http://robertgreiner.com/2010/04/bill-gates-open-letter-to-hobbyists-from-1976/"/>
   <updated>2010-04-11T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/04/bill-gates-open-letter-to-hobbyists-from-1976</id>
   <content type="html">&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/bill_gates_teaching.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/bill_gates_teaching.jpg&quot; alt=&quot;&quot; title=&quot;bill_gates_teaching&quot; width=&quot;300&quot; height=&quot;199&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;A very interesting open letter - written almost a decade before I was born - from Bill Gates (of Micro-Soft at the time) offering his perspective on software piracy.
&lt;p&gt;

&lt;p&gt;
Whether or not you like Bill Gates (personally, I'm a fan) you have to admire one of the last sentences of this letter when he pleads for people to buy his software instead of pirating it.
&lt;/p&gt;

&lt;blockquote&gt;&quot;Nothing would please me more than being able to hire ten programmers and deluge the hobby market with good software.&quot;&lt;/blockquote&gt;

&lt;p&gt;
I bet he never thought (even in his wildest dreams) that he would create one of the most powerful software companies in the world.
&lt;/p&gt;

&lt;p&gt;
The full letter can be read at &lt;a href=&quot;http://www.lettersofnote.com/2009/10/most-of-you-steal-your-software.html&quot;&gt;Letters of Note&lt;/a&gt; and is copied below for convenience.
&lt;/p&gt;

&lt;blockquote&gt;
February 3, 1976

An Open Letter to Hobbyists

To me, the most critical thing in the hobby market right now is the lack of good software courses, books and software itself. Without good software and an owner who understands programming, a hobby computer is wasted. Will quality software be written for the hobby market?

Almost a year ago, Paul Allen and myself, expecting the hobby market to expand, hired Monte Davidoff and developed Altair BASIC. Though the initial work took only two months, the three of us have spent most of the last year documenting, improving and adding features to BASIC. Now we have 4K, 8K, EXTENDED, ROM and DISK BASIC. The value of the computer time we have used exceeds $40,000.

The feedback we have gotten from the hundreds of people who say they are using BASIC has all been positive. Two surprising things are apparent, however, 1) Most of these &quot;users&quot; never bought BASIC (less than 10% of all Altair owners have bought BASIC), and 2) The amount of royalties we have received from sales to hobbyists makes the time spent on Altair BASIC worth less than $2 an hour.

Why is this? As the majority of hobbyists must be aware, most of you steal your software. Hardware must be paid for, but software is something to share. Who cares if the people who worked on it get paid?

Is this fair? One thing you don't do by stealing software is get back at MITS for some problem you may have had. MITS doesn't make money selling software. The royalty paid to us, the manual, the tape and the overhead make it a break-even operation. One thing you do do is prevent good software from being written. Who can afford to do professional work for nothing? What hobbyist can put 3-man years into programming, finding all bugs, documenting his product and distribute for free? The fact is, no one besides us has invested a lot of money in hobby software. We have written 6800 BASIC, and are writing 8080 APL and 6800 APL, but there is very little incentive to make this software available to hobbyists. Most directly, the thing you do is theft.

What about the guys who re-sell Altair BASIC, aren't they making money on hobby software? Yes, but those who have been reported to us may lose in the end. They are the ones who give hobbyists a bad name, and should be kicked out of any club meeting they show up at.

I would appreciate letters from any one who wants to pay up, or has a suggestion or comment. Just write me at 1180 Alvarado SE, #114, Albuquerque, New Mexico, 87108. Nothing would please me more than being able to hire ten programmers and deluge the hobby market with good software.

(Signed)

Bill Gates
General Partner, Micro-Soft
&lt;/blockquote&gt;

&lt;div style=&quot;font-size: 10px;&quot;&gt;Image from &lt;a href=&quot;http://ruyoung.files.wordpress.com/2008/12/gates_bill_talking05_14338.jpg&quot;&gt;ruyoung.files.wordpress.com&lt;/a&gt;&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Handling Foreign Key Constraints in SQL</title>
   <link href="http://robertgreiner.com/2010/04/handling-foreign-key-constraints-in-sql/"/>
   <updated>2010-04-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/04/handling-foreign-key-constraints-in-sql</id>
   <content type="html">Here's a useful tip for handling foreign keys when creating database tables that I seem to forget every time I write SQL statements to create a table.

When using foreign keys you need to use the &lt;em&gt;entire key&lt;/em&gt; as your foreign key, you can't just use part of it.

This example could be easily solved by creating unique IDs but let's just pretend our boss won't let us.

&lt;script src=&quot;https://gist.github.com/1529867.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
create table Games (
	title integer,
	studio char(20),
	genre char(20),
	primary key (title, studio)
);
&lt;/pre&gt;
&lt;/noscript&gt;

The primary key for the Games table consists of both the title of the game and the studio that creates the game.  This way, another studio can create a children's game called &lt;a href=&quot;http://dragonage.bioware.com/&quot;&gt;Dragon Age: Origins&lt;/a&gt;.

&lt;script src=&quot;https://gist.github.com/1529884.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
create table Inventory (
	upc integer,
	title varchar(20),
	studio varchar(20),
	quantity integer,
	price float,
	primary key (upc),
	foreign key (title, studio) references Games (title, studio)
);
&lt;/pre&gt;
&lt;/noscript&gt;

This adds the foreign key constraint &lt;code&gt;&amp;lt;title , studio&amp;gt;&lt;/code&gt;  to the Inventory table to ensure the price and quantity assigned to a particular game match the exact entry in the Games table.  Note, that it's impossible to create a foreign key on just &lt;code&gt;Games.title&lt;/code&gt; because it is not a complete key.

This is pretty introductory level database material but knowing the small details of database implementation will drastically improve your design process.&lt;/title&gt;</content>
 </entry>
 
 <entry>
   <title>Why Training Classes Suck and 3 Things You Can Do About It</title>
   <link href="http://robertgreiner.com/2010/03/why-training-classes-suck-and-3-things-you-can-do-about-it/"/>
   <updated>2010-03-28T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/03/why-training-classes-suck-and-3-things-you-can-do-about-it</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/michael_scott.jpg&quot; alt=&quot;&quot; title=&quot;michael_scott&quot; width=&quot;300&quot; height=&quot;165&quot; class=&quot;left&quot; /&gt;There’s nothing more frustrating to me than having my time wasted, especially when project deadlines are looming around every corner.  Unfortunately, most corporate-tailored training classes are just that; a waste of time.
&lt;/p&gt;

&lt;p&gt;
Why is this? You may ask.  The simple answer is complacency.  Instructors are contracted out by training companies to cover cookie cutter material created by someone who doesn’t know anything about what &lt;em&gt;you&lt;/em&gt; are working on, upper-level managers could care less about the specifics covered in a particular training class (and why should they?), and employees are so busy that they’ll do almost anything to get a free week away from their current project.
&lt;/p&gt;

&lt;p&gt;
In a world of perpetually cut budgets, it’s a wonder that we get training at all.  That’s why if you are lucky enough to (1) have a job and (2) get company sponsored training, it’s extremely important that you make the absolute most out of your training experience because, who knows when you’ll have this opportunity again?
&lt;/p&gt;

&lt;p&gt;
Here are three things to think about to make sure you next training experience is not only beneficial to you, but also your company.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Synchronize with the training company before the class starts&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
This is easy to do even if you are not in charge of coordinating the training schedule.  Take a look at the prospective class’ learning objectives and see if any of them line up to your current or upcoming projects.  If they do, then great, skip to step 2.  If not, then keep the ones you want and request some additional topics to replace the unnecessary ones.
&lt;/p&gt;

&lt;p&gt;
Training companies make loads of cash off of your company every time they teach a class; shouldn’t you get your money’s worth?
&lt;/p&gt;

&lt;p&gt;
If the training company is unwilling to mold their material to your needs, maybe it’s time to consider a different company.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Keep the class as hands-on as possible&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
For programmers, this means having them write lots of code.  For managers, this means giving them group projects where they learn to practically use the skill they are learning.  Having an instructor drone on for hours upon hours is not going to help anyone learn anything.
&lt;/p&gt;

&lt;p&gt;
And please, do not create labs that have pre-built code in them and only require the students to add or modify a few lines to get the whole project working.  This doesn’t help the learning process and is not any better than copying code directly off of the internet.
&lt;/p&gt;

&lt;p&gt;
Your best bet is to find out what your group needs and get the labs tailored around that.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;It’s up to &lt;em&gt;you&lt;/em&gt; to get the most out of your training class&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
In some cases you won’t have any control over the course curriculum or lab structure but that doesn’t mean you’re in for a week of tedium.   Find a tutorial on something related that you know will be of value to your group and go through it while the training is occurring.  At least this way, you are learning what your company is paying you to learn, and it’s something that can directly benefit your group.
&lt;/p&gt;

&lt;p&gt;
At the very worst case, say “thanks but no thanks” and get your money back for the class.  Mangers will really appreciate your honesty and wisdom to step down from a situation that is only hurting everyone.
&lt;/p&gt;

&lt;p&gt;
Training is a huge investment for your company, shouldn’t you be sure you get the most out of it?
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;http://www.nbc.com&quot;&gt;NBC&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Honing Your Programming Skills with Project Euler</title>
   <link href="http://robertgreiner.com/2010/03/honing-your-programming-skills-with-project-euler/"/>
   <updated>2010-03-21T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/03/honing-your-programming-skills-with-project-euler</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/euler.jpg&quot; alt=&quot;&quot; title=&quot;euler&quot; width=&quot;290&quot; height=&quot;367&quot; class=&quot;left&quot; /&gt;There's nothing quite like that feeling you get when you finally figure out the solution to a problem.  Whether it is solving a complex math equation, beating your friend at Tic-Tac-Toe, or even successfully programming the DVR for the first time.  As programmers, we are constantly looking for new problems to solve and interesting ways to improve our programming skills.  
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://projecteuler.net&quot;&gt;Project Euler&lt;/a&gt; is a programming challenge site that hosts (currently) 272 programming problems of varying difficulty.  Users can log in, attempt to solve each problem, and discuss each solution.
&lt;/p&gt;

&lt;p&gt;
Here is an example of one of the Project Euler problems.
&lt;/p&gt;

&lt;p&gt;
&lt;h2&gt;Problem #1&lt;/h2&gt;
&lt;blockquote&gt;
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.
&lt;/blockquote&gt;
&lt;/p&gt;


&lt;h2&gt;The Solution&lt;/h2&gt;

&lt;p&gt;
This problem instantly reminds me of the &lt;a href=&quot;http://www.imranontech.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding&quot;&gt;FizzBuzz&lt;/a&gt; problem, so I think I'll start with that for my solution.
&lt;/p&gt;

&lt;p&gt;
One of my goals for this year is to become more proficient in Ruby and C#, so I'll solve each problem using a mixture of both languages.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529794.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;h3&gt;The Ruby Solution&lt;/h3&gt;
&lt;pre&gt;
max = 1000
sum = 0

(1..(max-1)).each do |i|
	 if ((i % 3 == 0) || (i % 5 == 0))
		sum += i
	 end
end

puts sum
&lt;/pre&gt;
&lt;/p&gt;


&lt;h3&gt;The C# Solution&lt;/h3&gt;

&lt;p&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;
int max = 1000;
int sum = 0;

for (int x = 1; x &lt; max; x++) {
	if ((x % 3 == 0) || (x % 5 == 0)) {
		sum += x;
	}
}

Console.WriteLine(sum);
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Pretty straightforward, right?  Simply sum up all of the values that are evenly divisible by 3 or 5 and print the final sum.  This is probably the solution 99% of programmers would come up with on their first attempt.  But, what about other ways of solving the same problem?  For instance, can this problem be solved without looping through each number?
&lt;/p&gt;

&lt;h2&gt;A better way to solve the problem&lt;/h2&gt;

&lt;p&gt;
One of the best parts about Project Euler is the large community of smart developers all working on the same problem sets.  Once you submit a correct answer to a problem, you will gain access to a forum thread for that particular problem and will be allowed to discuss your solution with everyone else who has solved the same problem. 
&lt;/p&gt;

&lt;p&gt;
This is one of the more interesting solutions I saw on the problem &lt;em&gt;(converted to Ruby)&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529839.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
x = 1000;
puts 1.5*((x-1)/3)*((x+2)/3) + 2.5*((x-1)/5)*((x+4)/5) - 7.5*((x-1)/15)*((x+14)/15); 
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
This solutions utalizes &lt;a href=&quot;http://en.wikipedia.org/wiki/Arithmetic_progressions&quot;&gt;arithmetic progression&lt;/a&gt; to create a more elegant solution to the original problem.
&lt;/p&gt;

&lt;p&gt;
Would you think of solving this problem using arithmetic progression?  Probably not (at least for the first attempt anyway), I sure didn't.
&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;
Project Euler is a great way to improve your programming and problem solving skills.  I hope this brief introduction was interesting enough to motivate you to check Project Euler out for yourself and try to solve some other problems on your own.  Practicing these types of problems will (at the very least) better prepare you for your next job interview, which is never a bad thing.
&lt;/p&gt;

&lt;p&gt;
&lt;span style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;http://www.mathematicianspictures.com/math_images/EULER_G_-200_290w_q30.jpg&quot;&gt;Mathematician Pictures&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Creating a Fluid Two-Column Layout With a Single Fixed Width Column</title>
   <link href="http://robertgreiner.com/2010/03/creating-a-fluid-two-column-layout-with-a-single-fixed-width-column/"/>
   <updated>2010-03-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/03/creating-a-fluid-two-column-layout-with-a-single-fixed-width-column</id>
   <content type="html">Ever wonder if you can create a fluid layout with a fixed witdh column?  Well, you can!

&lt;h2&gt;layout.html&lt;/h2&gt;

&lt;script src=&quot;https://gist.github.com/1529757.js&quot;&gt; &lt;/script&gt;
&lt;/noscript&gt;

&lt;h2&gt;test.css&lt;/h2&gt;

&lt;script src=&quot;https://gist.github.com/1529746.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
.left {
	width: 300px;
	float: left;
	background-color: #CCCCCC;
}
.right {
	margin-left: 300px;
}
&lt;/pre&gt;
&lt;/noscript&gt;

There are very few times in life that you can have things both ways, this is one of them.</content>
 </entry>
 
 <entry>
   <title>Creating Algorithmic Art Using Processing</title>
   <link href="http://robertgreiner.com/2010/03/creating-algorithmic-art-using-processing/"/>
   <updated>2010-03-07T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/03/creating-algorithmic-art-using-processing</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/processing.jpg&quot; alt=&quot;&quot; title=&quot;processing&quot; width=&quot;200&quot; height=&quot;214&quot; class=&quot;left&quot;/&gt;&lt;a href=&quot;http://wikipedia.org/algorithmic_art&quot;&gt;Algorithmic Art&lt;/a&gt; – also known as Computational Art – is a form of expression that uses various algorithms and processing techniques to create visually aesthetic digital artwork in the form of still images, animations, and music. 
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://processing.org&quot;&gt;Processing&lt;/a&gt; is an open source programming language and environment invented by Ben Fry and Casey Reyes from the&lt;a href=”http://en.wikipedia.org/wiki/MIT_Media_Lab”&gt; MIT Media Lab&lt;/a&gt; that provides a way for anyone to create algorithmic art.  Even you!   Simply download Processing and follow one of the introductory tutorials to get started.  
&lt;/p&gt;

&lt;p&gt;
Here is a piece of algorithmic art I created by extending one of the &lt;a href=&quot;http://processing.org/learning/2darray&quot;&gt;2D Array Processing tutorial&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
This is the code used to create the animation below.   Just copy and paste into your Processing editor and run to get the same output.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529393.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
Square[][] grid;

int numCols = 10;
int numRows = 10;


//Called at the initialization of the program.
void setup() {
  size(300, 300);
  grid = new Square[numCols][numRows];
  for (int x = 0; x &lt; numCols; x++) {
    for (int y = 0; y &lt; numRows; y++) {
      grid[x][y] = new Square(x * 30, y * 30, 30, 30, (x + y) * cos(y));
    }
  }
}


//The draw method acts like the main method
public void draw() {
  background(255); // white
  for (int x = 0; x &lt; numCols; x++) {
    for (int y = 0; y &lt; numRows; y++) {
      grid[x][y].oscillate();
      grid[x][y].display();
    }
  }
}

//This class will handle the information about a square to be printed on the screen.
public class Square {
  private float x, y, w, h; // (x,y) width and height
  private float angle = 127; // brightness

  public Square(float xPos, float yPos, float boxWidth, float boxHeight,
  float sAngle) {
    this.x = xPos;
    this.y = yPos;
    this.w = boxWidth;
    this.h = boxHeight;
    this.angle = sAngle;
  }

  public void setPosition(float xPos, float yPos) {
    this.x = xPos;
    this.y = yPos;
  }

  public void oscillate() {
    angle += 0.1;
  }

  public void display() {
    stroke(255);
    fill(250 * sin(angle), 0, 0);
    rect(x, y, w, h);
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
And here it is! My first piece of algorithmic art.  Not much to it, but at least it does something moderately interesting.
&lt;/p&gt;

&lt;div style=&quot;width: 310px; height: 310px; margin: 0px auto;&quot;&gt;
&lt;iframe src=&quot;http://robertgreiner.com/uploads/scripts/algorithmic_art/&quot; width=&quot;310&quot; height=&quot;310&quot; style=&quot;border: 0px;&quot;&gt;
  &lt;p&gt;Your browser does not support iframes. Click &lt;a href=&quot;http://robertgreiner.com/uploads/scripts/algorithmic_art/&quot;&gt;here&lt;/a&gt; to view the algorithmic art demo.&lt;/p&gt;
&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;
Personally, I find algorithmic art very interesting.  Simply because it takes something I’m comfortable with (programming) and fuses it with something I’m horrible at (art).  
If you decide to try out Processing, be sure to send me a link to it.  I’d love to check it out.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>OSGi Development with Knopflerfish &#8211; Part 3&#58; The Execution</title>
   <link href="http://robertgreiner.com/2010/03/osgi-development-with-knopflerfish-part-3-the-execution/"/>
   <updated>2010-03-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/03/osgi-development-with-knopflerfish-part-3-the-execution</id>
   <content type="html">&lt;p&gt;
Now that the &lt;a href=&quot;http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part1-the-setup&quot;&gt;hard&lt;/a&gt; &lt;a href=&quot;http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part2-the-code&quot;&gt;parts&lt;/a&gt; are finished, all that's left is to run our bundle in the Knopflerfish Desktop.
&lt;/p&gt;

&lt;p&gt;
Click File -&gt; Open Bundle File (Ctrl+O) and select the bundle we created in Part 2 (the default is: &amp;lt;project_path&amp;gt;/out).  &lt;em&gt;Note, the bundle .jar file gets built automatically through Eclipse.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Once the bundle has been loaded into the Knopflerfish OSGi Desktop simply hit the Start Bundle button and watch it go!
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/randomroll_run.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/randomroll_run.jpg&quot; alt=&quot;&quot; title=&quot;randomroll_run&quot; width=&quot;300&quot; height=&quot;231&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
And that's it!  You have just created your very first OSGi bundle using Eclipse and Knopflerfish.  The RandomRoll application is probably one of the lamest apps around, so go and make something awesome and send me a comment when you do.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;This is Part 3 of a 3 part introduction to OSGi and Knopflerfish.&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part1-the-setup&quot;&gt;SOA OSGi Development with Knopflerfish – Part 1: The Setup&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part2-the-code&quot;&gt;SOA OSGi Development with Knopflerfish – Part 2: The Code&lt;/a&gt;&lt;br /&gt;
SOA OSGi Development with Knopflerfish – Part 3: The Execution
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>OSGi Development with Knopflerfish &#8211; Part 2&#58; The Code</title>
   <link href="http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part2-the-code/"/>
   <updated>2010-02-28T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part2-the-code</id>
   <content type="html">&lt;p&gt;
Now that we have &lt;a href=&quot;http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part1-the-setup&quot;&gt;Eclipse and Knopflerfish installed&lt;/a&gt; let's get into some code.  This OSGi bundle will roll a random six-sided die every second and print the result to the Knopflerfish Desktop console.
&lt;/p&gt;

&lt;h3&gt;Creating the RandomRoll Project&lt;/h3&gt;

&lt;p&gt;
Click File -&gt; New Project and select OSGi Bundle
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/eclipse_new_osgi_project.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/eclipse_new_osgi_project.jpg&quot; alt=&quot;&quot; title=&quot;eclipse_new_osgi_project&quot; width=&quot;426&quot; height=&quot;420&quot; class=&quot;center&quot;/&gt;&lt;/a&gt;

&lt;p&gt;
Fill in the project information, I am going to call this project RandomRoll.
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/eclipse_randomroll_project_create.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/eclipse_randomroll_project_create.jpg&quot; alt=&quot;&quot; title=&quot;eclipse_randomroll_project_create&quot; width=&quot;426&quot; height=&quot;540&quot; class=&quot;center&quot;/&gt;&lt;/a&gt;

This is the OSGi specific information, make sure you check the &quot;Create Activator&quot; class box (More on this later.)

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/eclipse_randomroll_project_bundle_data.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/eclipse_randomroll_project_bundle_data.jpg&quot; alt=&quot;&quot; title=&quot;eclipse_randomroll_project_bundle_data&quot; width=&quot;426&quot; height=&quot;540&quot; class=&quot;center&quot;/&gt;&lt;/a&gt;

&lt;h3&gt;bundle.manifest&lt;/h3&gt;

&lt;p&gt;
The manifest file contains all of the OSGi required information for your bundle.  The Eclipse OSGi plugin has a built-in editor for the bundle.manifest file to make editing it a little easier on you.
&lt;/p&gt;

&lt;p&gt;
Your default bundle.manifest file should look like this.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529185.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
Manifest-Version: 1.0
Bundle-Name: RandomRoll
Bundle-Description: Roll a die every second
Bundle-Activator: RandomRoll.Activator
Import-Package: org.osgi.framework
Bundle-Vendor: Tutorial
Bundle-ManifestVersion: 2
Bundle-SymbolicName: RandomRoll
Bundle-Version: 1.0.0
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;h3&gt;RandomRoll.java&lt;/h3&gt;

&lt;p&gt;
This is where the logic of our OSGi application lies.  We'll treat the RandomRoll class just like any other class.  The only OSGi requirement is that RandomRoll must extend java.lang.Thread.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529188.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
package RandomRoll;

import java.util.Random;

public class RandomRoll extends Thread {

	private boolean running = true;

	public RandomRoll() {
		super(&quot;RandomRoll thread&quot;);
	}

	public void run() {
		while (running) {

			System.out.println(&quot;Roll: &quot; + rollDie());

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				System.out.println(&quot;Sleep ERROR: &quot; + e);
			}
		}
		System.out.println(&quot;RandomRoll Thread Stopped&quot;);
	}

	public void stopThread() {
		System.out.println(&quot;Stopping RandomRoll Thread&quot;);
		this.running = false;
	}

	private final int rollDie() {
		Random random = new Random();
		return random.nextInt(6) + 1; //1-6
	}
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;h3&gt;Activator.java&lt;/h3&gt;

&lt;p&gt;
Activator.start() will run when the bundle is executed by Knopflerfish.  And -as I'm sure you can guess- Activator.stop() will get executed when the bundle is finished executing (when you click the stop button.)
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529191.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
package RandomRoll;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

	public static BundleContext bundleContext = null;
	private static RandomRoll randomRoll = null;
	
	public void start(BundleContext context) throws Exception {
		System.out.println(&quot;Rolling the dice...&quot;);
		Activator.bundleContext = context;
		randomRoll = new RandomRoll();
		randomRoll.start();
	}

	public void stop(BundleContext context) throws Exception {
		System.out.println(&quot;No longer rolling dice...&quot;);
		randomRoll.stopThread();
		randomRoll.join();
	}
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;


&lt;h3&gt;Building the RandomRoll.jar Bundle&lt;/h3&gt;

&lt;p&gt;
This is my least favorite part of Java programming, I think the deployment of .jar files is tedious at best and it's really annoying to have.... wait... what's that... the .jar bundle for RandomRoll is already built for me?  Nice!  Simply look in the &lt;project_path&gt;/out folder in RandomRoll to find a nice .jar file just waiting to be installed and run.
&lt;/p&gt;

&lt;p&gt;
Speaking of... now it's time to move on to the final stage of this tutorial and &lt;a href=&quot;http://robertgreiner.com/2010/03/osgi-development-with-knopflerfish-part-3-the-execution&quot;&gt;run our new OSGi bundle&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;This is Part 2 of a 3 part introduction to OSGi and Knopflerfish.&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part1-the-setup&quot;&gt;SOA OSGi Development with Knopflerfish – Part 1: The Setup&lt;/a&gt;&lt;br /&gt;
SOA OSGi Development with Knopflerfish – Part 2: The Code&lt;br /&gt;
&lt;a href=&quot;http://robertgreiner.com/2010/03/osgi-development-with-knopflerfish-part-3-the-execution&quot;&gt;SOA OSGi Development with Knopflerfish – Part 3: The Execution&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>OSGi Development with Knopflerfish &#8211; Part 1&#58; The Setup</title>
   <link href="http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part1-the-setup/"/>
   <updated>2010-02-23T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part1-the-setup</id>
   <content type="html">&lt;p&gt;
The &lt;a href=&quot;http://en.wikipedia.org/wiki/Osgi&quot;&gt;OSGi&lt;/a&gt; framework allows Java developers to create a dynamic component model for their applications.  Developers create “bundles” that can be deployed and executed remotely and provide distributed services.  The OSGi Framework can act as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Service_oriented_architecture&quot;&gt;Service Oriented Architecture&lt;/a&gt; which is not currently available with a vanilla JavaVM environment.
&lt;/p&gt;

&lt;p&gt;
This tutorial will get you set up to create OSGi framework applications with Java.  We will be using the Eclipse IDE and the OSGi plug-in to create our bundles as well as the Knopflerfish framework to host and execute them.
&lt;/p&gt;

&lt;p&gt;
If you want to know more about Java modularity, be sure to check out Alex Blewitt's articles on InfoQ.
&lt;/p&gt;


&lt;p&gt;
&lt;a href=&quot;http://www.infoq.com/articles/modular-java-what-is-it&quot;&gt;InfoQ - Modular Java: What is it?&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.infoq.com/articles/modular-java-static-modularity&quot;&gt;InfoQ - Modular Java: Static Modularity&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;Installing Eclipse&lt;/h3&gt;

&lt;p&gt;
Eclipse can be downloaded &lt;a href=&quot;http://www.eclipse.org/downloads/&quot;&gt;here&lt;/a&gt;.  I went with the “Eclipse IDE for java Developers” package but it doesn’t really matter which one you choose.
&lt;/p&gt;

&lt;p&gt;
(Windows) Simply extract the downloaded zip file and run eclipse.exe to get started.
&lt;/p&gt;

&lt;h3&gt;Installing the Eclipse OSGi Plugin&lt;/h3&gt;

&lt;p&gt;
Next we’ll install the OSGi plug-in for Eclipse which will make creating bundles much easier, remove the need for using &lt;a href=””&gt;ant&lt;/a&gt;, and give us all of the benefits of using the Eclipse IDE to write code (intelli-sense, project management, code generation, etc.)
&lt;/p&gt;

&lt;p&gt;
In Eclipse click Help -&gt; Install New Software
Next, click the “Add” button and add the Knopflerfish update site: &lt;em&gt;http://www.knopflerfish.org/eclipse-update/&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Once the update site has been added, you should automatically see an option for the Knopflerfish plugin.  Check the box and hit “Next” to install.  Read the license terms and complete the installation.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/eclipse_knopflerfish_plugin_install.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/eclipse_knopflerfish_plugin_install.jpg&quot; alt=&quot;&quot; title=&quot;eclipse knopflerfish plugin install&quot; width=&quot;586&quot; height=&quot;514&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Now, we can create OSGi Projects (More on that later)
&lt;/p&gt;

&lt;h3&gt;Installing Knopflerfish&lt;/h3&gt;

&lt;p&gt;
Download the latest stable release from the &lt;a href=&quot;http://knopflerfish.org/download.html&quot;&gt;Knopflerfish&lt;/a&gt; website.  I will be using the &lt;a href=&quot;http://www.knopflerfish.org/releases/2.3.3/knopflerfish_osgi_2.3.3.jar&quot;&gt;complete framework version 2.3.3&lt;/a&gt; for this tutorial.
&lt;/p&gt;

&lt;p&gt;
Now, we need to install the Knopflerfish framework:
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;java –jar knopflerfish_osgi_&lt;version&gt;.jar&lt;/version&gt;&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
This will open up an installation wizard which will let you set an installation directory.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/knopflerfish_framework_install.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/knopflerfish_framework_install.jpg&quot; alt=&quot;&quot; title=&quot;knopflerfish_framework_install&quot; width=&quot;412&quot; height=&quot;413&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Finally, we need to run Knopflerfish:
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;java –jar framework.jar&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
You should now see the Knopflerfish OSGi Desktop.  This is where we will register our bundles and execute them.
&lt;/p&gt;

&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/knopflerfish_desktop.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/knopflerfish_desktop.jpg&quot; alt=&quot;&quot; title=&quot;knopflerfish_desktop&quot; width=&quot;602&quot; height=&quot;465&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;

&lt;p&gt;
Now we’re finally ready to write our first bundle, time to move on to Part 2.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;This is Part 3 of a 3 part introduction to OSGi and Knopflerfish.&lt;/strong&gt;&lt;br /&gt;
SOA OSGi Development with Knopflerfish – Part 1: The Setup&lt;br /&gt;
&lt;a href=&quot;http://robertgreiner.com/2010/02/osgi-development-with-knopflerfish-part2-the-code&quot;&gt;SOA OSGi Development with Knopflerfish – Part 2: The Code&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://robertgreiner.com/2010/03/osgi-development-with-knopflerfish-part-3-the-execution&quot;&gt;SOA OSGi Development with Knopflerfish – Part 3: The Execution&lt;/a&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using &amp;if and &#91;Conditional()&#93; to Keep Debug Code Under Control</title>
   <link href="http://robertgreiner.com/2010/02/using-if-and-conditional-to-keep-debug-code-under-control/"/>
   <updated>2010-02-20T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/02/using-if-and-conditional-to-keep-debug-code-under-control</id>
   <content type="html">&lt;p&gt;
The &lt;code&gt;#if&lt;/code&gt; directive provides a perfect way to ensure your released executable doesn't execute any code that was only intended for debug mode.
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;#if (&amp;lt;symbol&amp;gt;)&lt;/code&gt; will return true whenever the symbol being checked has been defined by default, or manually using &lt;code&gt;#define&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529146.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
#if DEBUG
  //Perform debug only code
#else
  //Release-level code
#endif
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Remember, this is only one application of &lt;code&gt;#if&lt;/code&gt;, you can use it any time you need to check to see if a symbol has been defined.
&lt;/p&gt;

&lt;p&gt;
You can also use the &lt;code&gt;[Conditional(&quot;&amp;lt;symbol&amp;gt;&quot;)]&lt;/code&gt; attribute on any method that has a return type of void.  This will cause the compiler to remove all calls to the given method if the specified symbol is not defined.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529152.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
/* using System.Diagnostics; */
[Conditional(&quot;DEBUG&quot;)]
public void printDebug() {
  Console.WriteLine(&quot;Debug Information&quot;);
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now &lt;code&gt;printDebug()&lt;/code&gt; will not be executed unless the application is in debug mode.
&lt;/p&gt;

&lt;p&gt;
Either method will save you time and effort by allowing you to leave debug code in your application, as well as provide you a more standardized and safe way to include debug 
code.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Sending Email in ASP .NET</title>
   <link href="http://robertgreiner.com/2010/02/sending-email-in-asp-net/"/>
   <updated>2010-02-17T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/02/sending-email-in-asp-net</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/email_slingshot.jpg&quot; alt=&quot;&quot; title=&quot;email_slingshot&quot; width=&quot;150&quot; height=&quot;150&quot; class=&quot;center&quot; /&gt;I can't think of too many websites that don't send automated email.  Unfortunately, for ASP .NET programmers, there are several incorrect and out-of-date code snippets online which try to explain how to send email.
&lt;/p&gt;

&lt;p&gt;
Here's the code I use on the contact form for my &lt;a href=&quot;http://robertgreiner.com&quot;&gt;personal website&lt;/a&gt; which does the trick quite nicely.
&lt;/p&gt;


&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529127.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
/* using System.Net.Mail; */
MailMessage newMail = new MailMessage();
newMail.To.Add(toAddress);
newMail.Subject = subject;
newMail.Body = body;
newMail.From = new MailAddress(fromAddress, name);
newMail.IsBodyHtml = true;

SmtpClient SmtpSender = new SmtpClient();
SmtpSender.Port = 25; //or, whatever port your SMTP server operates on
SmtpSender.Host = &quot;mail.yourdomain.com&quot;;
SmtpSender.Send(newMail);
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Here, I'm using &lt;strong&gt;MailMessage&lt;/strong&gt; to build the actual email message to be sent and &lt;strong&gt;SmtpClient&lt;/strong&gt; to do the actual sending.
&lt;/p&gt;

&lt;p&gt;
Now, the Web.config file needs to be updated so the server knows your email account credentials.
&lt;/p&gt;

&lt;p&gt;
Add this code to your Web.config file before the final &lt;strong&gt;&amp;lt;/configuration&amp;gt;&lt;/strong&gt; tag:
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529122.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;
&amp;lt;system.net&amp;gt;
  &amp;lt;mailSettings&amp;gt;
    &amp;lt;smtp&amp;gt;
      &amp;lt;network defaultCredentials=&quot;false&quot; 
           host=&quot;mail.yourdomain.com&quot; port=&quot;25&quot; 
           userName=&quot;name-to-send-email@yourdomain.com&quot; 
           password=&quot;*****&quot;/&amp;gt;
     &amp;lt;/smtp&amp;gt;
   &amp;lt;/mailSettings&amp;gt;
&amp;lt;/system.net&amp;gt;
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now, you should be able to send automated email messages to your heart's content.  Enjoy.
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;font-size: 10px;&quot;&gt;Image From &lt;a href=&quot;http://blog.blueskyfactory.com/wp-content/uploads/2009/09/emails.jpg&quot;&gt;blueskyfactory&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Getting Started With Git and TortoiseGit on Windows</title>
   <link href="http://robertgreiner.com/2010/02/getting-started-with-git-and-tortoisegit-on-windows/"/>
   <updated>2010-02-13T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/02/getting-started-with-git-and-tortoisegit-on-windows</id>
   <content type="html">&lt;p&gt;
Version control is essential to the success of any software project.  It provides the ability for multiple developers to work on the same codebase simultaneously and allows projects to be versioned for release.  However, a great deal of programmers fail to leverage the great benefits of version control for their personal projects.
&lt;/p&gt;

&lt;p&gt;
Luckily, Git and TortoiseGit are extremely easy to install and configure on Windows.  Now, there's no excuse not to version control your code!
&lt;/p&gt;

&lt;h3&gt;Here are the topics we will cover today:&lt;/h3&gt;

&lt;p&gt;
&lt;ul&gt;
	&lt;li&gt;Install Git&lt;/li&gt;
	&lt;li&gt;Install Tortoise Git&lt;/li&gt;
	&lt;li&gt;Create a new Git repository&lt;/li&gt;
	&lt;li&gt;Add an initial codebase to the Git repository&lt;/li&gt;
	&lt;li&gt;Change a file and commit&lt;/li&gt;
    &lt;li&gt;Clone the repository&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;h2&gt;Install Git&lt;/h2&gt;

&lt;p&gt;
These are the installation options I used to install &lt;a href=&quot;http://code.google.com/p/msysgit/downloads/list&quot;&gt;Git-1.7.0.2-preview20100309.exe&lt;/a&gt; on Windows.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git1.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git1.jpg&quot; alt=&quot;&quot; title=&quot;1&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git2.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git2.jpg&quot; alt=&quot;&quot; title=&quot;2&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git3.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git3.jpg&quot; alt=&quot;&quot; title=&quot;3&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git4.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git4.jpg&quot; alt=&quot;&quot; title=&quot;4&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;&lt;p style=&quot;text-align: center; margin-bottom: 20px;&quot;&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can enable the options to show a Git GUI or Bash shell if you want that option to be available every time you right-click on something in Windows Explorer.  I just didn't want that much space taken up on my right-click menu.&lt;/p&gt;&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git5.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git5.jpg&quot; alt=&quot;&quot; title=&quot;5&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git6.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git6.jpg&quot; alt=&quot;&quot; title=&quot;6&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git7.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git7.jpg&quot; alt=&quot;&quot; title=&quot;7&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git8.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git8.jpg&quot; alt=&quot;&quot; title=&quot;8&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git9.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git9.jpg&quot; alt=&quot;&quot; title=&quot;9&quot; width=&quot;513&quot; height=&quot;398&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;p&gt;
Lastly, be sure you point your system path to wherever the Git installation resides on your machine.
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;margin-top: 20px;&quot;&gt;&lt;/div&gt;
&lt;h2&gt;Install Tortoise Git&lt;/h2&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://code.google.com/p/tortoisegit/downloads/list&quot;&gt;Download&lt;/a&gt;, Install, and restart your machine.
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;margin-top: 20px;&quot;&gt;&lt;/div&gt;
&lt;h2&gt;Create a new Git repository&lt;/h2&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;
	&lt;li&gt;Create a folder -- I'm using D:\repo -- to be used for your Git repository.&lt;/li&gt;
	&lt;li&gt;Right-click the folder and select &lt;em&gt;Git Create Repository Here&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
You should now be greeted with the following message
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/git_confirm.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/git_confirm.jpg&quot; alt=&quot;&quot; title=&quot;git_confirm&quot; width=&quot;407&quot; height=&quot;116&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;margin-top: 30px;&quot;&gt;&lt;/div&gt;
&lt;h2&gt;Add an initial codebase to the Git repository&lt;/h2&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;
	&lt;li&gt;Copy your source files to the git folder.&lt;/li&gt;
	&lt;li&gt;Right click on the folder and select &lt;em&gt;Git Commit&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;In this case, I added two files.  I'm going to check both of them&lt;/li&gt;
        &lt;li&gt;click OK.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/first_commit.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/first_commit.jpg&quot; alt=&quot;&quot; title=&quot;first_commit&quot; width=&quot;466&quot; height=&quot;493&quot; class=&quot;center&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Now we have a legitimate repository with actual files in it.
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;margin-top: 20px;&quot;&gt;&lt;/div&gt;
&lt;h2&gt;Change a file and commit&lt;/h2&gt;
&lt;/p&gt;

&lt;p&gt;
Now you can change, add, or delete files within the repository.
Once you are ready to commit back to the repository, right click and select &lt;em&gt;Git Commit&lt;/em&gt; just like above.
&lt;/p&gt;

&lt;h2&gt;Clone the repository&lt;/h2&gt;

&lt;p&gt;
Cloning is one of the great features of Git, and while it isn't necessarily important for solo projects, it is important enough to mention here.
&lt;/p&gt;

&lt;p&gt;
&lt;ul&gt;
	&lt;li&gt;Tortoise allows you to clone projects by right clicking on the desired clone folder and selecting &lt;em&gt;Clone&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;In the dialog, select the parent repository.&lt;/li&gt;
	&lt;li&gt;Click OK&lt;/li&gt;
	&lt;li&gt;Now, the cloned repository will be synced up with the main repository.  This is useful for multi-person teams.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;margin-top: 20px;&quot;&gt;&lt;/div&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;/p&gt;

&lt;p&gt;
Git and TortoiseGit make it extremely easy to get personal version control up and running on your machine.  Now you can develop your projects with the piece of mind that version control provides with little hassle and setup.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Working With Custom Time Strings in C#</title>
   <link href="http://robertgreiner.com/2010/02/working-with-custom-time-strings-in-csharp/"/>
   <updated>2010-02-12T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/02/working-with-custom-time-strings-in-csharp</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/clockman.jpg&quot; alt=&quot;&quot; title=&quot;clockman&quot; width=&quot;290&quot; height=&quot;300&quot; class=&quot;left&quot; /&gt;Let's say we need to process some external data where the format and contents of the files are out of our control.  To make matters worse, what if those same external files store tiemstamps in a foreign format that DateTime.Parse() does not understand?&lt;br /&gt;

It would be ill-advised to keep the dates in string format due to the level of robust date processing capabilities present in .NET.&lt;br /&gt;

Luckily, .NET provides a nice way to create custom date formats so any date string can be easily converted into a DateTime object.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1529072.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
//locale information
CultureInfo provider = CultureInfo.InvariantCulture;

//The timestamp from the external file
string dateString = &quot;Dec 07 01:32:25 2009&quot;; 

//the new format
string format = &quot;MMM dd HH':'mm':'ss yyyy&quot;;

//Convert the time string into a legitimate DateTime object
DateTime result = DateTime.ParseExact(dateString, format, provider);
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
Now, we have the benefit of leveraging both custom timestamp values and .NET's built in DateTime Functionality.
&lt;/p&gt;

&lt;p&gt;
Do you think this might be useful on your current project?  Learn more about DateTime.ParseExact() here &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/w2sa9yss.aspx&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;http://kenyonreview.org/blog/wp-content/uploads/2008/12/daylight-savings-time.jpg&quot;&gt;kenyonreview.org&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using .NET to Monitor a Directory for Changes</title>
   <link href="http://robertgreiner.com/2010/02/using-net-to-monitor-a-directory-for-changes/"/>
   <updated>2010-02-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/02/using-net-to-monitor-a-directory-for-changes</id>
   <content type="html">&lt;p&gt;
.NET's FileSystemWatcher class can soothe the paranoid control freak in all of us by monitoring a specified folder for different types of file system changes.
&lt;/p&gt;

&lt;p&gt;
&lt;h2&gt;The Code&lt;/h2&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1527861.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
using System;
using System.Text;
using System.IO;

namespace FolderWatcher {
  class Watcher {
    static void Main(string[] args) {
      FileSystemWatcher watcher = new FileSystemWatcher(@&quot;D:\test&quot;);
      watcher.IncludeSubdirectories = true;
      watcher.Filter = &quot;&quot;;
      watcher.Renamed += new RenamedEventHandler(renamed);
      watcher.Deleted += new FileSystemEventHandler(changed);
      watcher.Changed += new FileSystemEventHandler(changed);
      watcher.Created += new FileSystemEventHandler(changed);
      watcher.EnableRaisingEvents = true;

      Console.ReadKey();
   }

    private static void renamed(object sender, RenamedEventArgs e) {
      Console.WriteLine(DateTime.Now + &quot;: &quot; + 
          e.ChangeType + &quot; &quot; + e.FullPath);
    }

    private static void changed(object sender, FileSystemEventArgs e) {
      Console.WriteLine(DateTime.Now + &quot;: &quot; + 
          e.ChangeType + &quot; &quot; + e.FullPath);
    }
  }
}
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
FileSystemWatcher watcher = new FileSystemWatcher(@&quot;D:\test&quot;);
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
The core of is application is .NET's &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx&quot;&gt;FileSystemWatcher&lt;/a&gt; class which monitors directories for file system changes.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
watcher.IncludeSubdirectories = true;
watcher.Filter = &quot;&quot;;
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
Tells the FileSystemWatcher object to include changes in subdirectories and raise events on every type of file.
&lt;/p&gt;

&lt;p&gt;
An empty string for the filter will match every file and folder in the watched directory.  File types and names can also be added to the filter to create a more fine grained watch.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
watcher.Renamed += new RenamedEventHandler(renamed);
watcher.Deleted += new FileSystemEventHandler(changed);
watcher.Changed += new FileSystemEventHandler(changed);
watcher.Created += new FileSystemEventHandler(changed);
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
Sets the types of file system events the FileSystemWatcher object will respond to.  The four possible (and self-explanatory) events are: Renamed, Deleted, Changed, and Created.  Each EventHandler takes the method to be executed on that particular event as a paramater in its constructor.
&lt;/p&gt;

&lt;p&gt;
&lt;pre&gt;
watcher.EnableRaisingEvents = true;
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
The final piece of the puzzle is to finally tell the FileSystemWatcher to start raising events on the specified directory.  Once this statement is executed, we will have a live directory watcher.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Wrapping up DevDays Austin 2009</title>
   <link href="http://robertgreiner.com/2010/01/wrapping-up-devdays-austin-2009/"/>
   <updated>2010-01-09T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/01/wrapping-up-devdays-austin-2009</id>
   <content type="html">&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/images/2010/devdays.jpg&quot;&gt;&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/devdays.jpg&quot; alt=&quot;&quot; title=&quot;devdays_banner&quot; width=&quot;150&quot; height=&quot;150&quot; class=&quot;left&quot; /&gt;&lt;/a&gt;&lt;em&gt;This is some content from my old blog that I just couldn't get rid of.  The following posts contain audio clips of talks taken at the 2009 StackOverflow DevDays conference in Austin, Tx.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Stack Overflow DevDays Austin 2009 was an absolute blast, I got to hang out with some really smart programmers and spend the entire day learning great stuff from some of the industry's best.
&lt;/p&gt;

&lt;p&gt;
Unfortunately, I didn't have time to get on the internet at all during the conference (they kept the schedule pretty full) so I couldn't blog live from the event.  Also, there wasn't a convenient spot to take video so I ended up settling for audio, which I will be releasing in the next couple of days.  I'm also going to ask the presenters for a copy of their slides to go along with the audio to help you understand what is going on better.
&lt;/p&gt;

&lt;p&gt;

If you are reading this and are thinking about going to one of the &lt;a href=&quot;http://stackoverflow.carsonified.com/events/austin/&quot;&gt;remaining events&lt;/a&gt; &lt;strong&gt;DO IT!&lt;/strong&gt;  Seriously, go buy your ticket right now, I'll wait.
&lt;/p&gt;

&lt;p&gt;
Be sure to check back soon for audio.
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DevDays Austin&#58; Eric Jones on Python</title>
   <link href="http://robertgreiner.com/2010/01/devdays-austin-eric-jones-on-python/"/>
   <updated>2010-01-08T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/01/devdays-austin-eric-jones-on-python</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/python.jpg&quot; alt=&quot;&quot; title=&quot;python&quot; width=&quot;300&quot; height=&quot;92&quot; class=&quot;left&quot; /&gt;&lt;em&gt;This is content taken from the 2009 StackOverflow DevDays conference in Austin, Tx.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
This presentation could actually be split into two different talks.  Unfortunately, Eric only had fifty minutes to cover both Python and NumPy.
&lt;/p&gt;

&lt;p&gt;
The Python part of Eric's talk dealt with a very elegantly written spell check example written by &lt;a href=&quot;http://norvig.com/spell-correct.html&quot;&gt;Peter Norvig&lt;/a&gt; (copied below). 
&lt;/p&gt;

&lt;p&gt;
This Python code not only finds spelling errors in a given input file, it also guesses what you intended to type and suggests correctly spelled words to replace the erroneous word.
&lt;/p&gt;

&lt;p&gt;
Here is the code that was discussed in Eric's talk so you can follow along with the audio.
&lt;/p&gt;

&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/1526006.js&quot;&gt; &lt;/script&gt;
&lt;noscript&gt;
&lt;pre&gt;
import re, collections

def words(text): return re.findall('[a-z]+', text.lower()) 

def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model

NWORDS = train(words(file('big.txt').read()))

alphabet = 'abcdefghijklmnopqrstuvwxyz'

def edits1(word):
   s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
   deletes    = [a + b[1:] for a, b in s if b]
   transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)&gt;1]
   replaces   = [a + c + b[1:] for a, b in s for c in alphabet if b]
   inserts    = [a + c + b     for a, b in s for c in alphabet]
   return set(deletes + transposes + replaces + inserts)

def known_edits2(word):
   return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

def known(words): return set(w for w in words if w in NWORDS)

def correct(word):
    c = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
    return max(c, key=NWORDS.get)
&lt;/pre&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;p&gt;
The second part of the talk was over &lt;a href=&quot;http://numpy.scipy.org/&quot;&gt;NumPy&lt;/a&gt;, and to be honest, it completely blew my mind.  Eric started by opening a Python program (with a GUI and everything) that dynamically displayed information about his voice as he spoke through the microphone.
&lt;/p&gt;

&lt;p&gt;
If you're interested in adding some scientific computing power to your Python applications be sure to check out NumPy and see what it can do for you.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/audio/devdays_jones_python.wma&quot;&gt;Here is the audio from Eric's talk.&lt;/a&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DevDays Austin&#58; Jonathan Johnson on iPhone Development</title>
   <link href="http://robertgreiner.com/2010/01/devdays-austin-jonathan-johnson-on-iphone-development/"/>
   <updated>2010-01-07T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/01/devdays-austin-jonathan-johnson-on-iphone-development</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/iphone.png&quot; alt=&quot;&quot; title=&quot;iphone&quot; width=&quot;203&quot; height=&quot;275&quot; class=&quot;left&quot; /&gt;&lt;em&gt;This is content taken from the 2009 StackOverflow DevDays conference in Austin, Tx.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.nilobject.com/&quot;&gt;Jonathan&lt;/a&gt; gave a very nice introductory presentation on developing applications for the iPhone.  The live code example was a great deomonstration on how to get a new app up and running quickly.  It seems that Apple really did their homework when creating the iPhone development tools.
&lt;/p&gt;

&lt;p&gt;
One disheartening part of Jonathan's talk dealt with the current state of the iPhone App Store.  As most of you probably know, the App Store has been built on this $0.99 eco-system where it's really hard to sell iPhone apps that cost more than a dollar.  Unfortunately, this means that a company may never fully re-coup the costs of developing an application if it takes them too long to create, much less turn a profit.  Does this mean there aren't going to be any new and awesoeme apps coming out for your iPhone in the future?  No.  But, the current state of the app market may cause developers looking to get into the iPhone development market have second thoughts.
&lt;/p&gt;

&lt;p&gt;
Overall, a great talk by Jonathan and it was very informative for those of us who have never developed anything for the iPhone.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/audio/devdays_johnson_iphone.wma&quot;&gt;Here is the audio from Jonathan's talk.&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://robertgreiner.com/uploads/slides/Johnson_iPhone.pdf&quot;&gt;Presentation Slides&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;Audio Note: For some reason, I couldn't get this file converted to an mp3.  Propaganda freezes up after about 70% of the file has been processed.  Unfortunately, this also means that the file is unedited.  Sorry about the ruffling around at the beginning.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;div style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;http://developer.apple.com/iphone/program/university.html&quot;&gt;Apple&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DevDays Austin&#58; Peter Mourfield on ASP .NET MVC</title>
   <link href="http://robertgreiner.com/2010/01/devdays-austin-peter-mourfield-on-asp-net-mvc/"/>
   <updated>2010-01-06T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/01/devdays-austin-peter-mourfield-on-asp-net-mvc</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/asp_logo.jpg&quot; alt=&quot;&quot; title=&quot;asp_logo&quot; width=&quot;300&quot; height=&quot;57&quot; class=&quot;left&quot; /&gt;&lt;em&gt;This is content taken from the 2009 StackOverflow DevDays conference in Austin, Tx.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
In this presentation, Pete gives an interesting talk on the ASP .NET MVC architecture.  This talk offers a fresh alternative to anyone currently working on ASP web forms.  Also, the point of entry for developing ASP .NET MVC applications is much smaller for developers currently working in MVC frameworks such as Ruby on Rails, Palm Mojo, or even Django.
&lt;/p&gt;

&lt;p&gt;
The Model View Controller (&lt;a href=&quot;http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller&quot;&gt;MVC&lt;/a&gt;) framework allows for the separation of the presentation and business logic and allows developers to change one without affecting the other. 
&lt;/p&gt;

&lt;p&gt;
The idea of MVC is nothing new, but it's nice to see the mainstream web frameworks (and even mobile development frameworks) adopt this methodology.
&lt;/p&gt;

&lt;p&gt;
If you are interested in learning more about MVC architectures or are curious about getting started with ASP .NET MVC then check out Pete's talk.  You won't regret it.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/audio/devdays_katz_couchdb.mp3&quot;&gt;Audio&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/slides/aspnetmvc_devdays.pptx&quot;&gt;Presentation Slides&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;br /&gt;
&lt;div style=&quot;font-size: 10px;&quot;&gt;&lt;p&gt;Image From: &lt;a href=&quot;http://farm4.static.flickr.com/3164/3083655246_af2be79c6d.jpg?v=0&quot;&gt;Flickr&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DevDays Austin&#58; Jonathan Sharp on jQuery</title>
   <link href="http://robertgreiner.com/2010/01/devdays-austin-jonathan-sharp-on-jquery/"/>
   <updated>2010-01-05T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/01/devdays-austin-jonathan-sharp-on-jquery</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/jquery.jpg&quot; alt=&quot;&quot; title=&quot;jquery&quot; width=&quot;200&quot; height=&quot;50&quot; class=&quot;left&quot; /&gt;&lt;em&gt;This is content taken from the 2009 StackOverflow DevDays conference in Austin, Tx.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://outwestmedia.com/about/jonathan-sharp/&quot;&gt;Jonathan Sharp&lt;/a&gt; of &lt;a href=&quot;http://outwestmedia.com&quot;&gt;Outwest Media&lt;/a&gt; gave a very informative and interesting talk on jQuery at DevDays Austin.  Jonathan's presentation includes an introduction to jQuery, an overview of jQuery's 5 core concepts, a quick look at the jQuery API, and jQuery initiaves.  Jonathan also includes a &lt;a href=&quot;http://outwestmedia.com/presentation/jquery-stackoverflow/&quot;&gt;live code demo&lt;/a&gt; which showed us how to build a jQuery plugin in 6 simple steps.
&lt;/p&gt;

&lt;p&gt;
This is a great talk to listen to if you want to know more about jQuery, or if you've started looking at it but don't really know how to move on.
&lt;/p&gt;

&lt;p&gt;
Jonathan is also a &lt;a href=&quot;http://outwestmedia.com&quot;&gt;freelance developer&lt;/a&gt; so keep him in mind if you need some quality development work done.
&lt;/p&gt;

&lt;p&gt;
Jonathan included his presentation slides and the live code demo on his &lt;a href=&quot;http://outwestmedia.com/presentation/jquery-stackoverflow/&quot;&gt;website&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/audio/devdays_sharp_jquery.mp3&quot;&gt;Audio&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;My apologies on the audio, there are a few sections I had to edit out at the begenning because people kept shuffling around in my row.  This caused some really nasty disruptions in the audio and I just removed them completely.&lt;/em&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DevDays Austin&#58; Damien Katz on CouchDB</title>
   <link href="http://robertgreiner.com/2010/01/devdays-austin-damien-katz-on-couchdb/"/>
   <updated>2010-01-04T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/01/devdays-austin-damien-katz-on-couchdb</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/couchdb-logo.png&quot; alt=&quot;&quot; title=&quot;couchdb-logo&quot; width=&quot;220&quot; height=&quot;200&quot; class=&quot;left&quot; /&gt;&lt;em&gt;This is content taken from the 2009 StackOverflow DevDays conference in Austin, Tx.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://couchdb.apache.org&quot;&gt;CouchDB&lt;/a&gt; is a robust document-oriented and schema-free database server.  CouchDB was written in &lt;a href=&quot;&quot;&gt;Erlang&lt;/a&gt; which was designed for the Telecom industry.  This means that CouchDB has excellent concurrency, message handling, and reliability.
&lt;/p&gt;

&lt;p&gt;
The most exciting thing about CouchDB actually stems from their motto, &quot;Relax&quot;.  As a programmer, you can &lt;em&gt;relax&lt;/em&gt; knowing that in the event of a database server crash, not only is your data preserved - because data is never overwitten in CouchDB, new files are created - but the CouchDB server (being a product of Erlang) will simply start itself back up and continue with business as usual.  In fact, the shutdown command of some versions of CouchDB is a simple &lt;a href=&quot;http://en.wikipedia.org/wiki/Kill_-9&quot;&gt;kill -9&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
CouchDB is especially unique because it doesn't just scale-up for larger applications, but it also scales down extremely well to create a very lightweight implementation that can be used on mobile devices and netbooks.
&lt;/p&gt;

&lt;p&gt;
Sound interesting?  Give Damien's talk a listen and see if CouchDB is the right choice for your next project.
&lt;/p&gt;

&lt;p&gt;
You can also check out the official &lt;a href=&quot;http://couchdb.apache.org/docs/intro.html&quot;&gt;CouchDB introduction&lt;/a&gt;, read the &lt;a href=&quot;http://couchdb.apache.org/docs/overview.html&quot;&gt;overview&lt;/a&gt;, check out some &lt;a href=&quot;http://couchdb.apache.org/screenshots.html&quot;&gt;screenshots&lt;/a&gt;, or visit the &lt;a href=&quot;http://wiki.apache.org/couchdb/&quot;&gt;Wiki&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/audio/devdays_katz_couchdb.mp3&quot;&gt;Audio&lt;/a&gt;&lt;/strong&gt;

&lt;p&gt;
&lt;div style=&quot;font-size: 10px;&quot;&gt;Image From: &lt;a href=&quot;https://svn.apache.org/repos/asf/couchdb/supplement/logo/couchdb-logo.png&quot;&gt;Apache&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DevDays Austin&#58; Jason Cohen on Why Code Review Doesn't Have to Suck</title>
   <link href="http://robertgreiner.com/2010/01/devdays-austin-jason-cohen-on-why-code-review-doesnt-have-to-suck/"/>
   <updated>2010-01-03T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/01/devdays-austin-jason-cohen-on-why-code-review-doesnt-have-to-suck</id>
   <content type="html">&lt;p&gt;
&lt;img src=&quot;http://robertgreiner.com/uploads/images/2010/smartbear.jpg&quot; alt=&quot;&quot; title=&quot;smartbear&quot; width=&quot;200&quot; height=&quot;129&quot; class=&quot;left&quot; /&gt;&lt;em&gt;This is content taken from the 2009 StackOverflow DevDays conference in Austin, Tx.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Jason Cohen of &lt;a href=&quot;http://smartbear.com/&quot;&gt;Smart Bear Software&lt;/a&gt; literally &lt;a href=&quot;http://smartbear.com/codecollab-code-review-book.php&quot;&gt;wrote the book&lt;/a&gt; on giving modern code reviews.  He provides great insight into the current state of code reviews and how to do them better.
&lt;/p&gt;

&lt;p&gt;
Personally, I think the most valuable part of this presentation deals with how to not waste time when doing code reviews.  Code reviews can be super costly if you aren't careful and Jason outlines some great ways to avoid being wasteful with the time and effort of your team.  
&lt;/p&gt;

&lt;p&gt;
Jason provides practical insight that can be applied to your software group no matter what the state of your code review process is.  Think you don't have the time, budget, or backing to perform awesome code reviews?  Think again.
&lt;/p&gt;

&lt;p&gt;
Enjoy!
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/audio/devdays_cohen_code_reviews.mp3&quot;&gt;Audio&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://robertgreiner.com/uploads/slides/DevDaysCodeReviews.ppt&quot;&gt;Presentation Slides&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>myBlog.createNew();</title>
   <link href="http://robertgreiner.com/2010/01/myblog-createnew/"/>
   <updated>2010-01-01T00:00:00+00:00</updated>
   <id>http://robertgreiner.com/2010/01/myblog-createnew</id>
   <content type="html">&lt;p&gt;
There comes a time in every young developer’s life where he realizes  that the knowledge he gains from work alone will not be enough to carry  his career for the next few decades.  For me, this time is now.  I need  to find a way to take my skill-set as a software engineer, corporate  employee, and member of the development community to the next level and I  think journaling my growth as a developer through this techblog is a  great place to start.
&lt;/p&gt;

&lt;p&gt;
With this blog, I will attempt to accomplish the following:
&lt;ol&gt;
	&lt;li&gt;Keep track of my growth as a developer.&lt;/li&gt;
	&lt;li&gt;Improve my communication skills.&lt;/li&gt;
	&lt;li&gt;Establish an online presence.&lt;/li&gt;
	&lt;li&gt;Put my work in a central location so I can find it later.&lt;/li&gt;
	&lt;li&gt;Document my outside-of-work projects.&lt;/li&gt;
	&lt;li&gt;Post on a semi-consistent basis.&lt;/li&gt;
	&lt;li&gt;Keep the content light and hassle free so this doesn’t feel like  work.&lt;/li&gt;
	&lt;li&gt;Provide interesting, entertaining, and informative information about  technology, specifically programming and working as a software  engineer.&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
My primary goal with &lt;em&gt;Creating Code&lt;/em&gt; is to become a &lt;strong&gt;better programmer&lt;/strong&gt; by making the readers of this blog better  programmers.
&lt;/p&gt;

&lt;p&gt;
Let’s get started.
&lt;/p&gt;</content>
 </entry>
 
 
</feed>