<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
   <channel>
      <title>Improving Blogs</title>
      <description>A mashup of blogs by the employees of Improving Enterprises</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=wmOSkp7n3BGZxq0K8jxBKg</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=wmOSkp7n3BGZxq0K8jxBKg&amp;_render=rss&amp;page=2" />
      <pubDate>Sun, 26 May 2013 00:27:52 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ImprovingBlogs" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="improvingblogs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">ImprovingBlogs</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
         <title>Forth Worth DNUG–Design Patterns</title>
         <link>http://www.devlinliles.com/post/2013/05/23/Forth-Worth-DNUG-Design-Patterns</link>
         <description>&lt;p&gt;Awesome Talk this week at Forth Worth User Group. Below are the links to the content.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" title="http://sdrv.ms/13MJ8LX" target="_blank" href="http://sdrv.ms/13MJ8LX"&gt;http://sdrv.ms/13MJ8LX&lt;/a&gt; – PowerPoint&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="https://github.com/HighwayFramework/Highway.Data"&gt;https://github.com/HighwayFramework/Highway.Data&lt;/a&gt; – Code Found here&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Enjoy&lt;/p&gt;</description>
         <author>devlin@devlinliles.com</author>
         <guid isPermaLink="false">http://www.devlinliles.com/post.aspx?id=75a599ef-6fea-45a5-9555-a76a15f81bc4</guid>
         <pubDate>Thu, 23 May 2013 19:14:39 +0000</pubDate>
      </item>
      <item>
         <title>Books Every Software Developer Should Read</title>
         <link>http://www.devlinliles.com/post/2013/05/21/Books-Every-Software-Developer-Should-Read</link>
         <description>&lt;p&gt;Yesterday at AgileDotNet, before one of Tim’s sessions, we were discussing books which every software developer should read with the room, and particularly with a bunch of SMU students who came down to Houston to attend. I promised I would post the list of those books to my blog, so here they are:&lt;/p&gt;  &lt;h4&gt;The Must Read List (in Order)&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0596008678/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596008678&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Head First Object-Oriented Analysis and Design by Brett Mclaughlin&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0132350882/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0132350882&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Clean Code : A Handbook of Agile Software Craftsmanship by Robert Martin&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0735619670/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Code Complete: A Practical Handbook of Software Construction, Second Edition by Steve McConnell&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0321213351/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321213351&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Refactoring to Patterns by Joshua Kerievsky&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0131177052/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131177052&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Working Effectively with Legacy Code by Michael Feathers&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0596007124/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596007124&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Head First Design Patterns by Eric Freeman&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Books You Should Read &amp;amp; Own Eventually&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/B000SEIBB8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B000SEIBB8&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides aka “The Gang of Four”&lt;/a&gt;      &lt;br /&gt;This is the original work which brought about the terminology of Design Patterns. We recommend the Head First book above over it simply because it’s examples are in SmallTalk and C++, which means that its showing its age. &lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0988262592/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0988262592&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win by Kevin Behr&lt;/a&gt;      &lt;br /&gt;This book is a great story about how Operations and Developers can work together, and should be read by most teams trying to tighten their relationship with their operations team. &lt;/li&gt;    &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0321200683/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321200683&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions by Bobby Woolf and Gregor Hohpe&lt;/a&gt;      &lt;br /&gt;This book should be read and used as the bible for any distributed message application you build. I’d remind you that these days most websites with APIs really are a distributed application.&lt;/li&gt; &lt;/ul&gt;</description>
         <author>devlin@devlinliles.com</author>
         <guid isPermaLink="false">http://www.devlinliles.com/post.aspx?id=2cbb7ed8-0e40-4ff5-a907-5edc2f90ab68</guid>
         <pubDate>Tue, 21 May 2013 14:32:01 +0000</pubDate>
         <category>Books</category>
      </item>
      <item>
         <title>Month 1: Learner on Tooling</title>
         <link>http://www.devlinliles.com/post/2013/05/19/Month-1-Learner-on-Tooling</link>
         <description>&lt;p&gt;This is the first month that I spent focusing on being a learner in a specific area of my life.&lt;/p&gt;  &lt;h4&gt;Software Tooling&lt;/h4&gt;  &lt;blockquote&gt;   &lt;p&gt;I selected this area so that I could challenge several closely held opinions on the workflow of a productive software developer.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;Details&lt;/h4&gt;  &lt;blockquote&gt;   &lt;h5&gt;Coaches &lt;/h5&gt;    &lt;p&gt;Tim Rayburn – PowerShell, CodeRush, and many more&lt;/p&gt;    &lt;p&gt;Amir Rajan – Ruby, SpecFlow, and general workflow optimization&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Amir and I started by looking at my current workflow that includes some major tooling and customization. I use Resharper with close to 3000+ custom templates, have rebound most keystrokes in Visual Studio, use SpecFlow for acceptance testing, and use NCrunch to run my tests continuously as I program.&lt;/p&gt;  &lt;p&gt;Amir has a similar set of workflow but massively different tooling. Amir uses CodeRush, NSpec, and SpecWatcher for continuous testing. Amir however has taken this a lot further, he has rake commands that will start up IIS express, deploy the web application, reset the database, and many other things built into what he calls “SideKick”. IF only we all had a sidekick like that.&lt;/p&gt;  &lt;p&gt;I have spent the last 4 weeks testing my environment and trying that workflow. It has been amazing. I have come to like ruby and rake for that, but think with a bit of work PowerShell would be better. I have also come to realize that I was not thinking about the possibilities in broad enough scope. If something we have to do often takes more than a couple of seconds to do, automate it. We are programmers, and if we saw our users doing tons of manual things over and over we would try to fix that.&lt;/p&gt;  &lt;p&gt;This has lead me to not hold as many opinions about tooling, but to hold one larger opinion. We need to realize that anything is possible and spend just a bit of time making sure we have the tools we need.&lt;/p&gt;  &lt;p&gt;Next Month ( by choice of my trusted coach ) – Reflective Prayer&lt;/p&gt;</description>
         <author>devlin@devlinliles.com</author>
         <guid isPermaLink="false">http://www.devlinliles.com/post.aspx?id=6dd8a883-c806-44f2-b9d6-33b9ef31d097</guid>
         <pubDate>Sun, 19 May 2013 21:48:13 +0000</pubDate>
      </item>
      <item>
         <title>Optimize for value, not busyness or resource utilization</title>
         <link>http://softwareandotherthings.blogspot.com/2013/05/optimize-for-value-not-busyness-or.html</link>
         <description>&lt;div class="MsoNormal"&gt;&lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/jprusakova/8749935268/" title="AgileDotNet@Houston by janya, on Flickr"&gt;&lt;img alt="AgileDotNet@Houston 2013" src="http://farm6.staticflickr.com/5452/8749935400_41628ce297_n.jpg" style="margin:10px;padding:10px;" width="320"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Recently, in several different project conversations, there surfaced an amazing argument. &amp;nbsp; The exchange went something like this: &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left:.5in;"&gt;-&lt;span style="font-size:7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;We need to do X, Y and Z, since these are most valuable, risky and fundamental things for the project.&amp;nbsp;&amp;nbsp; Once we complete X, Y and Z, we’ll be able to make other important decisions and move on to the following priorities. &amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left:.5in;"&gt;-&lt;span style="font-size:7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;But doing X, Y and Z only requires XX people. Our team is XZ people.&amp;nbsp; We need to pick something else, to make sure everyone is busy.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;There is value in doing the best known and most important pieces now, and there is value in postponing decisions until &lt;a rel="nofollow" target="_blank" href="http://css.dzone.com/articles/lean-tools-last-responsible"&gt;the last responsible moment&lt;/a&gt;. &amp;nbsp;There is no value in making more people busy.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Entry-level&amp;nbsp;microeconomics&amp;nbsp;courses offer this example: more chefs in the kitchen allows for more pies cooked, but only up to a point.&amp;nbsp; After that, adding people actually reduces productivity.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float:left;margin-right:1em;text-align:left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align:center;"&gt;&lt;a rel="nofollow" target="_blank" href="http://3.bp.blogspot.com/-GlPlLmgRIDs/UZk_pDzuVoI/AAAAAAAAAPU/hu0HU_E6f5M/s1600/Productivity.png" style="margin-left:auto;margin-right:auto;"&gt;&lt;img align="left" border="0" height="242" src="http://3.bp.blogspot.com/-GlPlLmgRIDs/UZk_pDzuVoI/AAAAAAAAAPU/hu0HU_E6f5M/s400/Productivity.png" width="400"/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align:center;"&gt;&lt;span style=""&gt;X axis: number of people on the team&lt;/span&gt;&lt;br /&gt;&lt;span style=""&gt;Y axis: overall productivity of the team, number of widgets per time period&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;br /&gt;The concern is overall productivity of the team, measured in value delivered to the customer. &amp;nbsp;Number of people and working hours is only important if it is too high. People-hours metric is completely irrelevant when it is lower than certain allowed maximum.&lt;br /&gt;&lt;br /&gt;If X, Y and Z are the most and only valuable items to work on right now, that is what the team should work on, and nothing else. &amp;nbsp;People, whose skills are not needed at this point in the project, can go home, learn some new skills, provide peer review to others, work on setting up infrastructure, etc.. The important part is to optimize for the project value, and not for resource utilization. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear:both;text-align:center;"&gt;&lt;a rel="nofollow" target="_blank" href="http://www.agiledotnet.com/wp-content/themes/AgileDotNet/images/2013/logo-houston-2013.png" style="margin-left:1em;margin-right:1em;"&gt;&lt;img border="0" height="185" src="http://www.agiledotnet.com/wp-content/themes/AgileDotNet/images/2013/logo-houston-2013.png" width="320"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;center&gt;&lt;br /&gt;&lt;/center&gt;&lt;/div&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7086785636466343363.post-4375103474524545104</guid>
         <pubDate>Sun, 19 May 2013 16:47:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-GlPlLmgRIDs/UZk_pDzuVoI/AAAAAAAAAPU/hu0HU_E6f5M/s72-c/Productivity.png" width="72" />
      </item>
      <item>
         <title>Books Every Software Developer Should Read</title>
         <link>http://feedproxy.google.com/~r/TimRayburnsBlog/~3/tiGVjgaC8t4/</link>
         <description>&lt;p&gt;Yesterday at AgileDotNet, before one of my sessions, we were discussing books which every software developer should read with the room, and particularly with a bunch of SMU students who came down to Houston to attend.  I promised I would post the list of those books to my blog, so here they are:&lt;/p&gt;

&lt;h2&gt;The Must Read List (in Order)&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0596008678/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596008678&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Head First Object-Oriented Analysis and Design by Brett Mclaughlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0132350882/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0132350882&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Clean Code : A Handbook of Agile Software Craftsmanship  by Robert Martin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0735619670/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Code Complete: A Practical Handbook of Software Construction, Second Edition by Steve McConnell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0321213351/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321213351&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Refactoring to Patterns by Joshua Kerievsky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0131177052/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131177052&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Working Effectively with Legacy Code by Michael Feathers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0596007124/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596007124&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Head First Design Patterns by Eric Freeman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Books You Should Read &amp;amp; Own Eventually&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/B000SEIBB8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B000SEIBB8&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides aka &amp;#8220;The Gang of Four&amp;#8221;&lt;/a&gt;&lt;br/&gt;
This is the original work which brought about the terminology of Design Patterns.  We recommend the Head First book above over it simply because it&amp;#8217;s examples are in SmallTalk and C++, which means that its showing its age.&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0988262592/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0988262592&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win by Kevin Behr&lt;/a&gt;&lt;br/&gt;
This book is a great story about how Operations and Developers can work together, and should be read by most teams trying to tighten their relationship with their operations team.&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/0321200683/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321200683&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions by Bobby Woolf and Gregor Hohpe&lt;/a&gt;&lt;br/&gt;
This book should be read and used as the bible for any distributed message application you build.  I&amp;#8217;d remind you that these days most websites with APIs really are a distributed application.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=tiGVjgaC8t4:yAxlA99iY00:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=tiGVjgaC8t4:yAxlA99iY00:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/tiGVjgaC8t4" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://TimRayburn.net/blog/books-every-software-developer-should-read</guid>
         <pubDate>Sat, 18 May 2013 12:30:00 +0000</pubDate>
      </item>
      <item>
         <title>PowerShell for Developers - DRY</title>
         <link>http://feedproxy.google.com/~r/TimRayburnsBlog/~3/-XmuhhICgN0/</link>
         <description>&lt;p&gt;DRY is an acronym that was created by &lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/020161622X/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=020161622X&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Andrew Hunt and Dave Thomas in their book The Pragmatic Programmer&lt;/a&gt;.  It stands for Don&amp;#8217;t Repeat Yourself.  We&amp;#8217;ve espoused terse commands in all the previous chapters, but how to I avoid having to re-invent the wheel every time I open a PowerShell prompt.&lt;/p&gt;

&lt;h2&gt;Profiles&lt;/h2&gt;

&lt;p&gt;There is a script which runs every time you open a PowerShell prompt, it&amp;#8217;s called your Profile.  The file name varies depending on your operating system and version, but you can find it quickly by opening a prompt and typing &lt;code&gt;$profile&lt;/code&gt; like so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $profile
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Users&amp;#92;Tim&amp;#92;Documents&amp;#92;WindowsPowerShell&amp;#92;Microsoft.PowerShell_profile.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now if you&amp;#8217;ve got a brand new environment, this file may not even exist.  You can test if it does, and then create it if it does not with the following commands:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Test-Path $PROFILE
&lt;/span&gt;&lt;span class='line'&gt;False
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; New-Item -path $profile -type file -force
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:&amp;#92;Users&amp;#92;Tim&amp;#92;Documents&amp;#92;WindowsPowerShell
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;-a---         5/12/2013   6:09 PM          0 Microsoft.PowerShell_profile.ps1
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; notepad $PROFILE&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;The first command ensures that the you don&amp;#8217;t already have a profile.  If it returns true, the skip the second command.&lt;/p&gt;

&lt;p&gt;The second command created the profile, as a file, and uses -force to create any directories required to create the item along the way.  This command will work even if you don&amp;#8217;t have a &lt;code&gt;WindowsPowershell&lt;/code&gt; directory in your &lt;code&gt;Documents&lt;/code&gt; folder.&lt;/p&gt;

&lt;h3&gt;What do I put in a $PROFILE?&lt;/h3&gt;

&lt;p&gt;Things you don&amp;#8217;t want to type over and over again, of course.  Don&amp;#8217;t Repeat Yourself (DRY).  Now, in reality you don&amp;#8217;t want your profile to become just a giant function library, we have a concept called Modules for that, which we will discuss in just a minute, but there are some things which belong in your $PROFILE.&lt;/p&gt;

&lt;h4&gt;The Prompt&lt;/h4&gt;

&lt;p&gt;There is a special function called &lt;code&gt;Prompt&lt;/code&gt; which you can define, that controls how what your command prompt looks like.  You may have noticed that during this article I&amp;#8217;ve had a very basic prompt that was just &lt;code&gt;&amp;gt;&lt;/code&gt;, but most of you likely have a prompt that looks more like this &lt;code&gt;PS C:&amp;#92;Source&amp;gt;&lt;/code&gt;.  There is no trickery, I just wanted to make my prompt minimalist for these articles, so I typed the following:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; function prompt { "&amp;gt; " }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As you can see, instantly my prompt was set to the minimalist version you&amp;#8217;ve seen in all these articles.  How is the default prompt defined?  Let&amp;#8217;s see, shall we?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; (get-item Function:&amp;#92;prompt).Definition
&lt;/span&gt;&lt;span class='line'&gt;"PS $($executionContext.SessionState.Path.CurrentLocation)$('&amp;gt;' * ($nestedPromptLevel + 1)) "
&lt;/span&gt;&lt;span class='line'&gt;# .Link
&lt;/span&gt;&lt;span class='line'&gt;# http://go.microsoft.com/fwlink/?LinkID=225750
&lt;/span&gt;&lt;span class='line'&gt;# .ExternalHelp System.Management.Automation.dll-help.xml&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So this prompt is defined as &lt;code&gt;PS&lt;/code&gt; followed by the expression &lt;code&gt;$executionContext.SessionState.Path.CurrentLocation&lt;/code&gt; which gets the current location of the execution context (aka the directory you&amp;#8217;re in).  Then, it displays one &lt;code&gt;&amp;gt;&lt;/code&gt; for every level of &lt;code&gt;$nestedPromptLevel&lt;/code&gt;, adding one.  Well if your like most people, you&amp;#8217;ve likely got no idea what the heck &lt;code&gt;$nestedPromptLevel&lt;/code&gt; is.  We will discuss it further, but for the most basic idea, there is a command called &lt;code&gt;$Host.EnterNestedPrompt()&lt;/code&gt; which creates a new prompt.  Like so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; $host.EnterNestedPrompt()
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt;&amp;gt; $host.EnterNestedPrompt()
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt;&amp;gt;&amp;gt; $host.EnterNestedPrompt()
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt;&amp;gt;&amp;gt;&amp;gt; exit
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt;&amp;gt;&amp;gt; exit
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt;&amp;gt; exit
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As you can see, each nested level of prompt adds a &lt;code&gt;&amp;gt;&lt;/code&gt;, which makes perfect sense given the above &lt;code&gt;prompt&lt;/code&gt; function definition.&lt;/p&gt;

&lt;h2&gt;Location&lt;/h2&gt;

&lt;p&gt;Your current working directory is on display in the prompt at all times, and you know if you want to change that directory, you use &lt;code&gt;cd&lt;/code&gt;.  It must be named &lt;code&gt;cd&lt;/code&gt;, both DOS and LINUX agree on this, how could it possibly be named something else, right?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; cd Highway
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;#92;Highway&amp;gt; alias cd
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           cd -&amp;gt; Set-Location&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Well, as you can see, in PowerShell, which &lt;code&gt;cd&lt;/code&gt; is an alias that exists by default for it, the actual command you&amp;#8217;re execution is &lt;code&gt;Set-Location&lt;/code&gt;.  Well, most programs would rightly assume that whatever you can &lt;code&gt;Set-&lt;/code&gt; you can also &lt;code&gt;Get-&lt;/code&gt;, right?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;#92;Highway&amp;gt; Get-Location
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Path
&lt;/span&gt;&lt;span class='line'&gt;----
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;#92;Highway&amp;gt; alias -Definition Get-Location
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           gl -&amp;gt; Get-Location
&lt;/span&gt;&lt;span class='line'&gt;Alias           pwd -&amp;gt; Get-Location&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Yup, Get-Location returns the current &lt;code&gt;Path&lt;/code&gt; we are at.  You can see that we have two aliases defined by default for us, one is just shorthand for Get-Item, and the other is a helper alias for our Linux friends, who use &lt;code&gt;pwd&lt;/code&gt; (short for Print Working Directory) to accomplish this same task.&lt;/p&gt;

&lt;h3&gt;Time to get pushy&lt;/h3&gt;

&lt;p&gt;Now, as it happens, in PowerShell (and Linux, and DOS) there are a couple of commands for working with Location that most people didn&amp;#8217;t learn when they were first struggling through how to work at a command prompt.  These two commands are called &lt;code&gt;pushd&lt;/code&gt; and &lt;code&gt;popd&lt;/code&gt; in Linux and DOS, but in PowerShell those are, of course, just aliases:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; alias pushd
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           pushd -&amp;gt; Push-Location
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; alias popd
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           popd -&amp;gt; Pop-Location&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So &lt;code&gt;Push-Location&lt;/code&gt; and &lt;code&gt;Pop-Location&lt;/code&gt; are commands that let you quickly leave your current location, but then return there very quickly.  Let me demonstrate:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; pushd 'C:&amp;#92;Windows&amp;#92;Microsoft.NET&amp;#92;Framework&amp;#92;v4.0.30319'
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Windows&amp;#92;Microsoft.NET&amp;#92;Framework&amp;#92;v4.0.30319&amp;gt; pushd 'C:&amp;#92;Program Files'
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Program Files&amp;gt; pushd 'C:&amp;#92;Program Files (x86)'
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Program Files (x86)&amp;gt; pushd 'C:&amp;#92;Users&amp;#92;Tim&amp;#92;Documents&amp;#92;WindowsPowerShell'
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Users&amp;#92;Tim&amp;#92;Documents&amp;#92;WindowsPowerShell&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Program Files (x86)&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Program Files&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Windows&amp;#92;Microsoft.NET&amp;#92;Framework&amp;#92;v4.0.30319&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So initially, &lt;code&gt;pushd&lt;/code&gt; would appear to just be a longer version of &lt;code&gt;cd&lt;/code&gt;, it moves our current working directory to whichever directory we name.  But, when we then invoke &lt;code&gt;popd&lt;/code&gt; the magical nature becomes clear.  When we invoke &lt;code&gt;pushd&lt;/code&gt; it changes our directory, but puts the directory we&amp;#8217;re leaving on a stack of remembered directories.  &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29"&gt;A stack, hence push and pop.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we pop the locations back off the stack, we are transported back to that location as our current working directory.  Pretty darn useful if you need to move from one path to another and back very quickly.&lt;/p&gt;

&lt;h3&gt;PSDrive&lt;/h3&gt;

&lt;p&gt;Now, Location is all well and good, but that described where you are a given drive.  My default drive, and likely yours, is &lt;code&gt;C:&lt;/code&gt; aka the C-Drive.  From time immemorial this has been the default hard drive letter in Windows. &lt;code&gt;A:&lt;/code&gt; and &lt;code&gt;B:&lt;/code&gt; were reserved for Floppy drives.  Hard drives started at the letter C and incremented from there.  But, that has been simply default for a long time now.&lt;/p&gt;

&lt;p&gt;In PowerShell, I can still use &lt;code&gt;C:&lt;/code&gt; and &lt;code&gt;D:&lt;/code&gt; to move between drives.  This next set of commands will only work if you have two drives (or an SSD and a &lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/B00AK31M3G/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B00AK31M3G&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Flash card&lt;/a&gt; as I&amp;#8217;m using on my &lt;a rel="nofollow" target="_blank" href="http://www.amazon.com/gp/product/B00BE5T2TA/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B00BE5T2TA&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Microsoft Surface Pro&lt;/a&gt;):&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; d:
&lt;/span&gt;&lt;span class='line'&gt;PS D:&amp;#92;&amp;gt; dir
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: D:&amp;#92;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----         5/11/2013   2:17 PM            iTunes
&lt;/span&gt;&lt;span class='line'&gt;d----         5/11/2013   2:27 PM            iTunes Library
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;PS D:&amp;#92;&amp;gt; c:
&lt;/span&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; dir
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:&amp;#92;Source
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/7/2013   1:57 PM            Blog
&lt;/span&gt;&lt;span class='line'&gt;d----          5/9/2013   7:06 PM            Highway
&lt;/span&gt;&lt;span class='line'&gt;d----         5/11/2013   4:17 PM            Node
&lt;/span&gt;&lt;span class='line'&gt;d----          5/5/2013   5:13 PM            PowerShell
&lt;/span&gt;&lt;span class='line'&gt;d----         4/11/2013  11:58 PM            Presentation-EasyESB
&lt;/span&gt;&lt;span class='line'&gt;d----         5/10/2013   7:55 PM            RrynVsPS
&lt;/span&gt;&lt;span class='line'&gt;d----         4/20/2013   1:53 PM            SynTask&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As you can see, the commands move me between those two drives.  But in reality, the concept of a &lt;em&gt;drive&lt;/em&gt; has been much expanded in PowerShell.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If it has hierarchy (aka Locations) you want to Navigate, or items you want to inspect, then in PowerShell someone will likely have made it a drive.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;There is a command in PowerShell that lists all current drives:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; Get-PSDrive
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
&lt;/span&gt;&lt;span class='line'&gt;----           ---------     --------- --------      ----                                               ---------------
&lt;/span&gt;&lt;span class='line'&gt;Alias                                  Alias
&lt;/span&gt;&lt;span class='line'&gt;C                  78.10         32.42 FileSystem    C:&amp;#92;                                                         Source
&lt;/span&gt;&lt;span class='line'&gt;Cert                                   Certificate   &amp;#92;
&lt;/span&gt;&lt;span class='line'&gt;D                   3.29         56.16 FileSystem    D:&amp;#92;
&lt;/span&gt;&lt;span class='line'&gt;E                                      FileSystem    E:&amp;#92;
&lt;/span&gt;&lt;span class='line'&gt;Env                                    Environment
&lt;/span&gt;&lt;span class='line'&gt;Function                               Function
&lt;/span&gt;&lt;span class='line'&gt;HKCU                                   Registry      HKEY_CURRENT_USER
&lt;/span&gt;&lt;span class='line'&gt;HKLM                                   Registry      HKEY_LOCAL_MACHINE
&lt;/span&gt;&lt;span class='line'&gt;Variable                               Variable
&lt;/span&gt;&lt;span class='line'&gt;WSMan                                  WSMan&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;&lt;strong&gt;blink&lt;/strong&gt; &lt;strong&gt;blink&lt;/strong&gt; &amp;#8230; Ok, so that is more drives than I was expecting when I first invoked this command.  So what all drives are those, and how do I use them?&lt;/p&gt;

&lt;p&gt;Enter &lt;code&gt;Set-Location&lt;/code&gt;, aka &lt;code&gt;cd&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:&amp;#92;Source&amp;gt; cd alias:
&lt;/span&gt;&lt;span class='line'&gt;PS Alias:&amp;#92;&amp;gt; ls | select -first 5
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           % -&amp;gt; ForEach-Object
&lt;/span&gt;&lt;span class='line'&gt;Alias           ? -&amp;gt; Where-Object
&lt;/span&gt;&lt;span class='line'&gt;Alias           ac -&amp;gt; Add-Content
&lt;/span&gt;&lt;span class='line'&gt;Alias           asnp -&amp;gt; Add-PSSnapin
&lt;/span&gt;&lt;span class='line'&gt;Alias           cat -&amp;gt; Get-Content&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Here I&amp;#8217;ve &lt;code&gt;Set-Location&lt;/code&gt; to the Alias drive, and listed the first 5 items.  Each PSDrive has different contents depending on what it is representing.  Here&amp;#8217;s a sum-up of the contents of the &lt;strong&gt;default&lt;/strong&gt; set of drives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C, D and E drive are File System drives, representing your various mounted drives.  In my case they are my SSD, Flash card, and virtual CD drive.&lt;/li&gt;
&lt;li&gt;Cert represents your digital certificate store, both CurrentUser and LocalMachine, which are the two root locations.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS Alias:&amp;#92;&amp;gt; cd Cert:
&lt;/span&gt;&lt;span class='line'&gt;PS Cert:&amp;#92;&amp;gt; ls | select -first 5
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Location   : CurrentUser
&lt;/span&gt;&lt;span class='line'&gt;StoreNames : {SmartCardRoot, Root, Trust, AuthRoot...}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Location   : LocalMachine
&lt;/span&gt;&lt;span class='line'&gt;StoreNames : {TrustedPublisher, ClientAuthIssuer, Remote Desktop, Root...}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;ul&gt;
&lt;li&gt;Env represents your Environment Variables, which contains all defined environment variables for your machine.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS Cert:&amp;#92;&amp;gt; cd env:
&lt;/span&gt;&lt;span class='line'&gt;PS Env:&amp;#92;&amp;gt; ls | select -first 5
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;ALLUSERSPROFILE                C:&amp;#92;ProgramData
&lt;/span&gt;&lt;span class='line'&gt;APPDATA                        C:&amp;#92;Users&amp;#92;Tim&amp;#92;AppData&amp;#92;Roaming
&lt;/span&gt;&lt;span class='line'&gt;asl.log                        Destination=file
&lt;/span&gt;&lt;span class='line'&gt;ChocolateyInstall              C:&amp;#92;Chocolatey
&lt;/span&gt;&lt;span class='line'&gt;CommonProgramFiles             C:&amp;#92;Program Files&amp;#92;Common Files&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;ul&gt;
&lt;li&gt;Function represents all functions defined in PowerShell, and in fact is how I showed you the definition of &lt;code&gt;prompt&lt;/code&gt; earlier in this chapter (go ahead, look back, I don&amp;#8217;t mind)&lt;/li&gt;
&lt;li&gt;HKCU and HKLM represent your register, and specifically the &lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt; and &lt;strong&gt;HKEY_LOCAL_MACHINE&lt;/strong&gt; sections of it.  For instance, want to know all versions of the .NET Framework 4.0 installed on your box?&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS Env:&amp;#92;&amp;gt; ls HKLM:&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs | %{$_.Name}
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.0
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.0,Profile=Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.0.1
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.0.1,Profile=Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.0.2
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.0.2,Profile=Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.0.3
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.0.3,Profile=Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;.NETFramework,Version=v4.5
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE&amp;#92;SOFTWARE&amp;#92;Microsoft&amp;#92;.NETFramework&amp;#92;v4.0.30319&amp;#92;SKUs&amp;#92;Default&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;ul&gt;
&lt;li&gt;Variable represents all current variables defined in your scope.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS Env:&amp;#92;&amp;gt; ls Variable:&amp;#92; | select -first 3
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;$                              Get-PSDrive
&lt;/span&gt;&lt;span class='line'&gt;?                              True
&lt;/span&gt;&lt;span class='line'&gt;^                              Get-PSDrive&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;ul&gt;
&lt;li&gt;WSMan represents the &amp;#8220;Windows Remote Management&amp;#8221; aka WinRM settings.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Moreover, these are just the beginning.  Lots of modules, which we are about to discuss, create even more drives.  With the right modules you can browse around Active Directory, SQL Servers, IIS Websites, and so much more.&lt;/p&gt;

&lt;h2&gt;Modules Basics&lt;/h2&gt;

&lt;p&gt;Modules are a way to expand your available functions, drives, etc in PowerShell, but in an optional manner.  Any given PowerShell environment can load many different Modules, in and adhoc manner.  You can get a list of the current Modules you&amp;#8217;re running as so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Module
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;ModuleType Name                                ExportedCommands
&lt;/span&gt;&lt;span class='line'&gt;---------- ----                                ----------------
&lt;/span&gt;&lt;span class='line'&gt;Manifest   Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
&lt;/span&gt;&lt;span class='line'&gt;Manifest   Microsoft.PowerShell.Security       {ConvertFrom-SecureString, ConvertTo-SecureString, Get-Acl, Get-Authe...
&lt;/span&gt;&lt;span class='line'&gt;Manifest   Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
&lt;/span&gt;&lt;span class='line'&gt;Manifest   Microsoft.WSMan.Management          {Connect-WSMan, Disable-WSManCredSSP, Disconnect-WSMan, Enable-WSManC...
&lt;/span&gt;&lt;span class='line'&gt;Manifest   pki                                 {Add-CertificateEnrollmentPolicyServer, Export-Certificate, Export-Pf...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As you can see, I have four modules loaded at the current time.  But those are just what I have loaded.  What I have available to me is quite another thing.  If you type &lt;code&gt;Get-Module -ListAvailable&lt;/code&gt; it will show you all of your possible options, but that output is large.  I&amp;#8217;m going to limit it somewhat here:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Module -ListAvailable | select -first 10
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:&amp;#92;Users&amp;#92;Tim&amp;#92;Documents&amp;#92;WindowsPowerShell&amp;#92;Modules
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;ModuleType Name                                ExportedCommands
&lt;/span&gt;&lt;span class='line'&gt;---------- ----                                ----------------
&lt;/span&gt;&lt;span class='line'&gt;Script     EZOut                               {Add-FormatData, Clear-FormatData, Out-FormatData, Remove-FormatData...}
&lt;/span&gt;&lt;span class='line'&gt;Script     IsePackV2                           {Add-PowerGUIMenu, Add-IseMenu, Add-Icicle, Clear-Icicle...}
&lt;/span&gt;&lt;span class='line'&gt;Script     Pester                              {Assert-MockCalled, Assert-VerifiableMocks, Context, Describe...}
&lt;/span&gt;&lt;span class='line'&gt;Script     Pipeworks                           {Get-FunctionFromScript, Write-PowerShellHashtable, Import-PSData, Ex...
&lt;/span&gt;&lt;span class='line'&gt;Script     psake                               {Assert, Exec, FormatTaskName, Framework...}
&lt;/span&gt;&lt;span class='line'&gt;Script     PsGet                               {Get-PsGetModuleHash, Get-PsGetModuleInfo, Install-Module, Update-Mod...
&lt;/span&gt;&lt;span class='line'&gt;Script     ScriptCop                           {Get-ScriptCopRule, Register-ScriptCopRule, Unregister-ScriptCopRule,...
&lt;/span&gt;&lt;span class='line'&gt;Script     Send-Growl                          {Get-GrowlPath, Register-GrowlCallback, Register-GrowlType, Send-Grow...
&lt;/span&gt;&lt;span class='line'&gt;Script     ShowUI                              {Add-CodeGenerationRule, Add-UIModule, Select-UIType, Get-AssemblyNam...
&lt;/span&gt;&lt;span class='line'&gt;Script     TRayburn-Utils                      {New-BasicAuth, Set-AppSetting, Set-NuSpecVersion, Test-Item}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As you can see, I have a number of Modules installed, and they are installed by in the &lt;code&gt;WindowsPowerShell&amp;#92;Modules&lt;/code&gt; folder of my Documents folder.  But as I said, there are alot of them:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Module -ListAvailable | measure
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Count    : 62
&lt;/span&gt;&lt;span class='line'&gt;Average  :
&lt;/span&gt;&lt;span class='line'&gt;Sum      :
&lt;/span&gt;&lt;span class='line'&gt;Maximum  :
&lt;/span&gt;&lt;span class='line'&gt;Minimum  :
&lt;/span&gt;&lt;span class='line'&gt;Property :&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;62 in fact, on my box alone, and it isn&amp;#8217;t part of a domain, or a server, or one of many other things which might add to that list.&lt;/p&gt;

&lt;h3&gt;Creating your own modules&lt;/h3&gt;

&lt;p&gt;You can create your own modules very simply.  A module is just a PowerShell script, named &lt;code&gt;.psm1&lt;/code&gt; instead of simply &lt;code&gt;.ps1&lt;/code&gt; and which loads up a series of functions, cmdlets, aliases, etc.  The big additional requirement is that the script must also declare what it intends to make available to those who &lt;code&gt;Import&lt;/code&gt; that module.  Simply defining a function in a script isn&amp;#8217;t enough, you must also &lt;code&gt;Export&lt;/code&gt; that function to those who use the module.  This is done with the Cmdlet &lt;code&gt;Export-ModuleMember&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not going to go into details here about how to create a PowerShell module, there is alot of information out there on that already.  If you&amp;#8217;d like to see the source of one, check out either &lt;a rel="nofollow" target="_blank" href="https://github.com/trayburn/powershell"&gt;my PowerShell repository&lt;/a&gt;, or &lt;a rel="nofollow" target="_blank" href="https://github.com/pester/pester"&gt;the repository for Pester&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To use a module you have installed, simply type:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Import-Module &amp;lt;name&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h3&gt;Must-Have Modules&lt;/h3&gt;

&lt;p&gt;The community of developers and administrators in the world being the wonderful geeks that they are, there are many awesome Modules that have been made available for others to consume.  While it saddens me to report that there is not one consolidated repository, like NuGet for references, there are several good places.  Both &lt;a rel="nofollow" target="_blank" href="http://nuget.org"&gt;NuGet&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://chocolatey.org"&gt;Chocolatey&lt;/a&gt; have PowerShell modules hiding in their directories, but in my opinion the best overall implementation for PowerShell is &lt;a rel="nofollow" target="_blank" href="http://psget.net"&gt;PsGet.net&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;PsGet&lt;/h3&gt;

&lt;p&gt;PsGet is the module that drives access to the PsGet.net directory of modules.  To get started with it, simply type:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;This will download and install the PsGet module.  Once it&amp;#8217;s installed, go ahead and import that module:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Import-Module PsGet&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;You now have two powerful commands are your disposal:
- Install-Module
- Update-Module&lt;/p&gt;

&lt;p&gt;With these, you can install any module from the PsGet.net directory with just one command.&lt;/p&gt;

&lt;h3&gt;Pester&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;m a big fan of TDD/BDD and so I was sold the moment Pester was described to me as a BDD framework for PowerShell.  It allows me to test my modules with the familiar Describe, Context, It syntax.  This module was created by the awesome &lt;a rel="nofollow" target="_blank" href="http://about.me/scottmuc/"&gt;Scott Muc&lt;/a&gt; and I&amp;#8217;ve used it in my own PowerShell work.  Details on how to use it can be found at the &lt;a rel="nofollow" target="_blank" href="https://github.com/pester/pester/wiki"&gt;GitHub wiki&lt;/a&gt; for the project, and &lt;a rel="nofollow" target="_blank" href="http://scottmuc.com/powershell-pester-2-and-1-dot-2-released/"&gt;on Scott&amp;#8217;s blog&lt;/a&gt;.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Install-Module Pester
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Import-Module Pester&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h3&gt;PowerShell Community Extensions&lt;/h3&gt;

&lt;p&gt;So what happens when lots of people love PowerShell and start putting together their greatest hits functions and CmdLets?  PowerShell Community Extensions (PSCX) or course!  Think of this as a -contrib project for PowerShell.  It has functions that do all sorts of things, from awesome, to cute.  How many commands?  148 as of this writing.  Everything from &lt;code&gt;Out-Speech&lt;/code&gt; which voice outputs any piped content, to quick helpers like &lt;code&gt;Set-ReadOnly&lt;/code&gt; and &lt;code&gt;Set-Writeable&lt;/code&gt;.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Install-Module PSCX
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Import-Module PSCX&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 

&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=-XmuhhICgN0:ZZ_q1ikGoYo:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=-XmuhhICgN0:ZZ_q1ikGoYo:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/-XmuhhICgN0" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://TimRayburn.net/blog/powershell-for-developers-dry</guid>
         <pubDate>Mon, 13 May 2013 02:06:00 +0000</pubDate>
      </item>
      <item>
         <title>Agile.NET Houston 2013</title>
         <link>http://feedproxy.google.com/~r/TimRayburnsBlog/~3/W3k4ehZ6OvI/</link>
         <description>&lt;p&gt;&lt;img class="left" src="http://TimRayburn.net/images/logo-houston-2013.png"&gt;&lt;/p&gt;

&lt;p&gt;So Agile.NET Houston is coming up soon, and I&amp;#8217;ll be there speaking as part of the Quartermaster track.  If you&amp;#8217;d like to attend, we still have some spots available, and you can use the discount code &lt;strong&gt;IEFriends50&lt;/strong&gt; to get 50% off the cost of registration, bringing it in at just $75.&lt;/p&gt;

&lt;h1&gt;&lt;a rel="nofollow" target="_blank" href="http://adnhouston.eventbrite.com/?discount=IEFriends50"&gt;Register Now&lt;/a&gt;&lt;/h1&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=W3k4ehZ6OvI:djUuUcdoC6M:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=W3k4ehZ6OvI:djUuUcdoC6M:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/W3k4ehZ6OvI" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://TimRayburn.net/blog/agile-dot-net-houston-2013</guid>
         <pubDate>Fri, 10 May 2013 21:45:00 +0000</pubDate>
      </item>
      <item>
         <title>PowerShell for Developers - Functions</title>
         <link>http://feedproxy.google.com/~r/TimRayburnsBlog/~3/s479n3d-Qoc/</link>
         <description>&lt;h2&gt;Pipeline&lt;/h2&gt;

&lt;p&gt;We&amp;#8217;ve been using it already quite a bit in the past chapters, but lets take a moment and introduce, properly, the pipeline.  Pipeline&amp;#8217;ing is powered in PowerShell using the pipe operator &lt;code&gt;|&lt;/code&gt;.  It passes data from one command, to another command.  That other command had better be able to use that data.  How?  Well there is not magic here, there is conventions instead.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s take a look at the help for our friend &lt;code&gt;Get-Item&lt;/code&gt;, we do that as by typing &lt;code&gt;help Get-Item&lt;/code&gt; or in our case &lt;code&gt;help Get-Item -Parameter Path&lt;/code&gt; which is asking for the help for the Path parameter specifically:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; help get-item -Parameter Path
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;-Path &amp;lt;String[]&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;    Specifies the path to an item. Get-Item gets the item at the specified location. Wildcards are permitted. This
&lt;/span&gt;&lt;span class='line'&gt;    parameter is required, but the parameter name ("Path") is optional.
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Use a dot (.) to specify the current location. Use the wildcard character (*) to specify all the items in the
&lt;/span&gt;&lt;span class='line'&gt;    current location.
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Required?                    true
&lt;/span&gt;&lt;span class='line'&gt;    Position?                    1
&lt;/span&gt;&lt;span class='line'&gt;    Default value
&lt;/span&gt;&lt;span class='line'&gt;    Accept pipeline input?       true (ByValue, ByPropertyName)
&lt;/span&gt;&lt;span class='line'&gt;    Accept wildcard characters?  true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Did you not get this?  You likely need to install the help, run &lt;code&gt;Update-Help&lt;/code&gt; and it will do so.  If you did get this, you&amp;#8217;ll see the line that talks about &lt;code&gt;Accept Pipeline Input?&lt;/code&gt; and that it states &lt;code&gt;true&lt;/code&gt; but more importantly that we can pass either &lt;strong&gt;ByValue&lt;/strong&gt; or &lt;strong&gt;ByPropertyName&lt;/strong&gt;.  Let us explore both of those for a moment.&lt;/p&gt;

&lt;h3&gt;By Value Pipeline&amp;#8217;ing&lt;/h3&gt;

&lt;p&gt;ByValue pipelines are the easiest to understand, in this case we can see from the help above we, the value for Path is expected to a &lt;code&gt;String[]&lt;/code&gt; (a string array).&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir | %{ $_.FullName }
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;build
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;src
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;.gitignore
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;license.txt
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;make.ps1
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;NDesk.Options.dll
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;OnRamper.exe
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;push.ps1
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;README.markdown
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;setv.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So here we have taken a directory listing, which is objects as we have learned previously, and then done a &lt;code&gt;ForEach-Object&lt;/code&gt; on that to select just the FullName property.  FullName is a string, and so we are sending an array of strings out to the console currently.  How, lets send that same data to Get-Item:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir | %{ $_.FullName } | Get-Item
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013  10:44 PM            build
&lt;/span&gt;&lt;span class='line'&gt;d----          5/2/2013   8:37 PM            src
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/2/2013   2:19 PM        259 .gitignore
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/2/2013   2:19 PM      16896 license.txt
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:11 AM        211 make.ps1
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/2/2013  11:46 PM      22016 NDesk.Options.dll
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013   6:36 PM      15872 OnRamper.exe
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:16 PM         62 push.ps1
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/2/2013   2:19 PM      17183 README.markdown
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:26 AM        332 setv.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Wait &amp;#8230; uhm &amp;#8230; what?  Sure, we just took a bunch of FileSystemInfo objects and dumped them to the console, you know how that formats them?  As a directory listing of course.  But that means we&amp;#8217;ve been successful in binding that data to Get-Item.  Prove it?  Ok&amp;#8230;&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir | %{ $_.FullName } | Get-Item | %{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So we have just bound &lt;strong&gt;ByValue&lt;/strong&gt;, we&amp;#8217;ve passed an array and it went to Path because of the value it was.&lt;/p&gt;

&lt;h3&gt;By Property Name Pipeline&amp;#8217;ing&lt;/h3&gt;

&lt;p&gt;So how do we pass &lt;strong&gt;ByPropertyName&lt;/strong&gt;?  Let us continue the above example:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir | %{ @{ Path=$_.FullName} }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;build
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;src
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;.gitignore
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;license.txt
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;make.ps1
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;NDesk.Options.dll
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;OnRamper.exe
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;push.ps1
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;README.markdown
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;setv.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So here we have created a bunch of Hashtables that contain a property named Path.  Now this is to simple, it doesn&amp;#8217;t make that point that we could have other data included in these hashtables.  So I&amp;#8217;m going to add some of that, but limit the number of files:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir *.ps1 | %{ @{ Path=$_.FullName; Size=$_.Length; Updated=$_.LastWriteTime} }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;make.ps1
&lt;/span&gt;&lt;span class='line'&gt;Size                           211
&lt;/span&gt;&lt;span class='line'&gt;Updated                        5/4/2013 11:11:03 AM
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;push.ps1
&lt;/span&gt;&lt;span class='line'&gt;Size                           62
&lt;/span&gt;&lt;span class='line'&gt;Updated                        5/4/2013 12:16:29 PM
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;setv.ps1
&lt;/span&gt;&lt;span class='line'&gt;Size                           332
&lt;/span&gt;&lt;span class='line'&gt;Updated                        5/4/2013 11:26:16 AM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Ok, three entries, each with three properties, and we&amp;#8217;re good &amp;#8230; Right?  &lt;strong&gt;sigh&lt;/strong&gt; No.  So you&amp;#8217;ll see from the output, these are not properties.  They are entries in a Hashtable, and are outputted vertically under &lt;strong&gt;Name&lt;/strong&gt; and &lt;strong&gt;Value&lt;/strong&gt; because of this.  We can easily turn this into a real object with properties though, using a cast to &lt;code&gt;PSCustomObject&lt;/code&gt; which is the PowerShell &lt;code&gt;dynamic&lt;/code&gt; object.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir *.ps1 | %{ [PSCustomObject]@{ Path=$_.FullName; Size=$_.Length; Updated=$_.LastWriteTime} }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Path                                                                       Size Updated
&lt;/span&gt;&lt;span class='line'&gt;----                                                                       ---- -------
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;make.ps1                                              211 5/4/2013 11:11:03 AM
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;push.ps1                                               62 5/4/2013 12:16:29 PM
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC&amp;#92;setv.ps1                                              332 5/4/2013 11:26:16 AM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Alright, now we have the horizontal labels for our properties, and values below that.  Awesome.  Now lets pipe that to Get-Item:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir *.ps1 | %{ [PSCustomObject]@{ Path=$_.FullName; Size=$_.Length; Updated=$_.LastWriteTime} } | Get-Item
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:&amp;#92;source&amp;#92;Highway&amp;#92;MVC
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:11 AM        211 make.ps1
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:16 PM         62 push.ps1
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:26 AM        332 setv.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Bingo, we bound Path to Get-Item.  That gives you an example now of both types of Pipeline&amp;#8217;ing.&lt;/p&gt;

&lt;h2&gt;Functions&lt;/h2&gt;

&lt;p&gt;Now that we understand pipelines, how do we start to create reusable functionality?  Well, to do that we need to write functions.  And so, lets look at this in practice with everyone&amp;#8217;s favorite demo &amp;#8230; Hello World!&lt;/p&gt;

&lt;h3&gt;Basic Script Blocks&lt;/h3&gt;

&lt;p&gt;We can create a script block simply by using a set of curly braces &lt;code&gt;{ }&lt;/code&gt;.  Like so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; { "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt; "Hello World!"   &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;That output is kind of odd, right?  It didn&amp;#8217;t output the string, because that would not have the quotes.  What type of object did that return?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; { "Hello World!" }.GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     ScriptBlock                              System.Object&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Oh, so it&amp;#8217;s a script block!  Ok, is that the string representation of the block then?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; { "Hello World!" }.ToString()
&lt;/span&gt;&lt;span class='line'&gt; "Hello World!"&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Ah!  Yep, that&amp;#8217;s what happened.  So how do I run a script block?  Just stick a &lt;code&gt;.&lt;/code&gt; or &lt;code&gt;&amp;amp;&lt;/code&gt; in front of it.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; .{ "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt;Hello World!
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; &amp;amp;{ "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt;Hello World!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Yep, both of those do indeed execute, we lose the quotes, and all is well.  So we now have a code block.&lt;/p&gt;

&lt;h3&gt;Named Functions&lt;/h3&gt;

&lt;p&gt;But what if I want to name that script block?  Easy, we define a function:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW { "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Done, we&amp;#8217;ve defined that block now as HW.  How do I run it?  I type &lt;code&gt;HW&lt;/code&gt; of course!&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; HW
&lt;/span&gt;&lt;span class='line'&gt;Hello World!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now I can assign a script block simply to a variable if I want, but if I do so, then I still need to use &lt;code&gt;&amp;amp;&lt;/code&gt; or &lt;code&gt;.&lt;/code&gt; to execute it, where-as functions are called by name. See:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $hw = { "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $hw
&lt;/span&gt;&lt;span class='line'&gt; "Hello World!"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; &amp;$hw
&lt;/span&gt;&lt;span class='line'&gt;Hello World!
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; .$hw
&lt;/span&gt;&lt;span class='line'&gt;Hello World!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;But functions also have an important other aspect, which is that they can have parameters.  So let&amp;#8217;s create a function which takes a parameter, but lets say we want to pass it a location:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW {
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; param($location)
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; "Hello $location!"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; HW Dallas
&lt;/span&gt;&lt;span class='line'&gt;Hello Dallas!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now, we can specify types for parameters, so that we can&amp;#8217;t pass bad data:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW {
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  param([int]$location)
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; "Hello $location!"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; HW Dallas
&lt;/span&gt;&lt;span class='line'&gt;HW : Cannot process argument transformation on parameter 'location'. Cannot convert value "Dallas" to type
&lt;/span&gt;&lt;span class='line'&gt;"System.Int32". Error: "Input string was not in a correct format."
&lt;/span&gt;&lt;span class='line'&gt;At line:1 char:4
&lt;/span&gt;&lt;span class='line'&gt;+ HW Dallas
&lt;/span&gt;&lt;span class='line'&gt;+    ~~~~~~
&lt;/span&gt;&lt;span class='line'&gt;    + CategoryInfo          : InvalidData: (:) [HW], ParameterBindingArgumentTransformationException
&lt;/span&gt;&lt;span class='line'&gt;    + FullyQualifiedErrorId : ParameterArgumentTransformationError,HW
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; hw 123
&lt;/span&gt;&lt;span class='line'&gt;Hello 123!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;See that we got an error now when we passed the Dallas string, but when we passed 123, we succeeded.  Now we can change this pipe in an array, passing &lt;strong&gt;ByValue&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1..5 | HW
&lt;/span&gt;&lt;span class='line'&gt;Hello 0!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Huh&amp;#8230; that didn&amp;#8217;t do what we expected.  I guess we&amp;#8217;ll have to give a hint that we want that Parameter to be pipelined.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW { param( [Parameter(ValueFromPipeline=$true)][int]$location )
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; "Hello $location" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; 1..5 | HW
&lt;/span&gt;&lt;span class='line'&gt;Hello 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Ok, but still not &amp;#8220;correct&amp;#8221;.  Why?  Because as it happens, we&amp;#8217;re using the simple form of a script blocks.  A script block is &lt;strong&gt;actually&lt;/strong&gt; defined by three sections: Begin, Process, and End.  By default, if we don&amp;#8217;t specify a section, we get &lt;strong&gt;End&lt;/strong&gt;.  What are the differences?  Begin runs once, before pipleline values are bound.  Process is run once for each member of the pipeline.  End runs after all members have been process.  How do we know that we get &lt;strong&gt;End&lt;/strong&gt; by default?  Look at the value we got, it was the last value of the pipeline.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW { param( [Parameter(ValueFromPipeline=$true)][int]$location )
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  BEGIN { "Beginning : $location" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  PROCESS {"Processing : $location"}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  END {"Ending: $location"}}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; 1..5 | HW
&lt;/span&gt;&lt;span class='line'&gt;Beginning : 0
&lt;/span&gt;&lt;span class='line'&gt;Processing : 1
&lt;/span&gt;&lt;span class='line'&gt;Processing : 2
&lt;/span&gt;&lt;span class='line'&gt;Processing : 3
&lt;/span&gt;&lt;span class='line'&gt;Processing : 4
&lt;/span&gt;&lt;span class='line'&gt;Processing : 5
&lt;/span&gt;&lt;span class='line'&gt;Ending: 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So here we have redefined our function, and given it a &lt;strong&gt;Begin&lt;/strong&gt;, &lt;strong&gt;Process&lt;/strong&gt; and &lt;strong&gt;End&lt;/strong&gt; block.  And we can see that $location, &lt;strong&gt;because it is marked from pipeline&lt;/strong&gt;, is not set until we are in Process, and then we run process 5 times, and finally we run ending once.&lt;/p&gt;

&lt;h3&gt;Branching&lt;/h3&gt;

&lt;p&gt;So&amp;#8230; it is not programming without if blocks, right?  Well we&amp;#8217;ve got those:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW { param( [Parameter(ValueFromPipeline=$true)][int]$location )
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  BEGIN { "Beginning : $location" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  PROCESS { if(($location % 2) -eq 0) { "Processing : $location" } else { "Else" } }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  END {"Ending: $location"}}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; 1..5 | HW
&lt;/span&gt;&lt;span class='line'&gt;Beginning : 0
&lt;/span&gt;&lt;span class='line'&gt;Else
&lt;/span&gt;&lt;span class='line'&gt;Processing : 2
&lt;/span&gt;&lt;span class='line'&gt;Else
&lt;/span&gt;&lt;span class='line'&gt;Processing : 4
&lt;/span&gt;&lt;span class='line'&gt;Else
&lt;/span&gt;&lt;span class='line'&gt;Ending: 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h3&gt;Looping&lt;/h3&gt;

&lt;p&gt;First &amp;#8230; don&amp;#8217;t loop, pipeline.  But when you must loop, do so these ways:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function DoWhile { $i = 1; do { Write-Host $i; $i++ } while ($i -le 5) }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; DoWhile
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 




&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function WhileLoop { $i = 1; while ($i -le 5) { Write-Host $i;$i++} }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; WhileLoop
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function ForLoop { for ($i=1;$i -le 5;$i++) {Write-Host $i} }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; ForLoop
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function ForEachLoop { $ints=@(1..5); foreach ($i in $ints) {Write-Host $i} }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; ForEachLoop
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Those cover all of the major types of looping, and do so in a clean way, very similar to the C# syntax in all cases.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=s479n3d-Qoc:kxBspTw1x80:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=s479n3d-Qoc:kxBspTw1x80:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/s479n3d-Qoc" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://TimRayburn.net/blog/powershell-for-developers-functions</guid>
         <pubDate>Fri, 10 May 2013 05:24:00 +0000</pubDate>
      </item>
      <item>
         <title>PowerShell for Developers - Cmdlets</title>
         <link>http://feedproxy.google.com/~r/TimRayburnsBlog/~3/MBLuRdR9iPw/</link>
         <description>&lt;h2&gt;Cmdlets (Command-lets)&lt;/h2&gt;

&lt;p&gt;In PowerShell we have a concept called Cmdlets, these are the functions we use.  We&amp;#8217;ve already seem some of them, but this chapter will introduce you to the must-know Cmdlets.  This is not a catalog of all Cmdlets, not even close.  As of PowerShell 3.0 there are 2,430 in Windows Server 2012, without adding those available from the community.&lt;/p&gt;

&lt;p&gt;Microsoft&amp;#8217;s commitment is unfailing, they&amp;#8217;ve committed to shipping PowerShell Cmdlets for every server product.  If you use SQL Server, Exchange, BizTalk, SharePoint or any of the other server products then you simply cannot do anything more powerful to pump up your career than to learn PowerShell.&lt;/p&gt;

&lt;h3&gt;Proper Grammar&lt;/h3&gt;

&lt;p&gt;Cmdlets have a grammar all of their own.  In PowerShell we are encouraged to use a grammar of &lt;strong&gt;Verb-Noun&lt;/strong&gt; when creating Cmdlets and functions.  But more than that, there is a list of common verbs, which help new users discover your functions.  For instance, I created a function to update the value of an &lt;code&gt;AppSetting&lt;/code&gt; in a &lt;code&gt;web.config&lt;/code&gt; or &lt;code&gt;app.config&lt;/code&gt; file.  Now, I&amp;#8217;ve not memorized the whole list of verbs, so how did I know which one to use?  Well, I used the Cmdlet called &lt;code&gt;Get-Verb&lt;/code&gt; like so:&lt;/p&gt;

&lt;p&gt;Hmm&amp;#8230; I wonder if it should be called Create-AppSetting:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb C*
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Verb                                                        Group
&lt;/span&gt;&lt;span class='line'&gt;----                                                        -----
&lt;/span&gt;&lt;span class='line'&gt;Clear                                                       Common
&lt;/span&gt;&lt;span class='line'&gt;Close                                                       Common
&lt;/span&gt;&lt;span class='line'&gt;Copy                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Checkpoint                                                  Data
&lt;/span&gt;&lt;span class='line'&gt;Compare                                                     Data
&lt;/span&gt;&lt;span class='line'&gt;Compress                                                    Data
&lt;/span&gt;&lt;span class='line'&gt;Convert                                                     Data
&lt;/span&gt;&lt;span class='line'&gt;ConvertFrom                                                 Data
&lt;/span&gt;&lt;span class='line'&gt;ConvertTo                                                   Data
&lt;/span&gt;&lt;span class='line'&gt;Complete                                                    Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Confirm                                                     Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Connect                                                     Communications&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Nope, no listing for Create.  How about Set-AppSetting:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb S*
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Verb                                                        Group
&lt;/span&gt;&lt;span class='line'&gt;----                                                        -----
&lt;/span&gt;&lt;span class='line'&gt;Search                                                      Common
&lt;/span&gt;&lt;span class='line'&gt;Select                                                      Common
&lt;/span&gt;&lt;span class='line'&gt;Set                                                         Common
&lt;/span&gt;&lt;span class='line'&gt;Show                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Skip                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Split                                                       Common
&lt;/span&gt;&lt;span class='line'&gt;Step                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Switch                                                      Common
&lt;/span&gt;&lt;span class='line'&gt;Save                                                        Data
&lt;/span&gt;&lt;span class='line'&gt;Sync                                                        Data
&lt;/span&gt;&lt;span class='line'&gt;Start                                                       Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Stop                                                        Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Submit                                                      Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Suspend                                                     Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Send                                                        Communications&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Alright, yep, that could work.  But I&amp;#8217;m curious, how about Update-AppSetting?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb U*
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Verb                                                        Group
&lt;/span&gt;&lt;span class='line'&gt;----                                                        -----
&lt;/span&gt;&lt;span class='line'&gt;Undo                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Unlock                                                      Common
&lt;/span&gt;&lt;span class='line'&gt;Unpublish                                                   Data
&lt;/span&gt;&lt;span class='line'&gt;Update                                                      Data
&lt;/span&gt;&lt;span class='line'&gt;Uninstall                                                   Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Unregister                                                  Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Unblock                                                     Security
&lt;/span&gt;&lt;span class='line'&gt;Unprotect                                                   Security
&lt;/span&gt;&lt;span class='line'&gt;Use                                                         Other&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Bingo, Update-AppSetting is a good choice, so is Set-AppSetting.  I chose Set-AppSetting, but either would have been an excellent choice.&lt;/p&gt;

&lt;p&gt;Likewise, if you were to look-up Delete:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Delete
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Nope, not there.  How about Erase?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Delete
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Erase
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Nope again.  How about Remove?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Delete
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Erase
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Remove
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Verb                                                        Group
&lt;/span&gt;&lt;span class='line'&gt;----                                                        -----
&lt;/span&gt;&lt;span class='line'&gt;Remove                                                      Common&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;There it is!  So remember, use Get-Verb when deciding how to name things, it will help everyone out in the long run.&lt;/p&gt;

&lt;h3&gt;For-Each&lt;/h3&gt;

&lt;p&gt;So what is the most important Cmdlet in PowerShell?  Well, for sheer utility, I&amp;#8217;ve got to give this award to ForEach-Object.  It allows you to iterate over any array or list of data.  So how do we use it?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6 | ForEach-Object { Write-Host $_ ($_ * $_) }
&lt;/span&gt;&lt;span class='line'&gt;1 1
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;3 9
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;5 25
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Alright, we&amp;#8217;ve got one call to the script block (inside the &lt;code&gt;{ }&lt;/code&gt;) for every member of the array.  Now, you might be thinking, &amp;#8220;man that is really verbose for a scripting language&amp;#8221;, well good news that is the really long form version of that command.  Shall we terse it up a bit?&lt;/p&gt;

&lt;p&gt;First, ForEach-Object has an alias (more on those later) in simply &lt;code&gt;%&lt;/code&gt;.  So we can shorten it up like so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6 |%{ Write-Host $_ ($_ * $_) }
&lt;/span&gt;&lt;span class='line'&gt;1 1
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;3 9
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;5 25
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Pretty good, but we can get even better.  We&amp;#8217;re explicitly calling Write-Host, but whatever is returned at the end of a command is automatically printed to the host.  So we can shorten it further like so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6 |%{"$_ $($_ * $_)"}
&lt;/span&gt;&lt;span class='line'&gt;1 1
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;3 9
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;5 25
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Alright, I can hear you already, hold up Mr. Smarty Pants, you just did something tricky there.  Yep, I sure did.  How did that work?  Let me explain.  Any string in double-quotes (&lt;code&gt;" "&lt;/code&gt;) will have any variables (&lt;code&gt;$foo&lt;/code&gt;) inside of it replaced with the value of that variable.&lt;/p&gt;

&lt;p&gt;Moreover, any script block returns the last object it creates by default, so since that script block creates a string, it returns that string.  And ForEach-Object collects those objects and returns them as an Array, here to console, but it could also be piped to yet another Cmdlet or function.  But, the really attentive among you will be saying, &lt;strong&gt;&amp;#8220;Wait!  You slipped in another $.&amp;#8221;&lt;/strong&gt; Your right, but lets see it without that extra $.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6 |%{"$_ ($_ * $_)"}
&lt;/span&gt;&lt;span class='line'&gt;1 (1 * 1)
&lt;/span&gt;&lt;span class='line'&gt;2 (2 * 2)
&lt;/span&gt;&lt;span class='line'&gt;3 (3 * 3)
&lt;/span&gt;&lt;span class='line'&gt;4 (4 * 4)
&lt;/span&gt;&lt;span class='line'&gt;5 (5 * 5)
&lt;/span&gt;&lt;span class='line'&gt;6 (6 * 6)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Ah, you see, this version doesn&amp;#8217;t actually perform the multiplication.  It replaces the $_ with each value, but the rest is just considered a string.  But PowerShell has a way to evaluate expressions in the middle of strings as well, using &lt;code&gt;$( expression )&lt;/code&gt;.  So the extra $ in this &lt;code&gt;1,2,3,4,5,6 |%{"$_ $($_ * $_)"}&lt;/code&gt; version evaluates the multiplication and gives us our &amp;#8220;most terse form&amp;#8221; of this command.&lt;/p&gt;

&lt;h3&gt;Where-Object&lt;/h3&gt;

&lt;p&gt;So we&amp;#8217;ve now seen how to iterate over an array, but the other thing we usually need to do is to filter them.  In .NET, we are used to using LINQ for this, but LINQ is pretty verbose itself.  How about we cut down our list of numbers to just the even numbers using &lt;code&gt;Where-Object&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6| Where-Object { ($_ % 2) -eq 0 } |%{"$_ $($_ * $_)"}
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Outstanding, but verbose.  Well just like with &lt;code&gt;For-Each&lt;/code&gt; above, there is a much shorter alias for &lt;code&gt;Where-Object&lt;/code&gt; which is &lt;code&gt;?&lt;/code&gt;.  That shortens us up to:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{"$_ $($_ * $_)"}
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h4&gt;A little diversion&amp;#8230;&lt;/h4&gt;

&lt;p&gt;Now, we&amp;#8217;ve seen how to limit the array, but here&amp;#8217;s a little diversion.  At the current time we&amp;#8217;re returning an array of strings.  Actually, since all arrays in PowerShell are arrays of Objects (in C# &lt;code&gt;Object[]&lt;/code&gt;), this would be an array of objects consisting entirely of string objects.  Prove it?  Sure.  First the type of the array itself:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; (1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{"$_ $($_ * $_)"}).GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;And now the individual members:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{"$_ $($_ * $_)"} | %{ $_.GetType() }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     String                                   System.Object
&lt;/span&gt;&lt;span class='line'&gt;True     True     String                                   System.Object
&lt;/span&gt;&lt;span class='line'&gt;True     True     String                                   System.Object&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;But what if I wanted to have access to each of those numbers (the number itself, and the square) at the end of the command.  One way to do this would be to create a &lt;code&gt;Hashtable&lt;/code&gt; instead of a &lt;code&gt;String&lt;/code&gt; like so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{@{Num=$_;Square=$_ * $_}}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;Num                            2
&lt;/span&gt;&lt;span class='line'&gt;Square                         4
&lt;/span&gt;&lt;span class='line'&gt;Num                            4
&lt;/span&gt;&lt;span class='line'&gt;Square                         16
&lt;/span&gt;&lt;span class='line'&gt;Num                            6
&lt;/span&gt;&lt;span class='line'&gt;Square                         36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Let&amp;#8217;s check the types:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{@{Num=$_;Square=$_ * $_}} | %{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Hashtable                                System.Object
&lt;/span&gt;&lt;span class='line'&gt;True     True     Hashtable                                System.Object
&lt;/span&gt;&lt;span class='line'&gt;True     True     Hashtable                                System.Object&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Yep, Hashtables.&lt;/p&gt;

&lt;p&gt;But sometimes have to name variable when you don&amp;#8217;t intend to use those names is a bit annoying a verbose.  So instead, we can create an array by simply using the &lt;code&gt;,@( )&lt;/code&gt; array constructor syntax:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a = 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{,@($_,($_ * $_))}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $a
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;16
&lt;/span&gt;&lt;span class='line'&gt;6
&lt;/span&gt;&lt;span class='line'&gt;36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Uhm, output looks a little wierd.  Lets take a look at the type of &lt;code&gt;$a&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a.GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Ok, an array. And it&amp;#8217;s members?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a | %{ $_.GetType() }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Alright, more arrays!  And inside the first one of those?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a[0] | %{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Boom, &lt;code&gt;Int32&lt;/code&gt;s for the win.  Instant multi-dimensional array.  This is powerful, it is a terse syntax which is similar to Tuples in other languages.  Because they are &lt;code&gt;Object[]&lt;/code&gt; arrays, the types don&amp;#8217;t have to match.  Oh yeah, did I mention there is a short form for creating arrays of concurrent integers?  Ohm, my bad. For instance:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a = 1..6|?{ ($_ % 2) -eq 0 } |%{,@($_,($_ * $_),"Smile")}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $a.GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $a | %{ $_.GetType() }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $a[0] | %{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType
&lt;/span&gt;&lt;span class='line'&gt;True     True     String                                   System.Object&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h3&gt;Get-ChildItem&lt;/h3&gt;

&lt;p&gt;The last Cmdlet I want to introduce in this chapter is the one most people use without even knowing that they&amp;#8217;re doing so.  If you&amp;#8217;ve every opened a PowerShell command prompt, you&amp;#8217;ve likely done something like:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:&amp;#92;Source&amp;#92;Highway
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/2/2013   2:20 PM            Data
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013  10:44 PM            MVC
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:37 PM            Onramper
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:46 PM            Services
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:59 AM       1062 dest
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:11 PM        385 distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Or perhaps if you&amp;#8217;re from the &lt;code&gt;bash&lt;/code&gt; or other &lt;code&gt;sh&lt;/code&gt; descendant family of shell users:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:&amp;#92;Source&amp;#92;Highway
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/2/2013   2:20 PM            Data
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013  10:44 PM            MVC
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:37 PM            Onramper
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:46 PM            Services
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:59 AM       1062 dest
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:11 PM        385 distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now, in reality you&amp;#8217;re using a Cmdlet called Get-ChildItem.  Prove it?  Sure:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-ChildItem
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:&amp;#92;Source&amp;#92;Highway
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/2/2013   2:20 PM            Data
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013  10:44 PM            MVC
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:37 PM            Onramper
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:46 PM            Services
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:59 AM       1062 dest
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:11 PM        385 distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now this Cmdlet has so much power it almost deserves a chapter to itself.  Let&amp;#8217;s review just a few things that can&amp;#8217;t be skipped over.  First, this Cmdlet returns an array of &lt;code&gt;FileSystemInfo&lt;/code&gt; objects.  Of course that&amp;#8217;s easy to prove:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls |%{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;That means we have access to all sorts of data about those directory items by pipeing that command along.  For instance, what if I wanted the full path and filename?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls |%{$_.FullName}
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway&amp;#92;Data
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway&amp;#92;MVC
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway&amp;#92;Onramper
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway&amp;#92;Services
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway&amp;#92;dest
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway&amp;#92;distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;And if I wanted to get just the files?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File |%{$_.FullName}
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway&amp;#92;dest
&lt;/span&gt;&lt;span class='line'&gt;C:&amp;#92;Source&amp;#92;Highway&amp;#92;distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;And if I wanted their sizes instead?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File |%{$_.Length}
&lt;/span&gt;&lt;span class='line'&gt;1062
&lt;/span&gt;&lt;span class='line'&gt;385&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h4&gt;Another bonus section? Oh, ok&amp;#8230;&lt;/h4&gt;

&lt;p&gt;We can restrict the types of files to a pattern like so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File *.ps1 |%{$_.Length}
&lt;/span&gt;&lt;span class='line'&gt;385&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;What if I wanted that same thing, recursively, through every subdirectory of my current location?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File *.ps1 -Recurse|%{$_.Length}
&lt;/span&gt;&lt;span class='line'&gt;10275
&lt;/span&gt;&lt;span class='line'&gt;10424
&lt;/span&gt;&lt;span class='line'&gt;4001
&lt;/span&gt;&lt;span class='line'&gt;1332
&lt;/span&gt;&lt;span class='line'&gt;1546
&lt;/span&gt;&lt;span class='line'&gt;2987
&lt;/span&gt;&lt;span class='line'&gt;332
&lt;/span&gt;&lt;span class='line'&gt;188
&lt;/span&gt;&lt;span class='line'&gt;2997
&lt;/span&gt;&lt;span class='line'&gt;344
&lt;/span&gt;&lt;span class='line'&gt;194
&lt;/span&gt;&lt;span class='line'&gt;211
&lt;/span&gt;&lt;span class='line'&gt;62
&lt;/span&gt;&lt;span class='line'&gt;332
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;247
&lt;/span&gt;&lt;span class='line'&gt;243
&lt;/span&gt;&lt;span class='line'&gt;368
&lt;/span&gt;&lt;span class='line'&gt;247
&lt;/span&gt;&lt;span class='line'&gt;243
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;880
&lt;/span&gt;&lt;span class='line'&gt;265
&lt;/span&gt;&lt;span class='line'&gt;265
&lt;/span&gt;&lt;span class='line'&gt;217
&lt;/span&gt;&lt;span class='line'&gt;62
&lt;/span&gt;&lt;span class='line'&gt;332
&lt;/span&gt;&lt;span class='line'&gt;385&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;And &amp;#8230; if I wanted all those summed up?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File *.ps1 -Recurse|%{$_.Length}|Measure-Object -Sum
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Count    : 34
&lt;/span&gt;&lt;span class='line'&gt;Average  :
&lt;/span&gt;&lt;span class='line'&gt;Sum      : 38979
&lt;/span&gt;&lt;span class='line'&gt;Maximum  :
&lt;/span&gt;&lt;span class='line'&gt;Minimum  :
&lt;/span&gt;&lt;span class='line'&gt;Property :&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h3&gt;Aliases&lt;/h3&gt;

&lt;blockquote&gt;&lt;p&gt;There are a finite number of keystrokes left in your hands before you die. &amp;#8211; &lt;a rel="nofollow" target="_blank" href="http://www.hanselman.com/blog/DoTheyDeserveTheGiftOfYourKeystrokes.aspx"&gt;Scott Hanselman&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;So, you&amp;#8217;ve likely picked up by now that I&amp;#8217;m a fan of terse commands.  Terse commands allow you to move faster, which to me is a huge part of why I&amp;#8217;m investing in PowerShell.  There is an ability in PowerShell to create shorter versions of Cmdlets, as you&amp;#8217;ve seen already in this article, called Aliases.  There are alot of aliases already defined.  How many?  So many I can&amp;#8217;t just do a screen shot of them, but I can count them:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; alias | Measure-Object
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Count    : 150
&lt;/span&gt;&lt;span class='line'&gt;Average  :
&lt;/span&gt;&lt;span class='line'&gt;Sum      :
&lt;/span&gt;&lt;span class='line'&gt;Maximum  :
&lt;/span&gt;&lt;span class='line'&gt;Minimum  :
&lt;/span&gt;&lt;span class='line'&gt;Property :&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;150 aliases already defined for you.  If you want to see what command is behind something like &lt;code&gt;dir&lt;/code&gt; you can simply:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; alias dir
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           dir -&amp;gt; Get-ChildItem&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As you can see, &lt;code&gt;dir&lt;/code&gt; is &lt;code&gt;Get-ChildItem&lt;/code&gt;.  What if I wanted to see all aliases for a given Cmdlet?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; alias -Definition Get-ChildItem
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           dir -&amp;gt; Get-ChildItem
&lt;/span&gt;&lt;span class='line'&gt;Alias           gci -&amp;gt; Get-ChildItem
&lt;/span&gt;&lt;span class='line'&gt;Alias           ls -&amp;gt; Get-ChildItem&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now, aliases are something you can expand on!  You can make it super easy to open text files by aliases &lt;code&gt;notepad.exe&lt;/code&gt; as so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; New-Alias n C:&amp;#92;Windows&amp;#92;system32&amp;#92;notepad.exe
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; n .&amp;#92;distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;That opens Notepad, with the &lt;code&gt;distribute.ps1&lt;/code&gt; file already opened for editing.  I keep aliases around for a lot of things.  For my text editor, my text comparison tool, and so much more.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=MBLuRdR9iPw:49RU0ZKasng:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=MBLuRdR9iPw:49RU0ZKasng:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/MBLuRdR9iPw" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://TimRayburn.net/blog/powershell-for-developers-cmdlets</guid>
         <pubDate>Thu, 09 May 2013 03:38:00 +0000</pubDate>
      </item>
      <item>
         <title>PowerShell for Developers - Intro</title>
         <link>http://feedproxy.google.com/~r/TimRayburnsBlog/~3/iYC2CYszPFc/</link>
         <description>&lt;blockquote&gt;&lt;p&gt;I must go down to the seas again, to the lonely sea and the sky,
 And all I ask is a tall ship and a star to steer her by,
 And the wheel&amp;#8217;s kick and the wind&amp;#8217;s song and the white sail&amp;#8217;s shaking,
 And a gray mist on the sea&amp;#8217;s face, and a gray dawn breaking.
 &amp;#8211; Sea Fever by John Masefield&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Every developer knows that in order to be successful at their chosen profession, they need to keep the best tools at their disposal.  We all have our favorite text editors, and our favorite comparison tools, and the wise among us also have our favorite scripting languages and command line environments.&lt;/p&gt;

&lt;p&gt;I am an unabashed fan of GIT, and as such for several years now I&amp;#8217;ve used the &lt;code&gt;bash&lt;/code&gt; shell as my command line environment of choice.  But I recently started paying more attention to &lt;code&gt;PowerShell&lt;/code&gt; and I realized that I had not at all given it it&amp;#8217;s due when I first learned about it several years ago.  I&amp;#8217;ve spoken recently with @DevlinLiles, @AmirRajan, @CoriDrew, and @BForrest about this, and I realized that I wasn&amp;#8217;t alone at all in this.  Most developers working in .NET languages have mostly ignored PowerShell.  I intend this series of blog posts to correct this issue.&lt;/p&gt;

&lt;h2&gt;The Basics&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt; Let&amp;#8217;s start at the very beginning
 A very good place to start
 When you read you begin with A-B-C
 When you sing you begin with do-re-mi
 &amp;#8211; &amp;#8220;Do-Re-Mi&amp;#8221; by Rodgers &amp;amp; Hammerstein&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3&gt;PowerShell 3.0&lt;/h3&gt;

&lt;p&gt;So how do I use the &lt;code&gt;PowerShell&lt;/code&gt; thing, Tim?  Easy.  First, we need to know what version of Windows you&amp;#8217;re using now, because we might want to upgrade you to the latest version.  If you&amp;#8217;re using &lt;strong&gt;Windows 8&lt;/strong&gt; or &lt;strong&gt;Windows Server 2012&lt;/strong&gt; then you&amp;#8217;re good, you already have PowerShell 3.0.  If you&amp;#8217;re using &lt;strong&gt;Windows 7&lt;/strong&gt; or &lt;strong&gt;Windows Server 2008&lt;/strong&gt; or &lt;strong&gt;Windows Server 2008 R2&lt;/strong&gt;, then you need to download the &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/en-us/download/details.aspx?id=34595"&gt;Windows Management Pack 3.0&lt;/a&gt; which upgrades you to PowerShell 3.0.&lt;/p&gt;

&lt;p&gt;Not sure if someone else might have already installed it?  Just open PowerShell (hint: Win+R -&amp;gt; &lt;code&gt;PowerShell&lt;/code&gt; &lt;strong&gt;enter&lt;/strong&gt;) and enter &lt;code&gt;$host.version&lt;/code&gt; at the prompt.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $host.version
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Major  Minor  Build  Revision
&lt;/span&gt;&lt;span class='line'&gt;-----  -----  -----  --------
&lt;/span&gt;&lt;span class='line'&gt;3      0      -1     -1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;The above it what we&amp;#8217;re looking for, anything else, and you need to install the &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/en-us/download/details.aspx?id=34595"&gt;Windows Management Pack 3.0&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Variables&lt;/h3&gt;

&lt;p&gt;The first thing you need to know about PowerShell is how to create a variable.  This is very simple, you just assign it to a variable name.  In PowerShell, all variables are preceded by a &lt;code&gt;$&lt;/code&gt;.  So if you want to create a variable X and assign the integer value 1 to it, you would type:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $X = 1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Important to know, especially for C# developers, is that PowerShell is &lt;strong&gt;case-insensitive&lt;/strong&gt;.  As such, &lt;code&gt;$X&lt;/code&gt; is the same as &lt;code&gt;$x&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;Value Types&lt;/h4&gt;

&lt;p&gt;Now, .NET developers, pay attention to this.  In PowerShell all variables are actual objects, not just string values.  What do I mean?  Type this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $X.GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;&lt;strong&gt;Holy smoke!&lt;/strong&gt; That variable is an &lt;code&gt;Int32&lt;/code&gt;, I mean a real &lt;code&gt;System.Int32&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Because of this, we can use any type of methods that might exist on those objects.  For instance, we could type:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $X.Equals(4)
&lt;/span&gt;&lt;span class='line'&gt;False&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So how do we create non-value types then?  That depends&amp;#8230;&lt;/p&gt;

&lt;h4&gt;Reference Types via New-Object&lt;/h4&gt;

&lt;p&gt;Most of the time, we are used to creating .NET objects by typing something like &lt;code&gt;var dt = new System.DateTime()&lt;/code&gt; but in PowerShell we have something similar, but different:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $dt = New-Object System.DateTime&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;You can always check the value of a variable, just by typing it&amp;#8217;s name at the prompt like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $dt
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Monday, January 1, 0001 12:00:00 AM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;That makes total sense, that is the default value of a DateTime aka &lt;code&gt;default(DateTime)&lt;/code&gt; in C#.  But in reality, I tend to use &lt;code&gt;System.DateTime.Now&lt;/code&gt; to get the system time, more often than I do &lt;code&gt;new DateTime()&lt;/code&gt;, so how to I do that in PowerShell?&lt;/p&gt;

&lt;h4&gt;Reference Types via Static Properties &amp;amp; Methods&lt;/h4&gt;

&lt;p&gt;So if we want to access the .NET Framework&amp;#8217;s static types, we simply need to reference the type, and then the method, as follows:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; [System.DateTime]::Now
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Monday, May 6, 2013 10:22:26 PM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now, if we wanted to assign that to our variable, we would just do:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $dt = [System.DateTime]::Now&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Please note, when we assign the value to a variable, we no longer get output to the console.  We&amp;#8217;ll see how to change that in just a bit.&lt;/p&gt;

&lt;h3&gt;Arrays&lt;/h3&gt;

&lt;p&gt;Arrays are common in all programming languages, they represent a series of values.  In PowerShell, those values are not required to be of the same type, you can think of all Arrays in .NET terms as &lt;code&gt;System.Object[]&lt;/code&gt;, an array of Objects.&lt;/p&gt;

&lt;p&gt;Declaring and using arrays could not possibly be easier in PowerShell, we simply put together a series of values, separated by commas.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As I noted above, they don&amp;#8217;t have to be of the same type:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,"abc",[System.DateTime]::Now
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;abc
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Monday, May 6, 2013 10:28:15 PM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;And that is all there is to arrays.  You can add members to arrays many ways, but the simplest is as follows:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $arr = 1,2,3
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $arr
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $arr = $arr + 4,5,6
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $arr
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5
&lt;/span&gt;&lt;span class='line'&gt;6&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h3&gt;Hashtable&lt;/h3&gt;

&lt;p&gt;There is one other type of object which is critical to the world of PowerShell, and that is the Hashtable.  PowerShell is a dynamic language, in fact as of 3.0 it&amp;#8217;s even built on top of the Dynamic Language Runtime, but as such it needs a flexible structure for storing loosely types objects.  Enter the Hashtable.&lt;/p&gt;

&lt;p&gt;The syntax for Hashtable couldn&amp;#8217;t possibly be easier, to create one you just use &lt;code&gt;@{ key=value; key2=value2}&lt;/code&gt; So for instance, if you want to create a Hashtable to store a bunch of people, you could do so like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $tim = @{ FirstName="Tim";LastName="Rayburn"}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $cori = @{ FirstName="Cori";LastName="Drew"}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $barry = @{ FirstName="Barry";LastName="Forrest"}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now, as we learned in the last section, we can create an array just by separating items by commas, so lets do so, and then sort these people by FirstName:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $tim,$cori,$barry | Sort-Object FirstName
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;LastName                       Forrest
&lt;/span&gt;&lt;span class='line'&gt;FirstName                      Barry
&lt;/span&gt;&lt;span class='line'&gt;LastName                       Drew
&lt;/span&gt;&lt;span class='line'&gt;FirstName                      Cori
&lt;/span&gt;&lt;span class='line'&gt;LastName                       Rayburn
&lt;/span&gt;&lt;span class='line'&gt;FirstName                      Tim&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As you can see, Barry is now listed first, then Cori, then Tim.  Don&amp;#8217;t worry about understanding Sort-Object just yet, we&amp;#8217;ll get into how that line works more in the next post.&lt;/p&gt;

&lt;p&gt;Now, lets imagine I want to add a value for Employer to each of these.  How to I change a Hashtable once it has been created?  Easy, just refer to a property that doesn&amp;#8217;t exist yet, and set its value.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $tim.Employer = "Improving Enterprises"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $barry.Employer = "Improving Enterprises"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $cori.Employer = "Improving Enterprises (Contractor until August)"&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h3&gt;Constants&lt;/h3&gt;

&lt;p&gt;In addition to all of the above, there are a couple of constants which you might want to know about when developing.  &lt;code&gt;$null&lt;/code&gt; is the constant value of a Null Reference.  In addition there are constants for &lt;code&gt;$true&lt;/code&gt; and &lt;code&gt;$false&lt;/code&gt; though if a boolean is expected you can also always use &lt;code&gt;1&lt;/code&gt; or &lt;code&gt;0&lt;/code&gt; respectively.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=iYC2CYszPFc:TfoSRx79710:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=iYC2CYszPFc:TfoSRx79710:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/iYC2CYszPFc" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://TimRayburn.net/blog/powershell-for-developers-intro</guid>
         <pubDate>Tue, 07 May 2013 18:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Getting the confusing SharePoint 2013 SocialDataStoreException</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/-HFL_bKU05U/</link>
         <description>&lt;p&gt;As I was writing an app using the new SharePoint 2013 app model the other day, I ran into an issue when I was trying to follow a site automatically through JavaScript:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;The target of the operation was not found. Internal type name: Microsoft.Office.Server.UserProfiles.SocialDataStoreException. Internal error code: 0.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 







&lt;p&gt;The problem seemed fairly straight-forward. The targeted site I wanted to follow couldn&amp;#8217;t be found. However, it didn&amp;#8217;t make sense. The instance URL I was targeting (https://chrisweldon.sharepoint.com) did in fact exist. Furthermore, I was not already following that site. So, why was this failing?&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s take a look at some code:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='line'&gt;&lt;span class="nx"&gt;SP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SOD&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;executeOrDelayUntilScriptLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userProfilesLoaded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;SP.UserProfiles.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;userProfilesLoaded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nx"&gt;SP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SOD&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;executeFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;userprofile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;SP.Social.SocialFollowingManager&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;followSites&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;followSites&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ClientContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get_current&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;socialManager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Social&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SocialFollowingManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;socialSite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Social&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SocialActorInfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nx"&gt;socialSite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;set_contentUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://chrisweldon.sharepoint.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nx"&gt;socialSite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;set_actorType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Social&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SocialActorType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;site&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nx"&gt;socialManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;follow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;socialSite&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;executeQueryAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Sites followed!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Error: &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get_message&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;This is fairly straight-forward. I simply setup a social actor to follow and call out to the &lt;code&gt;SocialFollowingManager&lt;/code&gt; to attempt to follow that site. This is when I thought, perhaps this is a permissions problem? I&amp;#8217;m trying to have the JavaScript object model &lt;em&gt;write&lt;/em&gt; a request to the Social datastore. Perhaps it wasn&amp;#8217;t authorized.&lt;/p&gt;

&lt;p&gt;I changed the permissions in my &lt;code&gt;AppManifest.xml&lt;/code&gt; from &lt;strong&gt;Read&lt;/strong&gt; to &lt;strong&gt;Write&lt;/strong&gt;:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt; Scope                  &lt;/th&gt;
&lt;th&gt; Permission &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt; User Profiles (Social) &lt;/td&gt;
&lt;td&gt; Write&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Sadly, I received the same error message. However, if you read the &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/jj163864.aspx"&gt;MSDN Documentation on Developing Social Features in SharePoint 2013&lt;/a&gt;, there is a section in there talking about user profiles:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;User Profiles (http://sharepoint/social/tenant) The permission request scope used to access all user profiles. Only the profile picture can be changed; all other user profile properties are read-only for apps for SharePoint. Apps that request rights for the User Profiles scope must be installed by a tenant administrator.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;In a nutshell, I have to grant &lt;strong&gt;Tenant&lt;/strong&gt; permissions to my app to be able to have my user follow a new site. Therefore, my new permissions look like the following:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt; Scope                  &lt;/th&gt;
&lt;th&gt; Permission &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt; User Profiles (Social) &lt;/td&gt;
&lt;td&gt; Read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt; Tenant                 &lt;/td&gt;
&lt;td&gt; Write&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;As indicated by the paragraph above, the app now needs to be installed by a tenant administrator. However, in doing so, the app now follows sites (and other content) with ease. Why the obscure error message? That I don&amp;#8217;t know, and I hope the SharePoint team might look to address this with a more &lt;em&gt;correct&lt;/em&gt; error message in the near future.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/05/06/getting-the-confusing-sharepoint-2013-socialdatastoreexception/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/-HFL_bKU05U" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/05/06/getting-the-confusing-sharepoint-2013-socialdatastoreexception</guid>
         <pubDate>Mon, 06 May 2013 16:34:00 +0000</pubDate>
      </item>
      <item>
         <title>Steps towards that new job</title>
         <link>http://brandonbarber.net/archives/383</link>
         <description>Where do I start? I get asked this question quite a bit and there are some obvious answers and not so obvious answers you need to consider. Sometimes people get a little confused with the new world of technology and social media in their job search. Social media is important to getting to where you [...]</description>
         <author>Brandon</author>
         <guid isPermaLink="false">http://brandonbarber.net/?p=383</guid>
         <pubDate>Sun, 05 May 2013 16:14:45 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong>Where do I start? </strong><br />
I get asked this question quite a bit and there are some obvious answers and not so obvious answers you need to consider. Sometimes people get a little confused with the new world of technology and social media in their job search. Social media is important to getting to where you want to land. It is important to brand yourself and take the right steps to get to where you want to be.</p>
<p>1. Ask yourself the question: <strong>do I enjoy large or small companies?</strong> There are pros and cons to both and you need to figure out what is best for you. This is important in that you want to determine if you want to be part of an organization that does things on a large scale and you may have to deal with more politics. In a small organization, decisions might be made quicker but you also might have more responsibility.  In terms of programming, this might include gathering requirements, testing/QA, maintenance along with new development. </p>
<p>2. <strong>What kind of stability is important?</strong> Does the company have a good track record? Any layoffs in the past 5 years? These days some organizations will cut workforce without hardly any notice, perhaps a week and sometimes none at all.</p>
<p>3. <strong>Determine what else is really important to you? </strong>(salary, commute, stability, benefits?) There is a lot to consider when considering a new position. Work on large or small teams? Individual or team contributor? </p>
<p>4. <strong>The obvious: Are you networking?</strong> Are you staying on top of your competition? It is very important to stay in touch with your old co-workers. Where are they working, do they like where they work &#8211; do they have any openings? Stay on top of user groups or meetups in your field. There are also a lot of job search outreach programs everywhere, especially in the DFW area. Nowadays, there are plenty of opportunities to connect with peers and learn from them. If you are an expert in a certain area, consider blogging or speaking at local or national conferences to help others.</p>
<p>5. <strong>Personal Branding/Social Media</strong>: Do you have a blog or website? It is very important to brand yourself in several areas. Have you kept up with your LinkedIn account and is it up to date with skills, awards, recommendations? Do you have an <a rel="nofollow" target="_blank" href="https://about.me/" title="About Me">Aboutme</a> page? This is a free service that you can use to brand yourself and list places you can be found on the internet. If you do have a website, make sure you list your resume and any relevant information on your projects. Twitter is great to follow those in your field and find out what they are up to (Latest trends).</p>
<p>6. <strong>Update that resume</strong> &#8211; make sure you have your skills numerous places on the resume. Recruiters and Applicant tracking systems use tag words and key words to find you. Without the keywords and skills, you are not going to be found among the numerous applicants. Take out the header with your name/address and put it in the main section of Microsoft Word. Make sure to use Microsoft Word rather than PDF. PDF looks nice but it sometimes doesn&#8217;t get parsed in the applicant systems.</p>
<p>7. <strong>Keep track</strong> of the places you have applied or have interest in applying. This is very important! Make a spreadsheet on Google Docs or Excel with the apply date, name of company, title of position, and the recruiter you talked to if that occurs.</p>
<p>8. <strong>Follow up after you interview</strong>. Send a thank you email to the recruiter and the hiring manager. Make it brief and to the point mentioning the skills you can bring to the position. Persistence is key if you feel like you are a match for a certain position but try not to be a pest, that can be a turnoff. See if you know anyone on LinkedIn that is connected to the company of interest. As many people refer to a black hole when applying, unfortunately the internal recruiting staff usually has bad systems or are too busy to even get to the applicants. The managers are very busy behind the scenes. It&#8217;s a catch 22, they really need to fill the position but are sometimes too busy traveling or in meetings all day to make time to interview.</p>
<p>9. <strong>Landing:</strong> make sure you do your due diligence on the company. That might include Glasdoor.com, or finding people you know that work at the company. Are they listed on any Best Places to Work lists? What are the pros and cons? How is the industry itself doing? &#8211; are they stable, upward trending? good revenues? Make sure the benefits are in line with your needs (vacation, medical, 401K, work from home?, etc). Agree on a start date and you are ready to go!</p>
<p>Best of luck in your search!</p>]]></content:encoded>
      </item>
      <item>
         <title>The Penny Game</title>
         <link>http://tastycupcakes.org/2013/05/the-penny-game/</link>
         <description>This is a theory of constraints based game that I am in no way attempting to claim credit for. I just wanted a link where I could point people to Timing: 20-30 minutes Materials: A minimum of 10 people A bag of 20 small coins A flipchart to record the scores Instructions: 4 people are [...]</description>
         <author>Geoff Watts</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2879</guid>
         <pubDate>Sat, 04 May 2013 13:32:17 +0000</pubDate>
         <content:encoded><![CDATA[<p>This is a theory of constraints based game that I am in no way attempting to claim credit for. I just wanted a link where I could point people to</p>
<p><span style="text-decoration:underline;">Timing:</span></p>
<p>20-30 minutes</p>
<p><span style="text-decoration:underline;">Materials:</span></p>
<ul>
<li>A minimum of 10 people</li>
<li>A bag of 20 small coins</li>
<li>A flipchart to record the scores</li>
</ul>
<p><span style="text-decoration:underline;">Instructions:</span></p>
<p>4 people are to be workers, seated at a table</p>
<p>Each &#8220;worker&#8221; will have a &#8220;manager&#8221; stood behind them with a timing device (stopwatch or smart phone)</p>
<p>Two extra non-workers will also be stood around the table with timing devices</p>
<p>Give the 20 coins to the first &#8220;worker&#8221; and instruct everyone that the objective of this game is to process the 20 coins through the system of workers.</p>
<p>To be processed, coins must be flipped &#8211; one at a time and with your left hand only &#8211; and then passed to the next worker in the chain who will do the same. Once the coins have been processed by all four workers, they are considered &#8220;done&#8221;</p>
<p>Workers may only pass the coins once the full batch of coins is complete.</p>
<p>The managers of each worker will time how long it takes for their worker to process the 20 coins</p>
<p>One non-worker will also be timing how long it takes for the first coin to be processed completely</p>
<p>One non-worker will also be timing how long it takes for the 20 coins to be processed completely</p>
<p>Round One:</p>
<p>Workers operate in batches of 20 i.e. they may only pass coins to the next worker once they have flipped all 20 coins</p>
<p>Round Two:</p>
<p>Workers operate in batches of 10 i.e. they may pass a batch of 10 coins to the next worker once they have flipped 10 coins</p>
<p>Round Three:</p>
<p>Workers operate in batches of 5 i.e. they may pass a batch of 5 coins to the next worker once they have flipped 5 coins</p>
<p>Round Four:</p>
<p>Workers operate in batches of 1 i.e. they may pass each coin to the next worker once they have flipped it</p>
<p>&nbsp;</p>
<p>In each, round, the facilitator will capture the time for each worker, the time for the first coin and the time for all 20 coins to be processed.</p>
<p>At the end of round 4, the facilitator will lead the group through the analysis of the timings.</p>
<p>Individual timings will typically increase while the time to get coins process goes down which gives the impression of each worker becoming less efficient (especially those at the end of the process) while the process itself becomes more efficient. Discussions around bottlenecks, cross-functionality etc will typically be instigated.<br />
<span style="text-decoration:underline;">Variations:</span></p>
<p>Try throwing in a different sized coin in to the process to see how teams cope with variations</p>
<p>Try tracking how long it takes for an &#8220;urgent request&#8221; to get through the various batch-sized systems</p>]]></content:encoded>
      </item>
      <item>
         <title>MigrateUsersToClaims - Operation is not valid due to the current state of the object</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/6bQMN2RLqvg/</link>
         <description>&lt;p&gt;I&amp;#8217;m in the process of migrating my customer from SharePoint 2010 to SharePoint 2013. In their SharePoint 2010 environment, they were still using classic-mode authentication, but are switching to claims-based authentication in SharePoint 2013.&lt;/p&gt;

&lt;p&gt;The recommended path to upgrade from 2010 to 2013 is a content and service-application database migration. This works great for us since we &lt;strong&gt;have&lt;/strong&gt; to do this piecemeal. However, many of the general approaches for converting to claims-based authentication is to do so at the web-application level, rather than the content-database level (source: &lt;a rel="nofollow" target="_blank" href="http://technet.microsoft.com/en-us/library/gg251985.aspx"&gt;TechNet&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;In SharePoint 2013, there&amp;#8217;s actually an &lt;code&gt;SPWebApplication&lt;/code&gt; method dubbed &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/jj172686.aspx"&gt;&lt;code&gt;MigrateUsersToClaims&lt;/code&gt;&lt;/a&gt; that takes 3 arguments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NTAccount&lt;/li&gt;
&lt;li&gt;removePermissionsAfter&lt;/li&gt;
&lt;li&gt;SPWebApplication.SPMigrateUserParameters&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There was no guidance on the NTAccount, other than the user &amp;#8220;performing&amp;#8221; the operation. I opted to use the farm account to ensure it had the appropriate level of permissions. The true power of the content database migration comes in with the third parameter. We can add individual content databases to migrate with this parameter rather than worrying about the &lt;em&gt;entire&lt;/em&gt; web application.&lt;/p&gt;

&lt;p&gt;Props go to &lt;a rel="nofollow" target="_blank" href="http://blogs.technet.com/b/speschka/archive/2012/07/23/converting-a-classic-auth-content-database-to-claims-auth-in-sharepoint-2013.aspx"&gt;Steve Peschka&lt;/a&gt; who originally pointed this out. However, in his post, the PowerShell to do this upgrade was the following:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;-- SNIP -- 
&lt;/span&gt;&lt;span class='line'&gt;$wa.MigrateUsersToClaims($acc, $true, $arguments)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;For me, that throws the error &lt;code&gt;Exception calling "MigrateUsersToClaims" with "3" argument(s): "Operation is not valid due to the current state of the object."&lt;/code&gt; This was strange, and I couldn&amp;#8217;t figure it out. So, I cracked open the &lt;code&gt;Microsoft.SharePoint.Administration&lt;/code&gt; dll and took a look at the &lt;code&gt;MigrateUsersToClaims&lt;/code&gt; method:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;MigrateUsersToClaims&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NTAccount&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;removePermissionsAfter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SPWebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SPMigrateUserParameters&lt;/span&gt; &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;NTAccount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentNullException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;account&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;removePermissionsAfter&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;parameters&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasDatabaseToMigrate&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnlyMigratePolicyUsers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InvalidOperationException&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c1"&gt;// The rest&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;That second one was the one that I questioned. I know the conditions matched for the first two checks. The question was how my parameters looked. Sure enough:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;PS &amp;gt; $arguments
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;DatabasesToMigrate      HasDatabaseToMigrate        OnlyMigratePolicyUsers
&lt;/span&gt;&lt;span class='line'&gt;------------------      --------------------        ----------------------
&lt;/span&gt;&lt;span class='line'&gt;{WSS_MigrationTest_...}                 True                         False&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;With that, if I changed the middle parameter from &lt;code&gt;$true&lt;/code&gt; to &lt;code&gt;$false&lt;/code&gt;, the migration finally ran (and completed) succesfully.&lt;/p&gt;

&lt;p&gt;Why did this happen? This was because my &lt;code&gt;$acc&lt;/code&gt; user is my &lt;strong&gt;farm account&lt;/strong&gt;. I&amp;#8217;m also running my PowerShell session as my &lt;strong&gt;farm account&lt;/strong&gt;. This is to ensure that I have full, unfettered access to the SharePoint Object Model and the Content Database. The middle parameter states (from &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/jj172686.aspx"&gt;MSDN&lt;/a&gt;):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The **account** will be given the correct permissions to perform the operation. Should this permission be removed when the operation is complete.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;We definitely don&amp;#8217;t want this for the farm account. So, my updated code, for reference:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;$wa = Get-SPWebApplication http://my-app-url
&lt;/span&gt;&lt;span class='line'&gt;$acc = "domain&amp;#92;farm-account"
&lt;/span&gt;&lt;span class='line'&gt;$arguments = New-Object Microsoft.SharePoint.Administration.SPWebApplication+SPMigrateUserParameters
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;$contentDb = $wa.ContentDatabase["Content Database Name"]
&lt;/span&gt;&lt;span class='line'&gt;$arguments.AddDatabaseToMigrate($contentDb)
&lt;/span&gt;&lt;span class='line'&gt;$wa.MigrateUsersToClaims($acc, $false, $arguments)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Cheers. Once again, thanks go to &lt;a rel="nofollow" target="_blank" href="http://blogs.technet.com/b/speschka/archive/2012/07/23/converting-a-classic-auth-content-database-to-claims-auth-in-sharepoint-2013.aspx"&gt;Steve Peschka&lt;/a&gt; for figuring this out.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/04/30/migrateuserstoclaims-operation-is-not-valid-due-to-the-current-state-of-the-object/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/6bQMN2RLqvg" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/04/30/migrateuserstoclaims-operation-is-not-valid-due-to-the-current-state-of-the-object</guid>
         <pubDate>Tue, 30 Apr 2013 16:50:00 +0000</pubDate>
      </item>
      <item>
         <title>Sorry, only tenant administrators can add or give access to this app</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/Cma0mMxuihA/</link>
         <description>&lt;p&gt;I have just completed building my first SharePoint 2013 application. I came across the error message &lt;code&gt;Sorry, only tenant administrators can add or give access to this app.&lt;/code&gt; when trying to deploy the application to my site. This happened regardless if I was deploying using a SharePoint development site or after installing the solution in the app catalog.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2013-04-30-sorry-only-tenant-administrators-can-add-this-app/error.png" title="Error Message"&gt;&lt;/p&gt;

&lt;p&gt;The application required Tenant Read permissions as I&amp;#8217;m accessing the User Profile through the JavaScript object model. The purpose of using the User Profile JSOM is to get the suggestions of sites and people to follow that SharePoint presents.&lt;/p&gt;

&lt;p&gt;Now, the concept of a &amp;#8220;Tenant&amp;#8221; makes sense for Office 365 or SharePoint Online. As a hosting provider, there are multiple tenants you want to support in a single environment. However, for an on-premise deployment, this error message didn&amp;#8217;t make much sense. I started poking around and came across &lt;a rel="nofollow" target="_blank" href="http://www.social-point.com/tenant-administration-sites"&gt;spinning up a tenant administration site&lt;/a&gt;, being able to set multiple app tenants through the &lt;a rel="nofollow" target="_blank" href="http://technet.microsoft.com/en-us/library/jj219772.aspx"&gt;App Management Service cmdlets&lt;/a&gt;, but none of those really seemed like the right solution for my on-premise deployment. I found an &lt;a rel="nofollow" target="_blank" href="http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/4e844f6c-2b73-46ff-9cda-05105332b8f8"&gt;MDSN Forum Question&lt;/a&gt; which seemed closer to the solution. That post recommends splitting the service accounts used to host the App Management and Site Settings services from the farm account. This was critical as the Farm Account is &lt;strong&gt;not allowed&lt;/strong&gt; to add apps under its identity whatsoever. You will get an error message when trying to provision, and the ULS logs will indicate that an assertion failed checking that the current account was not the system account.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2013-04-30-sorry-only-tenant-administrators-can-add-this-app/success.png" title="Provision"&gt;&lt;/p&gt;

&lt;p&gt;What did it turn out to be? I just needed to make sure my user account was &lt;strong&gt;directly&lt;/strong&gt; added as a member of the &lt;strong&gt;Farm Administrators&lt;/strong&gt; group. We have traditionally deployed farm administrators via an Active Directory and local (Administrators) group. However, it appears that the App Management service dislikes this approach and wants users &lt;em&gt;explicitly&lt;/em&gt; permissioned to the &lt;strong&gt;Farm Administrators&lt;/strong&gt; group. Additionally, after granting your user direct permissions, you need to issue an &lt;code&gt;iisreset&lt;/code&gt; so those changes take effect. Then, you can provision your app successfully.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/04/30/sorry-only-tenant-administrators-can-add-this-app/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/Cma0mMxuihA" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/04/30/sorry-only-tenant-administrators-can-add-this-app</guid>
         <pubDate>Tue, 30 Apr 2013 15:41:00 +0000</pubDate>
      </item>
      <item>
         <title>The risk is in the blocks!</title>
         <link>http://tastycupcakes.org/2013/04/the-risk-is-in-the-blocks/</link>
         <description>Timing: Teaching Risk Management &amp;#8211; 60 mins Conducting a risk assessment &amp;#8211; min 60 mins (depends on the project and how steady your team&amp;#8217;s hands are) Materials: 1 &amp;#8211; Jenga game Flip chart paper &amp;#38; markers Instructions: Teaching risk management: If you have a team who needs to learn about risk management I have some [...]</description>
         <author>mike@leanintuit.com</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2802</guid>
         <pubDate>Sun, 28 Apr 2013 22:27:55 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong>Timing</strong>:</p>
<p>Teaching Risk Management &#8211; 60 mins</p>
<p>Conducting a risk assessment &#8211; min 60 mins (depends on the project and how steady your team&#8217;s hands are)</p>
<p><strong>Materials:</strong></p>
<p>1 &#8211; Jenga game</p>
<p>Flip chart paper &amp; markers</p>
<p><strong>Instructions:</strong></p>
<p><span style="text-decoration:underline;">Teaching risk management: </span></p>
<p>If you have a team who needs to learn about risk management I have some fun with the game. I tell them we&#8217;re going on an interior canoe trip to Algonquin Park (Ontario), and we need to conduct a risk assessment. Usually very few people in the room have been on such trips so the example provides for a wide variety in the perception of risk. For example, someone who hasn&#8217;t been on a canoe trip will pull a block from the bottom identifying a risk a bear may come through our site.  I would take a block closer to the top as I see the risk of bears ruining my trip as low.  I respect bears but don&#8217;t fear them, so therefore I know how to live in their home without creating a problem.</p>
<p><span style="text-decoration:underline;">Conducting risk assessments:</span></p>
<p>Running this game with a project vs. during training doesn&#8217;t change the approach. If you&#8217;re running this game on a real project make sure you have the team present (including your customer).</p>
<p><a rel="nofollow" target="_blank" href="http://tastycupcakes.org/2013/04/the-risk-is-in-the-blocks/jenga-whole-3/"><img class="size-thumbnail wp-image-2841 alignleft" src="http://tastycupcakes.org/wp-content/uploads/2013/04/Jenga-Whole2-e1367185744503-150x150.jpg" alt="" width="150" height="150"/></a>If you&#8217;ve never played Jenga the basic idea is you remove a block and put it on top of the stack. Eventually if you&#8217;re not careful, or you have removed too many blocks the tower becomes unstable and falls.</p>
<p><span style="text-decoration:underline;">To run this game:</span></p>
<p>1) Place the stack of Jenga blocks at the front of the room on a table (preferably one no-one is sitting at to avoid accidents)</p>
<p><a rel="nofollow" target="_blank" href="http://tastycupcakes.org/2013/04/the-risk-is-in-the-blocks/jenga-in-play-3/"><img class="alignright size-thumbnail wp-image-2846" src="http://tastycupcakes.org/wp-content/uploads/2013/04/Jenga-in-play2-e1367186283401-150x150.jpg" alt="" width="150" height="150"/></a>2) Everyone is encouraged to come up (one at a time), identify a risk the project is facing and remove a block commensurate to the degree of risk. If it&#8217;s a minor risk the person might remove a block from the top of the stack.  If it&#8217;s a big complex risk the person might remove the block from the bottom middle of the stack.</p>
<p>3) On the flip chart paper record each of the risks identified and a ranking for the risks. When ranking I usually record it as high, medium or low (the ranking is relative to where the block was removed from the stack).</p>
<p>4) Participants can ask clarification questions regarding the risk and ranking. At this stage I usually don&#8217;t allow for risks to be discounted. However I encourage people to discuss where the block was pulled from (remember my bear example above).</p>
<p>5) The game ends when you run out of risks to discuss or the stack falls</p>
<p><a rel="nofollow" target="_blank" href="http://tastycupcakes.org/2013/04/the-risk-is-in-the-blocks/jenga-fallen/"><img class="size-thumbnail wp-image-2847 alignright" src="http://tastycupcakes.org/wp-content/uploads/2013/04/Jenga-Fallen-e1367186366639-150x150.jpg" alt="" width="150" height="150"/></a>As a team you then need to debrief the results regardless of the state of your stack. Leave the stack where it is during this time:</p>
<p><em><span style="text-decoration:underline;">A few big risks</span></em> resulted in too many blocks being removed from the bottom causing the stack to fall relatively quick.   In this case you may consider things like:</p>
<ul>
<ul>
<li>Do we have so many big risks the project may not be viable?</li>
<li>What is causing the number of big risks (ie. new technology, etc)?</li>
<li>How can the team respond to this situation to reduce the risk profile</li>
</ul>
</ul>
<p><span style="text-decoration:underline;"><em>Too many small risks</em></span> accumulated to cause the stack to fall (even if you didn&#8217;t identify any big risks)</p>
<ul>
<ul>
<li>Do we have so many small risks you project could suffer death by a thousand cuts</li>
</ul>
</ul>
<p><em><span style="text-decoration:underline;">The stack still stands</span></em> after you run out of time or risks to discuss</p>
<ul>
<ul>
<li>Is the risk profile manageable?</li>
<li>Is the project taking enough risks? Are you being innovative enough?</li>
<li>Are there things your project could do to increase the innovation and value of the project?</li>
</ul>
</ul>
<p><strong><em><span style="text-decoration:underline;">IMPORTANT!  </span></em></strong>When you&#8217;re using this game to facilitate risk assessments, make sure you&#8217;re identifying an action plan. If you leave this step out you&#8217;re wasting your team&#8217;s time. The action items need to be prioritized and included in your backlog based on the ranking the team assigned them.</p>
<p><strong>Learning Points:</strong></p>
<ul>
<li>Teach the importance of risk management</li>
</ul>
<ul>
<li>Facilitate the discussion to identify the risks on your project (without dying of boredom)</li>
<li>Rank the risks without getting bogged down in trying to quantify them (I find quantifying risk rankings in software development is as useful as estimating &#8230; it&#8217;s often a waste of time!)</li>
<li>Facilitate team discussion regarding the risk profile of the project</li>
</ul>]]></content:encoded>
      </item>
      <item>
         <title>git interactive rebase for svn without remotes</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/L2U0SGYFH7w/</link>
         <description>&lt;p&gt;I&amp;#8217;ve recently switched from using Subversion directly to using &lt;a rel="nofollow" target="_blank" href="https://www.kernel.org/pub/software/scm/git/docs/git-svn.html"&gt;git svn&lt;/a&gt; to allow me to use a git workflow, but interact with a subversion repository. It works &lt;em&gt;great&lt;/em&gt;, except when I needed to interactive rebase&amp;#8230;&lt;/p&gt;




&lt;p&gt;When moving this workflow into my customer&amp;#8217;s environment, they require I specify a JIRA ticket on each commit to the repo. I had forgot to do that for the first few commits, which looked like this:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;$ git log --oneline
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;6fa0719 Fixing the handlebars template to render the target as parent.
&lt;/span&gt;&lt;span class='line'&gt;21ad0cf Initial commit of the SiteSuggestions app
&lt;/span&gt;&lt;span class='line'&gt;6430b3b Adding the .gitignore files
&lt;/span&gt;&lt;span class='line'&gt;095d92e SP-34: Creating branch to track the new suggestions app part.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;So, when I tried to commit, I got an error indicating that the commit failed. In looking at the error, I saw the pre-commit hook error requiring that I associate the commit with a JIRA ticket. So, my first comment was easy to fix:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;$ git commit --amend -m "SP-34: Fixing the handlebars template to render the target as parent."
&lt;/span&gt;&lt;span class='line'&gt;[2013-sitesuggestions-svn 6b4bc64] SP-34: Fixing the handlebars template to render the target as parent."
&lt;/span&gt;&lt;span class='line'&gt; 1 file changed, 1 insertion(+), 1 deletion(-)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now I just had to figure out how to modify commits &lt;code&gt;21ad0cf&lt;/code&gt; and &lt;code&gt;6430b3b&lt;/code&gt;. I tried to use git interactive rebase as per the &lt;a rel="nofollow" target="_blank" href="http://trac.parrot.org/parrot/wiki/git-svn-tutorial"&gt;git svn tutorial&lt;/a&gt; and per the &lt;a rel="nofollow" target="_blank" href="http://git-scm.com/book/en/Git-Tools-Rewriting-History"&gt;git-scm book&lt;/a&gt;. However, in both cases, I got the following error message:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;$ git rebase -i HEAD-3
&lt;/span&gt;&lt;span class='line'&gt;fatal: Needed a single revision
&lt;/span&gt;&lt;span class='line'&gt;invalid branch HEAD-3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;The solution was to specify the SHA for the commit:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;$ git rebase -i 6430b3b^&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;This started the rebase process and allowed me to amend the commits for every faulted commit. Now, everything looks correct:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;$ git log --oneline
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;6fa0719 SP-34: Fixing the handlebars template to render the target as parent.
&lt;/span&gt;&lt;span class='line'&gt;21ad0cf SP-34: Initial commit of the SiteSuggestions app
&lt;/span&gt;&lt;span class='line'&gt;6430b3b SP-34: Adding the .gitignore files
&lt;/span&gt;&lt;span class='line'&gt;095d92e SP-34: Creating branch to track the new suggestions app part.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;When I finally committed using &lt;code&gt;git svn dcommit&lt;/code&gt;, everything went perfectly!&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/04/26/git-interactive-rebase-for-svn-without-remotes/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/L2U0SGYFH7w" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/04/26/git-interactive-rebase-for-svn-without-remotes</guid>
         <pubDate>Fri, 26 Apr 2013 17:30:00 +0000</pubDate>
      </item>
      <item>
         <title>E.W.A.N. McGregor</title>
         <link>http://tastycupcakes.org/2013/04/e-w-a-n-mcgregor/</link>
         <description>This exercise is actually &amp;#8220;Exercise Without A Name&amp;#8221; &amp;#8211; hence its name &amp;#8220;E.W.A.N.&amp;#8221; The reason for this is, after the 14 of us finished brainstorming the creation of this game at Agile Coach Camp Netherlands 2012, we came to the conclusion that this game could not be given a name, as doing so would transmit [...]</description>
         <author>Silvana Wasitova</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2804</guid>
         <pubDate>Thu, 25 Apr 2013 22:06:09 +0000</pubDate>
         <content:encoded><![CDATA[<p>This exercise is actually &#8220;Exercise Without A Name&#8221; &#8211; hence its name &#8220;E.W.A.N.&#8221;</p>
<p>The reason for this is, after the 14 of us finished brainstorming the creation of this game at Agile Coach Camp Netherlands 2012, we came to the conclusion that this game could not be given a name, as doing so would transmit its intention, and thereby reducing its impact.  See, this &#8220;Exercise Without A Name&#8221; started out as a desire to name, and reveal, the &#8220;elephant in the room&#8221;. Of course, if the word &#8220;elephant&#8221; was in the game&#8217;s name, then we we would inadvertently lead people to conclusions, which they would benefit to uncover on their own.</p>
<p>&#8212;&#8212;&#8212;&#8211;</p>
<p dir="ltr"><strong>Game Name: E.W.A.N. McGregor**</strong></p>
<p dir="ltr">Purpose: help a team admit a difficult topic, to prepare to talk about it &amp; move forward</p>
<p dir="ltr">Participants: Minimum: 4, Ideal: 10-15, Maximum: up to room capacity</p>
<p dir="ltr">Timebox: 20-30 minutes, depending on discussions; allow time for the debrief</p>
<p dir="ltr">Accessories: (Small) room, tape (to mark on floor), lots of chairs/obstacles, camera</p>
<p><strong><strong><br />
</strong></strong></p>
<div dir="ltr">
<table>
<col width="397"/>
<col width="227"/>
<tbody>
<tr>
<td><img src="https://lh4.googleusercontent.com/bgfBjYSSxykRPk2oRn-PinbNEACt37sSfbTFxr-NaVMjtof_RQyc5sZhPcpaT0lXK4Z0HApXQGwcQ0oxBHvc5HVMF97Fpl_w6TmNL8STJQYKox4F51U" alt=""/>*</td>
<td>
<p dir="ltr">Creation Date: 29 April 2012 at Agile Coach Camp Netherlands 2012</p>
<p dir="ltr">Co-creators: Thorsten Kalnin (initial question), Deborah Preuss (idea: build elephant using chairs), Silvana Wasitova, Niels Verdonk, Rob van Lanen, Robert van Vark, Coen Sanderink, Jan Salvador van der Ven, Dave Brands, Joost Jonker (?suggested “Ewan McGregor” name), Sander Huijsen, Freek Giele, Sandra Warmolts, Nicola Lovadina (who else?). Thanks to all who asked “what are you doing?” and provided inspiration.</p>
<p dir="ltr">Silvana’s Photos:<a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/silvana/sets/72157629932639519/"> http://www.flickr.com/photos/silvana/sets/72157629932639519/</a></p>
<p dir="ltr">On Flickr I used tags: accnl12 elephant<a rel="nofollow" target="_blank" href="http://www.flickr.com/search/?w=10905026@N00&amp;q=accnl12+elephant"> http://www.flickr.com/search/?w=10905026@N00&amp;q=accnl12+elephant</a></p>
</td>
</tr>
</tbody>
</table>
</div>
<p><strong><strong><br />
</strong></strong></p>
<p dir="ltr"><strong>Steps:</strong></p>
<p dir="ltr"><strong>Preparation</strong></p>
<ol>
<li>
<p dir="ltr">Select one or two “Observers”, and ask them to leave the room. (Could be from inside or outside the team, but people trusted by the team.)<br />
Select a “Documenter” to take picture(s) during Step 3.</p>
</li>
<li>
<p dir="ltr">Ask the participants to build a large “obstacle” in the middle of the room, e.g. a big pile of chairs (avoid calling it “The Elephant”).</p>
</li>
<li>
<p dir="ltr">If Obstacle does not get very close to the room’s walls, delineate space tight to the Obstacle Area by placing tape on the floor; game area is “inside” the taped area.  Facilitator: re-arrange chairs as necessary to make obstacle course more difficult, intricate. Take a picture.  Position Participants, spread out within the game area.</p>
</li>
</ol>
<p dir="ltr"><strong>Play</strong></p>
<ol start="4">
<li>
<p dir="ltr">Run two or three “Challenges” so Participants have to move around the obstacle to go to a  new spot. These should be activities where everyone want to be in one spot at the same time. INSTRUCT Participants to observe and remember their positions, movements and steps around the obstacle. Examples:</p>
<ul>
<ul>
<li>
<p dir="ltr">A Participant invites others to see something at their spot (“Look at this code!”).  Others have to navigate the obstacle to get closer to the inviter.</p>
</li>
<li>
<p dir="ltr">Another Participant invites others to go to another spot. (“Pizza has arrived!”).</p>
</li>
<li>
<p dir="ltr">Optional: one more “movement”.</p>
</li>
</ul>
</ul>
</li>
<li>
<p dir="ltr">Clear out the “Obstacle” (pile of chairs). (Think about what you will do with the chairs if the room is small). Ask the participants to go to the same starting position as in Step #3 and prepare to repeat the same movements they remember from Step 4..</p>
</li>
<li>
<p dir="ltr">Invite Observer(s) back in.</p>
</li>
<li>
<p dir="ltr">Without explaining to the Observer, Participants repeat the movements from Step  4.</p>
</li>
</ol>
<p dir="ltr">Now it gets strange &#8211; what’s going on?</p>
<ol start="8">
<li>
<p dir="ltr">Ask Observer(s) for their insights (DO NOT yet show picture from Step 3), e.g.:</p>
<ul>
<li>
<p dir="ltr">What do you want to ask us?</p>
</li>
<li>
<p dir="ltr">What advice would you give us?</p>
</li>
</ul>
</li>
<li>
<p dir="ltr">Ask Observer to participate in the “movements”; show the Observer “how we do things around here”; (Facilitator: group will probably warn Observer not to step in the “wrong” places to not get hurt &#8211; wait to see if it happens naturally). Main message: that’s the way we work here!</p>
</li>
<li>
<p dir="ltr">Ask Observer for their observations. (Optional: Repeat Steps 6 to 8).</p>
</li>
<li>
<p dir="ltr">Show Observer what the Participants “see” (picture from Step 3).</p>
</li>
</ol>
<p dir="ltr"><strong>Shift people to observer mode:</strong></p>
<ol start="12">
<li>
<p dir="ltr">As a facilitator, walk right through the “Obstacle”.  Ask all to “Join me in the middle”. This may feel tense. Ask &#8211; “How does this feel?” and wait for answers.</p>
</li>
<li>
<p dir="ltr">Ask people to sit down in a circle for the debrief.</p>
</li>
<li>
<p dir="ltr">Debrief.  Sample questions:</p>
<ul>
<li>How did it feel when &lt;Observer&gt; walked through the &lt;obstacle&gt;?</li>
<li>How did it feel when &lt;Participant/Facilitator&gt; walked through the &lt;obstacle&gt;?</li>
<li>What happened when &lt;Observer&gt;  challenged us?</li>
<li>What happened when &lt;Observer&gt;  joined us?</li>
<li>What was the role of the &lt;Documentor&gt;?</li>
</ul>
<p>&nbsp;</p>
<p dir="ltr"><strong>Connect to today’s situation:</strong></p>
</li>
<li>
<p dir="ltr">Facilitator: explain why you asked the group to do this exercise. Could be along the lines of: “I have been observing how we work&#8230; I have a hunch/feeling that there is something we are not talkiing about, that makes us less effective&#8230;”</p>
<ul>
<li>What are we not talking about?  (WAIT! Allow for reflection).</li>
<li>Facilitator: if things get tense, ask “What is happening right now?”</li>
<li>Continue focusing on the team and the process, do not let it get “resolved” by focusing on one particular person in the team.</li>
</ul>
</li>
<li>
<p dir="ltr">You might want to read up on navigating conflict for the discussion that will surface at this point. See ideas below.</p>
</li>
<li>
<p dir="ltr">At the end of your time: Invite the group back into the center (where the Obstacle) was.</p>
<ul>
<li>Ask: “How does it feel now?”</li>
<li>Possible wrap up questions: What’s possible from here? What do YOU want?</li>
</ul>
<p>&nbsp;</p>
<p dir="ltr">After the “Aha Moment”, ask the real questions</p>
<p dir="ltr">(Optional: can write these down in private, no need to share with others):</p>
<p dir="ltr">(Optional: Dress up the obstacle so it can be recognized as an elephant)</p>
<ul>
<li>
<p dir="ltr">Is there an elephant in the room?</p>
</li>
<li>
<p dir="ltr">Do we have an elephant?</p>
</li>
<li>
<p dir="ltr">What is our elephant?</p>
</li>
</ul>
</li>
</ol>
<p>&nbsp;</p>
<p dir="ltr"><strong>Possible next step:</strong></p>
<ul>
<li>read on Facilitating Conflict Resolution.</li>
<li>check out Lyssa Adkins&#8217; article on &#8220;navigating conflict&#8221; instead of resolving it</li>
<li>set up a big awesome goal and play FearlessJourney.info using the obstacles you are now willing to talk about . Influence change, even without authority!</li>
</ul>
<p>&nbsp;</p>
<p dir="ltr"><strong>**About the Game Name:</strong></p>
<p>“E.W.A.N. McGregor” came from “EWAN”, short for “Exercise Without A Name” &#8211; since the co-creating group wanted to stay away from using the word “Elephant” in the game name.  Without hinting to Participants in advance what the game is about, they can experience their own lessons and discoveries.  (Please do not call this “Pink Elephant Game” even tho it started out that way <img src='http://tastycupcakes.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley'/>  )</p>
<p>&#8212;&#8212;&#8212;&#8212;</p>
<p>The game&#8217;s original write up is at  <a rel="nofollow" target="_blank" href="https://docs.google.com/document/d/10WlzaTpyZS5uHg1fA8NI_inOpjdpNOtOI2br543FtIc/edit">https://docs.google.com/document/d/10WlzaTpyZS5uHg1fA8NI_inOpjdpNOtOI2br543FtIc/edit</a></p>]]></content:encoded>
      </item>
      <item>
         <title>Editing the SharePoint 2013 My Sites Web Part Pages</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/2xY_poRXLiw/</link>
         <description>&lt;p&gt;The last two weeks have been interesting. I&amp;#8217;ve been trying to deploy an app part built as part of a SharePoint 2013 app I developed recently. The app part re-creates the &amp;#8220;Suggestions&amp;#8221; functionality that you see when visiting the &amp;#8220;Followed Sites&amp;#8221; and &amp;#8220;Followed People&amp;#8221; pages in your My Site. Those web parts were &lt;strong&gt;not&lt;/strong&gt; easily reused in other parts of My Sites. The purpose of creating this app part was to be able to add suggestions directly to the Newsfeed page to make it a more useful information radiator. Unfortunately, editing the Newsfeed page (or any page) in the &amp;#8220;My Site Host&amp;#8221; was not nearly as intuitive as I had hoped.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2013-04-25-editing-the-sharepoint-my-sites-web-part-pages/site-edit-page.png" title="Edit Page in Ribbon"&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m used to having the ribbon to edit pages in SharePoint, regardless if they are standard publishing pages or web part pages. However, in the &amp;#8220;My Site Host&amp;#8221;, there is no ribbon for the standard pages, even when you are a farm administrator. I jumped to the conclusion that I could add the App Part via SharePoint Designer. Sadly, this wasn&amp;#8217;t the case. SharePoint Designer does not list &lt;strong&gt;any&lt;/strong&gt; app parts.&lt;/p&gt;

&lt;p&gt;I tried to go through the rigarmarole of adding the app to a separate site through the web editor, then copying the code from within SharePoint Designer and pasting it into the Newsfeed page, only for that to fail. The identifiers for the apps are completely different.&lt;/p&gt;

&lt;p&gt;&lt;img class="left" src="http://www.chrisweldon.net/images/posts/2013-04-25-editing-the-sharepoint-my-sites-web-part-pages/gear-edit-page.png" title="Edit Page in Settings Menu"&gt;&lt;/p&gt;

&lt;p&gt;This is when I stepped back and though that the solution should be simpler than this. It turns out, it was. Click the gear icon (settings menu) in the upper-right corner of SharePoint and you&amp;#8217;ll find the &lt;strong&gt;Edit Page&lt;/strong&gt; link. I felt liberated and frustrated at myself for not checking there earlier. From there, you have complete control to edit the Newsfeed web part page (or any page in the &amp;#8220;My Site Host&amp;#8221;).&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2013-04-25-editing-the-sharepoint-my-sites-web-part-pages/newsfeed-web-part.png" title="Newsfeed Web Part Page"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/04/25/editing-the-sharepoint-my-sites-web-part-pages/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/2xY_poRXLiw" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/04/25/editing-the-sharepoint-my-sites-web-part-pages</guid>
         <pubDate>Thu, 25 Apr 2013 13:24:00 +0000</pubDate>
      </item>
      <item>
         <title>Agile teams: location matters</title>
         <link>http://softwareandotherthings.blogspot.com/2013/04/agile-teams-location-matters.html</link>
         <description>&lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/jprusakova/7227835564/" title="P1060990 by janya, on Flickr"&gt;&lt;img alt="P1060990" height="240" src="http://farm8.staticflickr.com/7104/7227835564_0c76a520a4_n.jpg" style="margin:9px;padding:9px;"/&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="MsoNormal"&gt;A team is the single most important point of success or failure for a project. Team culture and leadership have a great influence on productivity, and team communication is essential for effective and sustainable product delivery. Co-located teams have a better chance to create great team culture and leadership, than teams that do not communicate face-to-face. Interacting in-person helps build trust and respect, common vision and shared responsibility faster and more deeply. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Having a fully co-located team requires an open-space environment, set hours to maximize face time, and sometimes even lunches together, so that the team spends the most time in face-to-face interactions.&amp;nbsp; In the pursuit of co-location other valuable things get dropped. Better specialists are not willing to work the exact hours, or are not available in a set location. Introverts suffer from too many hours in the open-space environment. And, because all communication is face-to-face, the team never has to develop the skills to communicate in any other way. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;However, while co-location brings a significant benefit, it also comes with a cost. Getting every member of the team in the same room at the same time for the duration of the project often requires a change. Sometimes that cost is trivial. For example, if team members are scattered around the organizations' campus for historical reasons. Co-locating a team like that is as simple as designating a team room, arranging furniture in an open pattern, and moving the team members over. Chances are, the organization is better off getting the team co-located, and reaping the benefits of improved team dynamics. But there are plenty of situations where co-location is very expensive - or even impossible. For example, a project team must include a specialist who resides in another city or country, or a key person on the team has to work from home some days. Co-location may not be an option, but the team can still deliver.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;It is harder to build Agile culture of trust, open communication and shared responsibility in a distributed team, but it can be done. Communication is a skill, one that teams can develop, if there is the will, training, and positive reinforcement. &amp;nbsp;Remote teams can get very good at communicating using different channels. &amp;nbsp;Regular (or even occasional) travel to get the team together allows to build strong relationships, that last long after everybody went back to their original, possibly far away, locations. &amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;There are many distributed teams that do great work, are Agile, deliver value, and enjoy great team culture. &amp;nbsp;Co-location is one way to achieve these goals, but it is not the only way.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear:both;text-align:center;"&gt;&lt;a rel="nofollow" target="_blank" href="http://www.agiledotnet.com/"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-ORVP4foUd0M/UXIL1Pfc_BI/AAAAAAAAAN4/3XwDzew6548/s1600/AgileDotNet2013-logo-web1.gif"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear:both;text-align:center;"&gt;&lt;a rel="nofollow" target="_blank" href="http://www.blogger.com/"&gt;&lt;span id="goog_900850684"&gt;&lt;/span&gt;Join us on May 17th at Minute Maid Park, Houston, TX&lt;span id="goog_900850685"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7086785636466343363.post-7720979730442192112</guid>
         <pubDate>Tue, 23 Apr 2013 06:00:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://2.bp.blogspot.com/-ORVP4foUd0M/UXIL1Pfc_BI/AAAAAAAAAN4/3XwDzew6548/s72-c/AgileDotNet2013-logo-web1.gif" width="72" />
      </item>
      <item>
         <title>Communication Race</title>
         <link>http://tastycupcakes.org/2013/04/communication-race/</link>
         <description>Timing: Between 15-30 min Materials: piece of cardboard from any unused box  (~20cm x ~20cm), marker, scissor, ~10 threads (around 60/80cm each one), big sheet of paper Instructions: You need to do some preparation first: Do a hole in the middle of the cardboard piece with your scissor. You need to be sure the pen is able to go [...]</description>
         <author>ocbermudez</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2784</guid>
         <pubDate>Wed, 10 Apr 2013 22:20:40 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong>Timing</strong>: Between 15-30 min</p>
<p><strong>Materials:</strong></p>
<p>piece of cardboard from any unused box  (~20cm x ~20cm), marker, scissor, ~10 threads (around 60/80cm each one), big sheet of paper</p>
<p><strong>Instructions:</strong></p>
<p><strong></strong>You need to do some preparation first:</p>
<ul>
<li>Do a hole in the middle of the cardboard piece with your scissor. You need to be sure the pen is able to go there and it is not dropping.</li>
<li>Do small perforation in each side of the cardboard square. You need to do as many perforation as participants. (between 5 and 15 should be fine).</li>
<li>Attach one thread to each small perforation.</li>
<li>Design your race in the big paper sheet.</li>
<li>You should get something like that:</li>
</ul>
<p><a rel="nofollow" target="_blank" href="http://tastycupcakes.org/2013/04/communication-race/agilecafe-org_communication_game/"><img class="size-full wp-image-2785 aligncenter" src="http://tastycupcakes.org/wp-content/uploads/2013/04/agilecafe.org_communication_game.jpg" alt="" width="166" height="221"/></a></p>
<p>How to play:</p>
<p>Each member of the team need to pull one thread and place the pen in the start line.</p>
<p>They must do one &#8220;clean loop&#8221;. It means, not blank spot, and the line is not able to go out of the design. If one of these impediments happens, they need to re-start again. To avoid confusion, you could change the marker color.</p>
<p>To increase the difficulty and fun, you could design crazy races or mazes. Up to you.</p>
<p>It is a game that you could play it few times during the year with the same team, you only need to change the design (race or maze). The fun is warranty.</p>
<p><a rel="nofollow" target="_blank" href="http://tastycupcakes.org/2013/04/communication-race/agilecafe-org_communication_game_play/"><img class="alignnone size-full wp-image-2786 aligncenter" src="http://tastycupcakes.org/wp-content/uploads/2013/04/agilecafe.org_communication_game_play.jpg" alt="" width="150" height="150"/></a></p>
<p><strong>Learning Points:</strong></p>
<p>Communication, collaboration, and leadership.</p>
<p>As facilitator, you could detect how take the leader and guide the team. I personally, when I detect the leader, I add one extra rule, he/she needs to stop talk for few minute or seconds. The idea behind the game is, the full team need to talk and collaborate to arrive to the end line. Normally after few tries, they got the idea, and they start to talk.</p>
<p>At the end, you only need to ask what happens, and the team alone will come with collaboration and communication as themes to discuss. You could guide the team to the level of communication you are expecting from the team, why and how they could get it.</p>
<p>You could see also one video here: <a rel="nofollow" target="_blank" href="http://www.agilecafe.org/team-communication-improvement/">http://www.agilecafe.org/team-communication-improvement</a></p>
<p><strong>Variations:</strong></p>
<p><strong></strong>You could design wherever you want to add complexity and generate frustration at the beginning</p>
<p>You could add also gifts when they arrive to the end, the last time I gave to each member one post card with a big BRAVO.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
      </item>
      <item>
         <title>Google Plus</title>
         <link>http://brandonbarber.net/archives/379</link>
         <description>From BooleanStrings.com Find People on Google-Plus March 21, 2013 By booleanstrings I’ve always felt that Google-Plus has a great future, since it was announced. Adding Communities was a big and positive change. A recent shift in its User Interface tells me that Google-Plus continues moving in the right direction. Did you notice the “new” Find [...]</description>
         <author>Brandon</author>
         <guid isPermaLink="false">http://brandonbarber.net/?p=379</guid>
         <pubDate>Tue, 09 Apr 2013 14:55:17 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://www.booleanstrings.com" title="Boolean Strings">From BooleanStrings.com</a></p>
<p>Find People on Google-Plus<br />
March 21, 2013 By booleanstrings<br />
I’ve always felt that Google-Plus has a great future, since it was announced. Adding Communities was a big and positive change. A recent shift in its User Interface tells me that Google-Plus continues moving in the right direction.<br />
Did you notice the “new” Find People function?</p>
<p>When selected, it provides the ability to:<br />
Check your gmail address book against your circles<br />
Search “for coworkers” and “for classmates”, that, in fact, offers to look for people from any workplace and from any school. This is faceted search<br />
Import contacts from an address book (a CSV file)<br />
Did you know that all of this people searching functionality has been there a while? The only new (visual) add-on I have noticed is graphically pointing to the number of (sort-of) friends in common; I’ve highlighted on the screenshot above.<br />
The user interface shift doesn’t affect the explained concepts in my recorded Google-Plus presentation available  at the Training Library. This people search functionality was previously buried under “finding people to include in your circles”; we explored it in-depth at the webinar. When I present the Google-Plus again, for now, I will only have to re-do the screenshots. What a fast moving target it is, Social Networks and People Search!<br />
I am glad that this better People Search is now clearly visible. Check it out if you haven’t.<br />
Compare this with the “old” search that has been easily visible all along:</p>
<p>The “old” search only offers using keywords and narrowing down to “people and pages”. (The location facet is there, but I haven’t seen it working properly.) The search weakness is a shame, since Google-Plus has well structured information about its members in the About pages, including employment, skills, places, education, and valuable for the People Sourcers links to other social profiles and sites. That, and given that the amount of information in Google-Plus is tiny, compared with the whole surface web that Google search indexes, should let Google-Plus Engineers easily provide us with multi-faceted people search. (Why has it been taking it so long?) The third party site that implemented multi-faceted search early on, FindPeopleOnPlus, it seems, ran out of steam over a year ago, and now covers only a small % of the total network population. Hopefully, the described shift in the User Interface is a sign that Google-Plus is working on solid people search functionality. Let’s keep an eye on it.<br />
Unfortunately, selecting several people and “rolling” them to a circle is no longer available on the new page, while it’s still available on the “old” circles page. Hopefully this inconsistency in the user interface will be cleaned up soon. I prefer the way it used to be.<br />
That’s really minor though. Google-Plus has a big and bright future.<br />
- Irina</p>]]></content:encoded>
         <category>Recruiting</category>
      </item>
      <item>
         <title>Estimation agility</title>
         <link>http://softwareandotherthings.blogspot.com/2013/03/estimation-agility.html</link>
         <description>&lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/jprusakova/8360985016/" title="P1000263 by janya, on Flickr"&gt;&lt;img alt="P1000263" height="282" src="http://farm9.staticflickr.com/8046/8360985016_a7943c6a13.jpg" width="500"/&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;How good are your estimates? &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Well, it depends.&amp;nbsp; If the project is slow-moving, the team is stable and has been at it for awhile, the platform is well-known and&amp;nbsp;doesn't&amp;nbsp;change much, and requirements are more along the lines of “get me some more of this”, rather than asking for something completely new and unknown – maybe the estimates are right on the money.&amp;nbsp; For the rest of us, working in the real world and on real projects, with real people involved, estimates are mostly guesses, often – very bad guesses. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Yet there is all that great pressure to get the estimates right early on.&amp;nbsp; The business side needs to know how much will be done when.&amp;nbsp; The clients have to understand when the product will be available for use.&amp;nbsp; Marketing is in dire need to make an announcement.&amp;nbsp; It has to go into the contract.&amp;nbsp; Salesperson already swore to it on building manager’s dog’s grave. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The estimate, which is often pure guesswork, rules the fate of the project, the development team, the customer’s hopes and the business success.&amp;nbsp; Never mind that the guess has been made at the worst possible time, when hardly anything is known about the project and no patterns have yet been established.&amp;nbsp; &amp;nbsp;Rather than iterating on estimates, deadlines, project scopes, the tendency is to push for more overtime, less testing, more risk-taking – and more blame going around. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;If the estimate is wrong, there is very little the project team can do to overcome an overly aggressive or too-far-out estimate.&amp;nbsp; Adding or removing people, and making the team work more hours has been shown to waste resources and reduce quality, rather than increase the speed of development. &amp;nbsp;Piling pressure to work “better and faster” helps even less. &amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The only reasonable solution is to iterate on the estimate, refining and re-setting expectations as the project goes forward and new information becomes available. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/jprusakova/8177242535/" title="P1080958 by janya, on Flickr"&gt;&lt;img alt="P1080958" height="500" src="http://farm9.staticflickr.com/8337/8177242535_73323a2756.jpg" width="375"/&gt;&lt;/a&gt;&lt;/center&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7086785636466343363.post-4632244049184356194</guid>
         <pubDate>Fri, 29 Mar 2013 22:08:00 +0000</pubDate>
      </item>
      <item>
         <title>The high-risk airplane factory</title>
         <link>http://tastycupcakes.org/2013/03/the-high-risk-airplane-factory/</link>
         <description>Timing: 35-40 minutes Materials: Paper, pen, scissor, tape, watch. Instructions: This game is good fun to understand how to prioritise using the Lean &amp;#8220;bucket&amp;#8221; system and Agile concepts and managing RISK with the best-known strategy. The participants will also learn the power of information radiators and retrospective. 1. Teams are created (3 to 5 people each) [...]</description>
         <author>Erich Buhler</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2763</guid>
         <pubDate>Fri, 29 Mar 2013 04:29:19 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong>Timing</strong>: 35-40 minutes</p>
<p><strong>Materials:<br />
</strong><span style="font-family:Consolas, Monaco, monospace;font-size:12px;line-height:18px;">Paper, pen, scissor, tape, watch.</span></p>
<p><strong>Instructions:<br />
</strong><span style="font-family:Consolas, Monaco, monospace;font-size:12px;line-height:18px;">This game is good fun to understand how to prioritise using the Lean &#8220;bucket&#8221; system and Agile concepts and managing RISK with the best-known strategy. The participants will also learn the power of information radiators and retrospective.</span></p>
<pre>1. Teams are created (3 to 5 people each)
2. Each one receives paper, a pen and tape.
3. The moderator informs that they should create as many paper
planes -of the following types- as they can:</pre>
<pre>	1. Jet 2 wings (5 points each)	2. UFO (50 points each)
	3. Tubular jet (5 point each)	4. 4-Wings plane (20 points each)

Each plane MUST fly and be DECORATED.</pre>
<p>&nbsp;</p>
<p><strong>FIRST Round<br />
</strong><span style="font-family:Consolas, Monaco, monospace;font-size:12px;line-height:18px;">Each team has 5 minutes to take a look at the previous type of planes and group them according to the following table:</span></p>
<pre>Basic Plane       - Easy to build, easy to make it fly, standard decoration.
Performance Plane - Medium-easy to build, easy to make it fly, standard decoration.
Exciting Plane    - Medium-easy to build, medium-easy to make it fly, super-cool decoration.
High-uncertainty Plane - Unknown how to build it or make it fly, unknown decoration.</pre>
<pre>Each group should write the strategy in a banner and stick it to the wall (i.e.  We
will make 4 basic planes first, make 5 of each one, etc).
The moderator should explain that if strategy changes then it has to
be reflected in the banner as soon as it happens.</pre>
<p>&nbsp;</p>
<p><strong>SECOND round<br />
</strong><span style="font-family:Consolas, Monaco, monospace;font-size:12px;line-height:18px;">The team has <strong>20 minutes</strong> to make as many planes as they can. Each finished flying and decorated machine has to be stuck to the Basic, Performance, Exciting, High Uncertainty area.</span></p>
<pre></pre>
<pre><strong>End of the game</strong>
The moderator stops the watch and:

1. Reads the different strategies.
2. Discusses with the teams what could have been done in a different way.
3. Counts the points of the flying and decorated machines only.</pre>
<pre>The team with the highest number of points win.</pre>
<p>&nbsp;</p>
<p><strong>Learning Points:<br />
</strong>Prioritise using the Lean &#8220;bucket&#8221; system and learn about risk management in Agile and retrospective.</p>
<p>&nbsp;</p>
<p>(c) 2011 Erich Buhler</p>
<p><a rel="nofollow" target="_blank" href="http://AgileIberoAmerica.wordpress.com">AgileIberoAmerica.wordpress.com</a></p>]]></content:encoded>
         <category>*All Games*</category>
      </item>
      <item>
         <title>Play Doh Zoo: Agile UX unleashed</title>
         <link>http://tastycupcakes.org/2013/03/play-doh-zoo-agile-ux-unleashed/</link>
         <description>The goal of the Play doh Zoo Game is to explain and practice the reasons behind agile, and the principles that the methodology is built on. It is specifically targeted at designers and aims to highlight the benefits of agile, and illustrate how design activities can occur in an agile environment. Cathie Hagen, Marie-Claire Dean [...]</description>
         <author>Marie-Claire Dean</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2750</guid>
         <pubDate>Fri, 22 Mar 2013 02:28:23 +0000</pubDate>
         <content:encoded><![CDATA[<p>The goal of the Play doh Zoo Game is to explain and practice the reasons behind agile, and the principles that the methodology is built on. It is specifically targeted at designers and aims to highlight the benefits of agile, and illustrate how design activities can occur in an agile environment.</p>
<p>Cathie Hagen, Marie-Claire Dean and Megan Cook invented the game and originally <a rel="nofollow" target="_blank" href="http://schedule.sxsw.com/2012/events/event_IAP9413">ran this at SxSW 2012</a>. There&#8217;s a write-up of that session on <a rel="nofollow" target="_blank" href="http://i-thought.org/blog/experience-design/sxsw-workshop-agile-experience-design">Marie-Claire&#8217;s blog</a> and also on <a rel="nofollow" target="_blank" href="https://www.tractionco.com/blog/221-the-sxsw-files-agile-experience-design">Adam Kleinberg&#8217;s blog</a> (he was a participant).</p>
<p>&nbsp;</p>
<h1>Timing</h1>
<p>This game can be run in 60mins (we did so at SxSW), but you can also make it a longer session if you wish.</p>
<p>&nbsp;</p>
<h1>Materials</h1>
<p><strong>For the &#8220;Customers&#8221;</strong></p>
<ul>
<li>Post-It Easel Pad</li>
<li>Super Sticky Post-It Notes</li>
<li>Coloured Marker Pens</li>
</ul>
<p><strong>For the Zoo Building Team:</strong></p>
<p><strong><em>Construction workers</em></strong></p>
<ul>
<li>Play Doh  (4-6 tubs per team)</li>
<li>Coloured Marker Pens</li>
<li>Coloured Pencils</li>
<li>Large sheets of blue, green, yellow, white paper</li>
<li>Pop sticks</li>
<li>Tape (masking preferred)</li>
<li>String</li>
<li>Cellophane</li>
<li>Scissors</li>
<li>… anything crafty</li>
</ul>
<p><strong><em>Business &amp; Design Group</em></strong></p>
<ul>
<li>Graph paper</li>
<li>Coloured Marker Pens</li>
<li>Coloured Pencils</li>
<li>Super Sticky Post-It Notes</li>
</ul>
<p>A variety of craft supplies will allow teams to be creative. Therefore, variety in raw materials is encouraged. Also, sharing resources within the team should be encouraged.</p>
<p><strong>Facilitator:</strong></p>
<ul>
<li>Timer</li>
<li>Whistle (something loud to capture everyone’s attention, especially with a large group)</li>
</ul>
<p>&nbsp;</p>
<h1>Instructions</h1>
<p>Split the players into 2 main groups: the customers, and the zoo builders.</p>
<p>The customer group will help the facilitators guide the game play, by acting as customers of the zoos. They will vote with their feet to determine that zoo offers the most fun.</p>
<p>The zoo builders will be split up into teams to compete against each other. Each team will be split into 2 equally sized groups:</p>
<ul>
<li>Planning &amp; Design group (to oversee the overall direction of the zoo);</li>
<li>Constructions workers (to build the zoo).</li>
</ul>
<p>Once the teams have been formed, the game can start. The game is carried out over 3 iterations, during which time the zoo is built. After each iteration, the safety inspector will determine if the zoo is safe to open, and if so the customers “visit” their preferred zoo. A retrospective occurs between each iteration to reinforce the learnings from the game.</p>
<p>After the final iteration is finished, the points are counted and a winner is declared.</p>
<p>&nbsp;</p>
<h1>Learning points:</h1>
<p>The objective of this exercise is to the demonstrate the principles of agile, in particular for experience designers:</p>
<ul>
<li>Working Software – Why it is important to deliver value early</li>
<li>Responding to change – How iterative development makes integrating change easier</li>
<li>Communication and collaboration – Every team member brings something to the table</li>
<li>Customer Feedback – Importance of soliciting and integrating feedback regularly</li>
<li>Managing a project – How a success project requires both business and customer needs to be met</li>
<li>Retrospectives – How continuous improvement is part of the process</li>
</ul>
<p>You will learn the above by:</p>
<ul>
<li>Being rewarded for delivering value early</li>
<li>Working in a team. We expect successful teams to:</li>
<ul>
<li>Communicate between the groups</li>
<li>Co-locate</li>
<li>Note: pairing and changing roles is to be encouraged</li>
</ul>
<li>Talking to your Customer. The customer role will provide a demonstration of vague and changing requirements. To be successful the team needs to:</li>
<ul>
<li>Elicit requirements from the customer</li>
<li>Elicit acceptance criteria from the customer</li>
</ul>
<li>Sharing your observations with the trainers and learners on:</li>
<ul>
<li>Balancing business and customer requirements</li>
<li>Role of a Customer</li>
<ul>
<li>Feedback</li>
<li>Acceptance Criteria</li>
</ul>
<li>Adaptive Planning</li>
<ul>
<li>Product Evolution</li>
<li>Feature Refinement</li>
</ul>
</ul>
</ul>
<h1></h1>
<h1>Number of Players</h1>
<p>This game is designed for a large number of people 50-150.</p>
<p>Each zoo builder teams consists of 3-12 people</p>
<p>The customer team consists of 5 – 50 people. The recommended minimum number of people for this team is twice the number of zoo-builder teams, to allow for greater variance in voting and a richer experience during iterations.</p>
<p>Please note: As the size of players increase, so will the number of facilitators required. It is useful to have 1 safety inspector/facilitator for every 2 zoo-builder groups, a dedicated facilitator for the customer group.</p>
<p>&nbsp;</p>
<h1>Game play</h1>
<p>For each iteration:</p>
<ul>
<li>During an iteration (5 minutes)
<ul>
<li>Customers have specific tasks for each iteration, refer to role description</li>
<li>Zoo team builds the zoo</li>
<li>Ending an iteration:
<ul>
<li>Safety inspector reviews the built zoos and applies penalties if required.</li>
<li>Safety inspector determines whether the zoo is open for business. That is, the zoo must have gate, and at least 1 animal enclosure.
<ul>
<li>If a zoo fails inspection it is closed for business, no points awarded this round.</li>
<li>If a zoo passes inspection it is open for business</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Each zoo showcases their zoo.</li>
<li>Customers vote for their favorite zoo. Points are awarded for each.</li>
<li>Retrospective (5 minutes):
<ul>
<li>Run collectively</li>
<li>Tease out learnings</li>
<li>Customers should be allowed to participate in the retrospective</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<p><strong>Facilitator Notes:</strong> Most teams will be unfamiliar with retrospectives. Provide a quick briefing before the first retrospective to everyone, and assist the teams by helping them focus on process improvement. It may also be useful to provide templates as a framework for the running the retrospectives. The anchors and engines template is an easy, quickly understood template.</p>
<p><span style="font-size:2em;"> </span></p>
<h1>Role Descriptions:</h1>
<p>&nbsp;</p>
<h1>Customer</h1>
<p>Congratulations! You as a customer get to mess with the rest of the teams J</p>
<p>This group will act as customers for the zoo building teams. This team should be located away from the zoo building teams, a break-out room is preferred. Zoo building team members can visit at any time.</p>
<p>&nbsp;</p>
<p><strong>Iteration 1</strong></p>
<ul>
<li>Brainstorm what a good zoo should have</li>
<li>Rank theses ideas</li>
</ul>
<p>&nbsp;</p>
<p><strong>Iteration 2</strong></p>
<ul>
<li>Discuss trends/events that may effect zoo attendance</li>
<li>Vote for a disruptive trend/event. This occurred! The zoo builder teams are told about this event occurring after iteration 2 finishes and before iteration 3 starts.</li>
</ul>
<p>&nbsp;</p>
<p><strong>Iteration 3</strong></p>
<ul>
<li>Mingle and checkout progress early with the zoo building teams.</li>
</ul>
<p>&nbsp;</p>
<p><strong>Rules:</strong></p>
<ul>
<li>Cannot visit a zoo if the safety inspector has deemed it “unsafe”</li>
<li>Can fill in comment cards for a zoo at the end of an iteration during “visit” time</li>
<li>Can join a team at any time</li>
<li>Can provide feedback to a team at anytime</li>
</ul>
<p>&nbsp;</p>
<p><strong>Facilitator Notes:</strong></p>
<p>The customer group may require hands-on facilitation, depending on the pro-activeness of this group. If needed, help the determining their requirements using fun gamestorming techniques.</p>
<p><strong><br />
</strong></p>
<h1>Zoo building team</h1>
<p>Start with 3 equally balanced teams. The teams can self organize, but people working outside their role are handicapped.</p>
<p><strong>Facilitator Notes:</strong></p>
<p>Resist the urge to prevent the zoo-building team from making mistakes, e.g. overlong planning. Mistakes should be highlighted by the scoring system, and raised within the retrospectives (hopefully by the players themselves).</p>
<h2>Construction Workers</h2>
<p>You get access to lots of materials. Only current members of the can build the zoo.</p>
<p><strong>Correlation in a software team:</strong> developers (front &amp; back end)</p>
<p><strong>Rules:</strong></p>
<ul>
<li>Cannot start building without a plan</li>
<li>Must do what the designers and planners team tells them</li>
</ul>
<p>&nbsp;</p>
<h2>Designers and Planners Group</h2>
<p>Only have pens/pencils, planning paper, post-its notes. You determine the direction of the build; the construction workers must follow your say-so.</p>
<p><strong>Correlation in a software team:</strong> analysts, designers, managers, testers, SMEs.</p>
<p>&nbsp;</p>
<p><strong>Rules</strong></p>
<ul>
<li>Can assist with building animals/infrastructure, but may only use 1 hand</li>
<li>Can request safety briefings and evaluations</li>
<li>Customers embedded into team, join this group</li>
</ul>
<p>&nbsp;</p>
<h1>Safety Inspector [Optional]</h1>
<p>A facilitator will play the safety inspector(s). They provide briefings on the rules that the zoos need to follow. Briefings are carried out with all teams.</p>
<p>The safety inspector also can inspect. Inspections are only carried out for 1 team at a time. If inspecting during an iteration, they act as consultants, allowing the team to correct mistakes without penalty. If inspecting after an iteration is complete, the safety inspector can prevent the zoo from opening, or remove features that are dangerous (e.g. remove a animal which does not have an enclosure), when inspecting at the end of an iteration. Reasons for failing inspection are always explained.</p>
<p><strong>Rules</strong></p>
<ul>
<li>Safety rules are clear, concise and straightforward. They do not change during the game.</li>
<li>Examples of rules:</li>
<ul>
<li>An animal must have an enclosure.</li>
<li>Predator &amp; prey cannot be in the same enclosure (don’t put the lions with the gazelles)</li>
</ul>
</ul>
<p><strong>Facilitator notes: </strong>The safety inspector should demonstrate the benefit of testing often, and why quality should be embedded into the process.</p>
<p><strong><br />
</strong></p>
<h1>Scoring</h1>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="360"><strong>Activity</strong></td>
<td valign="top" width="156"><strong>Points</strong></td>
</tr>
<tr>
<td valign="top" width="360">Basic zoo: gate and gate personnel, and at least 1 animal enclosure
<p>[Optional]</td>
<td valign="top" width="156">1</td>
</tr>
<tr>
<td valign="top" width="360">Animals [Optional]</td>
<td valign="top" width="156">1 for each different animal</td>
</tr>
<tr>
<td valign="top" width="360">Infrastructure/Facilities [Optional]</td>
<td valign="top" width="156">1 for each facility</td>
</tr>
<tr>
<td valign="top" width="360">Customer votes</td>
<td valign="top" width="156">1 for each customer visiting</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
      </item>
      <item>
         <title>8 Monkeys in a Cage – a Mura Learning Game</title>
         <link>http://tastycupcakes.org/2013/03/8-monkeys-in-a-cage-%e2%80%93-a-mura-learning-game/</link>
         <description>Timing: 20 minutes Overview: Mura is one of three fundamental Lean principles. In short, it’s about unnecessary variations. It states that people are more productive when not dealing with unnecessary variations. Playing this game should help people to feel a situation when variation is unproductive. Learning Points: Ask some of participants how they felt during the first [...]</description>
         <author>Zvonimir Križ</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2746</guid>
         <pubDate>Wed, 20 Mar 2013 21:43:09 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong>Timing: </strong>20 minutes</p>
<p><strong>Overview:</strong></p>
<p>Mura is one of three fundamental Lean principles. In short, it’s about unnecessary variations. It states that people are more productive when not dealing with unnecessary variations. Playing this game should help people to feel a situation when variation is unproductive.</p>
<p><strong>Learning Points:</strong></p>
<p>Ask some of participants how they felt during the first session (with different monkeys) and how they felt during a second session (with only one monkey). What was faster? Which session was more stressful?</p>
<p>After this, let them understand that a task was to draw 8 monkeys, not to draw 8 different monkeys. So it means these variations were unnecessary. Also, it is important to say that a real reason why they were faster during a second session was because they learned how to deal with this monkey.</p>
<p>Help participants to correlate this situation to a real world examples:</p>
<ul>
<li>one of the worst situation are unnecessary variations in product backlog. It generates stress and makes us less self-confident during estimations. That’s why we need a balanced flow</li>
<li>it is relatively often that people implement multiple, slightly different implementations for a same problem. We don’t need such variations. In that case, we should use “a same monkey” – a component</li>
<li>ask participants to add more real world examples of unnecessary variations</li>
</ul>
<p><strong>Link to Game: </strong><a rel="nofollow" target="_blank" href="http://zvonekriz.com/2013/03/17/8-monkeys-in-a-cage-a-mura-learning-game/">http://zvonekriz.com/2013/03/17/8-monkeys-in-a-cage-a-mura-learning-game/</a></p>]]></content:encoded>
      </item>
      <item>
         <title>Melissa Meeker Nominated for Top Female Executive Award</title>
         <link>http://tmgirvin.com/2013/02/21/addison-top-female-executive-awards/</link>
         <description>One of my awesome colleagues at Improving is up for an award.&amp;#160; If you know Melissa (often responsible for coordinating our community events and get-togethers, plus all of the awards that Improving wins) please go vote for her.&lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tmgirvin.com&amp;#038;blog=14416035&amp;#038;post=85&amp;#038;subd=tmgirvin&amp;#038;ref=&amp;#038;feed=1" width="1" height="1"/&gt;</description>
         <author>tmgirvin</author>
         <guid isPermaLink="false">https://tmgirvin.wordpress.com/?p=85</guid>
         <pubDate>Thu, 21 Feb 2013 15:55:34 +0000</pubDate>
         <content:encoded><![CDATA[<p>One of my awesome colleagues at <a rel="nofollow" target="_blank" href="http://www.improvingenterprises.com/">Improving</a> is up for an award.&#160; If you know Melissa (often responsible for coordinating our community events and get-togethers, plus all of the awards that Improving wins) please go vote for her.</p>
<p><a rel="nofollow" target="_blank" href="http://addisonmagazine.com/sections/features/top_female_execs/2013/index_with_form.shtml"><img title="clip_image002" style="background-image:none;padding-top:0;padding-left:0;display:inline;padding-right:0;border-width:0;" border="0" alt="clip_image002" src="http://tmgirvin.files.wordpress.com/2013/02/clip_image002.jpg?w=543&#038;h=678" width="543" height="678"/></a></p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/tmgirvin.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tmgirvin.wordpress.com/85/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tmgirvin.com&#038;blog=14416035&#038;post=85&#038;subd=tmgirvin&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://0.gravatar.com/avatar/f6f9794f022869f90db72ef2dc6ee0cc?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">tmgirvin</media:title>
         </media:content>
         <media:content medium="image" url="http://tmgirvin.files.wordpress.com/2013/02/clip_image002.jpg">
            <media:title type="html">clip_image002</media:title>
         </media:content>
      </item>
      <item>
         <title>52 Card Pickup</title>
         <link>http://tastycupcakes.org/2013/02/52-card-pickup/</link>
         <description>Objectives: Participants will quickly learn about how adding some basic structure to tackle problems can help teams self-organize and become more effective. The lightweight structures introduced included iteration planning, iteration review, and retrospective. The team should be able to take away that by having these small meetings, they will be in a cycle of continuous [...]</description>
         <author>Matt Badgley</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2731</guid>
         <pubDate>Sat, 16 Feb 2013 16:59:30 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong>Objectives:</strong></p>
<p>Participants will quickly learn about how adding some basic structure to tackle problems can help teams self-organize and become more effective. The lightweight structures introduced included iteration planning, iteration review, and retrospective. The team should be able to take away that by having these small meetings, they will be in a cycle of continuous &#8220;innovate and adapt.&#8221;</p>
<p><strong>Timing:</strong></p>
<p>30 Minutes. Will depend on the number of iterations; however, keeping it short 15 minutes of activity followed by 5-10 minutes of debrief.</p>
<p><strong>Materials:</strong></p>
<p>(# of Teams) * Deck of Cards, white board or flip chart, a visible timer (e.g. http://www.online-stopwatch.com/) , and situation cards (see below). If you like, get some prizes for the winning team.</p>
<p><em>Hint: Get your cards from a dollar store, no need for great cards.</em></p>
<p><strong>Number of Participants:</strong></p>
<p>Minimum of six (two teams of three), but ideally you will have multiple teams of 4-7 team members. If you have teams of more than 7, have some play the role of observers and change out active team members during iterations.</p>
<p><strong>Instructions:</strong><br />
The basics of the game are simple &#8211; you&#8217;ll conduct a two-minute iteration where the team must drop the cards on the floor, pick them up, place them on a table, and then sort them in the order based on the objectives of the iteration. At the end of the two-minute iteration, the team reflects on how things went and what can they do to improve, then we do it all over again.</p>
<p>There are a few things to do to prepare:</p>
<ul>
<li>Shuffle the cards &#8211; yep, no brainer, but they should be shuffled each iteration.</li>
<li>Create a scoreboard &#8212; have the teams come up with names. At the end of each iteration, you&#8217;ll write down the amount of time it took for a team. At the end of the game, sum up the total seconds and the team with the lowest wins (NOTE &#8211; the competition helps the chaos of the game, not to mention raises the pressure the teams feel &#8212; and it&#8217;s fun!).</li>
<li>Prep the room &#8211; teams will need table space and space to move around, so move chairs out of the way.</li>
</ul>
<p>Some key things to do as the facilitator &#8212; you are the Customer or Product Owner in this game. So, when a team says they have the cards sorted correctly, you will need to verify the team followed the instructions. Be picky if necessary &#8212; I always like either nice neat stacks as well as make sure they are in the correct order. If not, make them re-do it.  If they get it right, the team captures the amount of time it took them to make the stacks (in seconds).  At the end of each iteration, update the scoreboard.</p>
<p>For the first iteration, simply start &#8211; no planning. After the first iteration, give the teams one minute to review and retrospect, then show the next iteration objectives, and then give the teams a minute to plan. Keep the time boxes crisp and rapid.</p>
<p>Now here&#8217;s where the fun comes in, after the first iteration &#8212; ask one team member from each team to come up to the front of the room and randomly select one of the situation cards. Each team member should read their card, put it back in the deck, and during the iteration &#8211; do what the card says. And most importantly tell them, &#8220;do not tell anyone what your card says or your team will not be allowed to do this round and automatically get hit with a 120 second iteration.&#8221; Do this during the planning minute.</p>
<p>I recommend doing four to five iterations. Below, you&#8217;ll find links to download an example presentation with four iterations.</p>
<p><strong>Learning Points:</strong></p>
<p>At the end of the game, have the team reflect on what they learned. Point out the key areas of improvements that you observed. Also, discuss where teams innovated (e.g. I had a team put post-it labels for each number card, and they had one team member take the role of tester). Ask the teams how they dealt with team members acting out their scenario cards. This points out self-organization of the team and point out that sometimes, it is necessary for teams to make hard decisions surrounding other team members.</p>
<p><strong>Variations:</strong></p>
<ul>
<li>Change requirements (sorting specifications) right after planning (e.g. make King high or change sorting to colors versus suit).</li>
<li>During the last iteration, have two team members per team do a situation card.</li>
</ul>
<p><strong>Resources:</strong></p>
<ul>
<li>Presentation - <a rel="nofollow" target="_blank" href="http://agilemaniac.com/resources/52CardPickupMysteryCards.docx">http://agilemaniac.com/resources/52CardPickupMysteryCards.docx</a></li>
<li>Situation Cards - <a rel="nofollow" target="_blank" href="http://agilemaniac.com/resources/52CardPickupPresentation.pptx">http://agilemaniac.com/resources/52CardPickupPresentation.pptx</a></li>
</ul>
<p>Thanks to Steve Paro for helping make this game really work!</p>]]></content:encoded>
      </item>
      <item>
         <title>Off-shoring debate: Time to rethink</title>
         <link>http://www.ruralsourceit.com/2013/02/13/off-shoring-debate-time-to-rethink/</link>
         <description>The era of off-shoring is over. The data shows that the wage differential between “here” and “there” is no longer as stunning as it once was. Labor costs in China and India, the main outsourcing hubs, have been going up &amp;#8230; &lt;a rel="nofollow" target="_blank" href="http://www.ruralsourceit.com/2013/02/13/off-shoring-debate-time-to-rethink/"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">http://www.ruralsourceit.com/?p=570</guid>
         <pubDate>Wed, 13 Feb 2013 14:52:24 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://www.economist.com/news/special-report/21569572-after-decades-sending-work-across-world-companies-are-rethinking-their-offshoring"><img style="margin:5px;padding:5px;" src="http://media.economist.com/sites/default/files/imagecache/full-width/images/print-edition/20130119_SRC570.png" alt="Outsourcing costs, and intentions" width="360" align="left"/>The era of off-shoring is over. </a></p>
<p>The data shows that the wage differential between “here” and “there” is no longer as stunning as it once was.  Labor costs in China and India, the main outsourcing hubs, have been going up by double-digits amounts every year for the last 15 years, while salaries in the US stayed the same.   Labor in some other countries is still cheap, compared to US costs, but the culture difference is greater, and infrastructure is lacking, making outsourcing projects there even more risky.</p>
<p>In addition, a lot of data (and emotions) have been collected over the last 15 years about off-shored work done badly.  Companies are now armed with data that activities that used to be considered peripheral to the organization’s success, when done badly, can have enormous influence on the bottom line.  A lot of this work is now being brought back in – geographically and culture-wise.</p>
<p><a rel="nofollow" title="IMG_3113 by janya, on Flickr" target="_blank" href="http://www.flickr.com/photos/jprusakova/443215788/"><img style="margin:5px;padding:5px;" src="http://farm1.staticflickr.com/194/443215788_ed6d14a4e4_m.jpg" alt="IMG_3113" width="180" height="240" align="right"/></a></p>
<p>Another problem, that has surfaced with the practice of off-shoring highly-skilled work, concerns intellectual property rights.  US companies are used to strong protections of the law, police willing to investigate, and public, generally familiar with and respectful of IP.  As some organizations have learnt the hard way, IP rights are different, and are not nearly as vigorously enforced outside of the US and the developed world, as expected.  <a rel="nofollow" target="_blank" href="http://www.goodwinprocter.com/~/media/Files/Publications/Attorney%20Articles/2005/Source_Out_Risk_In_Offshoring_Development_Can_Put_Intellectual_Property_at_Risk.ashx">Companies that choose to outsource work involving sensitive or valuable information find themselves largely on their own</a>, when it comes to enforcement, as local law enforcement, even if local laws support foreign company claims, usually chooses not to get too involved in such cases.</p>
<p>All the arguments boil down to one big question: does shipping work across the globe make US companies more or less competitive?   With the data available today, when all costs and benefits are taken into account, the answer appears to be that it is more advantageous to work close to home.</p>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Protect yourself from harmful emails</title>
         <link>http://softwareandotherthings.blogspot.com/2013/02/protect-yourself-from-harmful-emails.html</link>
         <description>&lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/jprusakova/8375649878/" title="P1090319 by janya, on Flickr"&gt;&lt;img alt="P1090319" src="http://farm9.staticflickr.com/8373/8375649878_155976a911_m.jpg" style="margin:10px;padding:10px;" width="180"/&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="MsoNormal"&gt;“Sign up for our email list to get information and announcements.”&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;It seems like every group out there, whether professional, hobby-based, or commercially-organized, communicates by email.&amp;nbsp; They send emails, and expect their messages to be looked at. &amp;nbsp;Or not.&amp;nbsp;&amp;nbsp; The second option is more likely, because there is so much email.&amp;nbsp; An individual message sent out to a subscribers’ list, as opposed to a personal email, is not likely to get much attention when and if it is read, and even less likely to be remembered when needed. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Once emails are – maybe – read, the information needs to be stored away for future reference. There is simply no chance to remember it all. &amp;nbsp;And there comes the pain – how to organize all that data.&amp;nbsp;&amp;nbsp; Events can be added to the calendar, so that they can remind about themselves in due time.&amp;nbsp; Documents can be saved with relevant projects. &amp;nbsp;Purchase receipts and travel arrangements can get sorted into their proper folders.&amp;nbsp; &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;But what to do with ongoing conversations?&amp;nbsp; Questions and answers, discussions, group decision-making? How to keep the thoughts from being lost? &amp;nbsp;&amp;nbsp;It is important to keep track of who said what, when, and why – but it is not practical to re-read everything every time, and there is no easy way to summarize.&amp;nbsp; Being able to search through the emails helps, but requires good memory for keywords, excellent usage of unique-enough keywords, and doesn’t fully solve the problem even if all the conditions are met. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The only way to deal is to use old trusted “divide and conquer” method.&amp;nbsp; Conduct technical conversations on StackOverflow, professional networking on LinkedIn, idle chit-chat and social calendar on Facebook, other special topics on forums and in blog comments. &amp;nbsp;&amp;nbsp;&amp;nbsp;By picking a most conductive location for each conversation it becomes possible to categorize and to frame the discussion, have just the right amount of history, threading, and “search-ability”.&amp;nbsp; It also reduces noise – there is no longer a need to surf through numerous car-buying discussion messages when checking RSVPs for the next house party.&lt;/div&gt;&lt;hr /&gt;&lt;a rel="nofollow" target="_blank" href="http://www.agiledotnet.com/"&gt;Looking for great agile training with industry experts? Hunting questions to help your everyday work? Climbing the agile mountain and stuck? Not to worry, AgileDotNet is coming! &lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear:both;text-align:center;"&gt;&lt;a rel="nofollow" target="_blank" href="http://www.agiledotnet.com/"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-8wgGX5b1Fmw/UP2WyjIjsNI/AAAAAAAAANE/uA7Bp1Sm2Gc/s1600/AgileDotNet2013-logo-web1.gif"/&gt;&lt;/a&gt;&lt;/div&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7086785636466343363.post-5259722043540047858</guid>
         <pubDate>Tue, 12 Feb 2013 14:47:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-8wgGX5b1Fmw/UP2WyjIjsNI/AAAAAAAAANE/uA7Bp1Sm2Gc/s72-c/AgileDotNet2013-logo-web1.gif" width="72" />
      </item>
      <item>
         <title>AgileDotNet 2013</title>
         <link>http://brandonbarber.net/archives/373</link>
         <description>AgileDotNet 2013 – Dallas &amp;#8220;The Ascension&amp;#8221; is here! Improving Enterprises in conjunction with Microsoft will, once again, bring together the world of .NET development with the world of Agile methods for an exciting experience of discovery, learning, and exchange. We have all new tracks and fresh content for you and will also have trendy food [...]</description>
         <author>Brandon</author>
         <guid isPermaLink="false">http://brandonbarber.net/?p=373</guid>
         <pubDate>Wed, 06 Feb 2013 22:42:01 +0000</pubDate>
         <content:encoded><![CDATA[<p>AgileDotNet 2013 – Dallas &#8220;The Ascension&#8221; is here!  Improving Enterprises in conjunction with Microsoft will, once again, bring together the world of .NET development with the world of Agile methods for an exciting experience of discovery, learning, and exchange.</p>
<p>We have all new tracks and fresh content for you and will also have trendy food trucks for lunch to complete the experience!</p>
<p>Don&#8217;t miss this 1-day packed full of fresh Agile and Microsoft technology and tools information. REGISTER NOW! At just $99.00 per person &#8211; which includes breakfast and lunch – it will sell out very fast!</p>
<p>Where:<a rel="nofollow" title="Addison Convention Center"> Addison Convention Center </a></p>
<p>When: Friday, March 1st, 2013</p>
<p>Time: 7:30am – 5:30pm</p>
<p>Register Now: <a rel="nofollow" target="_blank" href=" http://www.agiledotnet.com" title="AgileDotNet 2013">http://www.agiledotnet.com</a></p>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Copycats</title>
         <link>http://tastycupcakes.org/2013/02/copycats-2/</link>
         <description>As somebody in the team described it, “it’s like Chinese whispers, but with pictures”. The inspiration for this game came from a children&amp;#8217;s TV game show called copycats. Timing: A team of 5 people with two rounds and a intro and debrief for each round took 20 minutes in total. Materials:  A team of 5+ [...]</description>
         <author>Andy Hiles</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2725</guid>
         <pubDate>Wed, 06 Feb 2013 09:50:35 +0000</pubDate>
         <content:encoded><![CDATA[<p>As somebody in the team described it, “it’s like Chinese whispers, but with pictures”. The inspiration for this game came from a children&#8217;s TV game show called copycats.</p>
<p><strong>Timing</strong>:</p>
<p>A team of 5 people with two rounds and a intro and debrief for each round took 20 minutes in total.</p>
<p><strong>Materials: </strong></p>
<p>A team of 5+ people, if larger could be split into two teams.</p>
<p>A way of timing, phone with stopwatch etc.</p>
<p>Post-its and pens.</p>
<p>Whiteboard or Flip chart + pens.</p>
<p><strong>Instructions:</strong></p>
<p>The concept of the game is for the team to communicate a picture through each member of the team and ending up with the last person drawing the same picture on the white board at the end. As somebody in the team described it, “it’s like Chinese whispers, but with pictures”.</p>
<p>The rules:</p>
<p>Each person only has 2 seconds to look at the picture.</p>
<p>Each person has only 15 seconds to draw their picture.</p>
<p>No talking until the end.</p>
<p>The team need to shield their post-its drawings from the others while the game is in progress.</p>
<p>The Flow:</p>
<p>It starts with a Product Owner (the facilitator in this case) describing to one of the team what he wants them to draw, this can be verbally outside the room or already written on a card/post-it. The next person then has 2 seconds to look at the drawing and has 15 seconds to draw the object and then show it to the next person&#8230; and so on. The final person in the team can use the whiteboard and draw the last picture in front of the whole team. Starting with the last person the PO then goes through the team asking in turn to guess what they thought the picture was meant to be. The team then scores 1 point for each person who guesses the answer correctly. (for example if by going back through the team the 3<sup>rd</sup> person in the chain guesses correctly then they earn 3 points)</p>
<p>The running:</p>
<p>Arrange the team around the table and give them each some post-its and pens. Describe the concept of the game and the flow, then ask for a volunteer to start or which way round the table the team would like to go.</p>
<p>Get the stop watch ready.</p>
<p>At this point it is best to have some objects/things already written on cards for the team to draw (real world items are best: lighthouse, car, umbrella, bottle etc.)</p>
<p>Start the timer and show the first person the name of the object. Then keep the timings and instruct the team when to move on. At the end encourage the last person to standup and draw their picture for the team. Then proceed through the team asking them to guess of the picture, and ask what the team were thinking during the game, what were the challenges etc. Facilitate.</p>
<p><strong>Learning Points:</strong> Discussion and facilitation guidance</p>
<p>There are several themes going on here, the communication of visual concepts, the rush and timings, the lack of negotiation and requirements clarity.</p>
<p>The most enlightening moment was when asked in the second round why they nearly all got the same drawing, one of the team said “it was because I consciously didn’t add to the drawing”. Meaning they didn’t solutionise, add to, or draw what they think it ought to be they merely copied the previous drawing. This for me captured the relevance to software development where requirements are misinterpreted and then expanded by the developers without the communication loop from “doing the right thing” to “doing the thing right”.</p>
<p>The first one started off as a bottle, the second a banana <img src='http://tastycupcakes.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley'/> </p>
<p><img class="alignnone size-medium wp-image-2713" src="http://tastycupcakes.org/wp-content/uploads/2013/02/IMG_0279-225x300.jpg" alt="" width="225" height="300"/></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
      </item>
      <item>
         <title>AgileDotNet and the ALM Workshop are coming to Dallas March 1 &amp; 2</title>
         <link>http://tmgirvin.com/2013/02/05/agiledotnet-and-the-alm-workshop-are-coming-to-dallas-march-1st-2nd/</link>
         <description>Looking for great agile training with industry experts? Hunting questions to help your everyday work? Climbing the agile mountain and stuck? Not to worry, AgileDotNet is coming to Dallas on March 1st, 2013! AgileDotNet unites the worlds of .NET development and Agile methods, delivered by agilists passionate about providing superior content in unique settings. This [...]&lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tmgirvin.com&amp;#038;blog=14416035&amp;#038;post=78&amp;#038;subd=tmgirvin&amp;#038;ref=&amp;#038;feed=1" width="1" height="1"/&gt;</description>
         <author>tmgirvin</author>
         <guid isPermaLink="false">https://tmgirvin.wordpress.com/?p=78</guid>
         <pubDate>Tue, 05 Feb 2013 19:18:35 +0000</pubDate>
         <content:encoded><![CDATA[<p>Looking for great agile training with industry experts? Hunting questions to help your everyday work? Climbing the agile mountain and stuck? Not to worry, AgileDotNet is coming to Dallas on <strong>March 1st, 2013</strong>!</p>
<p><a rel="nofollow" target="_blank" href="http://www.agiledotnet.com/dallas-2013/"><img style="float:none;margin-left:auto;display:block;margin-right:auto;" alt="AgileDotNet Dallas 2013" src="http://www.agiledotnet.com/wp-content/themes/AgileDotNet/images/2013/logo-dallas-2013.png"/></a></p>
<p>AgileDotNet unites the worlds of .NET development and Agile methods, delivered by agilists passionate about providing superior content in unique settings.</p>
<p>This will be the fourth year of AgileDotNet, and the content will rock you! AgileDotNet brings developers, QA, scrum masters, project managers, and business leaders with all levels of experience to empowering and unique sessions across four tracks. You’ll return to work with the tools, motivation, and support to be more agile – as an individual and as part of a team.</p>
<p>#ADN13 is different from those past. Despite maintaining a high bar for great workshops and discussions, we realized there was a common theme among many of the most steadfast agile coaches and leaders trying to bring change within their enterprise.  The organizations are difficult to change.  Budgets, risks, unfamiliar territory, and planning are all excuses that point to one thing. <em>The enterprise has trust issues</em>.</p>
<p>At #ADN13, we will break the trust barrier down. With a wrecking ball. You will learn from passionate field-tested agilists how to establish trust amongst the team, with management, and throughout the organization as a whole. Regardless of the role you play.</p>
<p>And as if the conference is not cool enough already with <strong>agile experts, Scrum experts, and</strong> <strong>FOOD TRUCKS</strong>! Improving decided to up the game another notch. After the conference on Friday, there is a Saturday March 2nd workshop at the Improving Offices. This is just crazy!</p>
<p>What? You haven’t registered? Quick, jump over to the registration site, and</p>
<p align="center"><span style="font-size:x-large;"><a rel="nofollow" target="_blank" href="http://agiledotnetdallas2013.eventbrite.com/#">Register Now!</a></span></p>
<p align="center">
<p>Improving Enterprises is pleased to offer an <em>Agile ALM with Microsoft Team Foundation Server Workshop</em>. In this hands-on, mentored workshop, we will dive into how Visual Studio supports the <i>Development process, the Quality Assurance process, and the Project Management process</i>. We will have a full TFS environment, interactive labs, and instructors on hand for questions.</p>
<p><img alt="" src="https://public.bay.livefilestore.com/y1px_h-qpnmg9DqgOCAsR1ec5ayTg-WBHZPuO5C6_ugiBBAfvie9JJ8sgA2Zefx34YfQ_8Hbc4AxdULuzeKFl6u0A/image2.png?psid=1"/></p>
<p>We will be breaking the day into the three segments.  Each section will include a free form section to bring your problems to the ALM Team at Improving and get some much needed answers.</p>
<ul>
<li><i><strong>Development Lifecycle Management</strong></i> is all about getting a streamlined routine that doesn’t hinder velocity and contributes to quality code. We will guide through developing, developer-testing, and deploying an application.</li>
<li><i><strong>Agile Project Management</strong></i> can be quite challenging, and managing multiple projects even more so. We will dive into how to set and measure effective KPIs, automate reporting, and manage work items in an effective, logical, and visible way.</li>
<li><i><strong>Quality Assurance Management</strong></i> is encapsulated in an agile environment able to effectively and quickly report on the status of the product. We will walk through defining test cases, writing test steps, recording automation, and enabling regression testing.</li>
</ul>
<ul>
<ul>Join us on</ul>
</ul>
<p><em><strong>March 2<sup>nd</sup></strong></em></p>
<ul>and discover best practices around Agile ALM using Microsoft® Visual Studio and TFS. And don&#8217;t forget to bring your real-world problems for our on-site mentors!</ul>
<p>Hope to see you there!</p>
<p align="center"><span style="font-size:x-large;"><a rel="nofollow" target="_blank" href="http://agiledotnetdallas2013.eventbrite.com/#">Register Now!</a></span></p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/tmgirvin.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tmgirvin.wordpress.com/78/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tmgirvin.com&#038;blog=14416035&#038;post=78&#038;subd=tmgirvin&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://0.gravatar.com/avatar/f6f9794f022869f90db72ef2dc6ee0cc?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">tmgirvin</media:title>
         </media:content>
         <media:content medium="image" url="http://www.agiledotnet.com/wp-content/themes/AgileDotNet/images/2013/logo-dallas-2013.png">
            <media:title type="html">AgileDotNet Dallas 2013</media:title>
         </media:content>
         <media:content medium="image" url="https://public.bay.livefilestore.com/y1px_h-qpnmg9DqgOCAsR1ec5ayTg-WBHZPuO5C6_ugiBBAfvie9JJ8sgA2Zefx34YfQ_8Hbc4AxdULuzeKFl6u0A/image2.png?psid=1" />
      </item>
      <item>
         <title>The Herculean Doughnut</title>
         <link>http://tastycupcakes.org/2013/02/the-herculean-doughnut/</link>
         <description>This is a game I created, which was then used and refined by me and my colleague Laurie Young to help gauge how well everyone involved in a project understand their responsibilites to the project and each other. It lends insight in to the pre-conceptions that people have about how projects should be run, which [...]</description>
         <author>Sam Whiting</author>
         <guid isPermaLink="false">http://tastycupcakes.org/?p=2706</guid>
         <pubDate>Tue, 05 Feb 2013 17:05:29 +0000</pubDate>
         <content:encoded><![CDATA[<p>This is a game I created, which was then used and refined by me and my colleague Laurie Young to help gauge how well everyone involved in a project understand their responsibilites to the project and each other. It lends insight in to the pre-conceptions that people have about how projects should be run, which helps you tackle potential problems early.</p>
<p>It has really helped projects get off to a good start and its good to revisit later on to see how peoples understanding have changed.</p>
<p><strong>Timings:</strong>  1hour &#8211; 1hour 30mins</p>
<p><strong>Materials:</strong> The Team, White Board, Pre-written out index cards, Blank index cards, Pen, some method of sticking cards up (magnets, bluetac etc)</p>
<p><strong>Instructions: </strong>Draw a big circle on the whiteboard, inside that draw a smaller but reasonably sized circle in the middle. You should now have something that resembles a ring doughnut. Now draw three equidistant lines from the outer circle to the inner circle as if you are going to divide said doughnut equally between three people.</p>
<p>In the very centre of the doughnut write &#8220;Everybody&#8221; and then put one of the following in each section of the doughnut: Product Owner (PO), Development Team (DT) and Scrum Master (SM). Finally on somewhere outside the doughnut write &#8220;no one&#8221;.</p>
<p>Now on the index cards write roles and responsibilities with in the Scrum Framework. These are some of the things I have written down in the past, but its certainly not the exhaustive list:</p>
<ul>
<li>Scope</li>
<li>Cancelling a Sprint</li>
<li>Changing the Product Scope</li>
<li>Conveying The Product Vision</li>
<li>Prioritises Product Backlog</li>
<li>Prioritises Sprint Backlog</li>
<li>Writes User Stories</li>
<li>Facilitates Meetings</li>
<li>Facilitates Retrospectives</li>
<li>Builds the Product Backlog</li>
<li>Commits to a Sprint Backlog</li>
<li>Remove Impediments</li>
<li>Motivates the team</li>
<li>Protects the team from outside distraction</li>
<li>Chooses the Amount of Work in a Sprint</li>
<li>Commits to Completing the Sprint</li>
<li>Inspects and Adapts to Improve their Performance</li>
<li>Manages the Team</li>
<li>Points Out Other People&#8217;s Mistakes</li>
<li>Makes Sure the Product Works</li>
<li>Accepts a Story as Ready</li>
<li>Recognises Impediments</li>
<li>Accepts a Story as &#8216;Done Done&#8217;</li>
<li>Ensures Something Useful is Built by Launch Date</li>
<li>Represents the Business/Customers</li>
<li>Keeps Stakeholders Informed</li>
</ul>
<p>Now get everyone in the team to arrange the cards on the board. If a responsibility is for one section of the team it lives in its specific area of the doughnut. If two groups share it, it goes on the dividing line between them and &#8220;everyone&#8221; and &#8220;no one&#8221; are self-explanatory.</p>
<p>The way that has worked best for me is tackling each card at a time, talking about it and trying to reach a consensus on where the card belongs, but you can equally get all the cards up there and start pulling them off. I find that can get confusing though.</p>
<p><strong>Variations:</strong> This can be used for developing broad understanding of Scrum, but also for specific areas that we may be misunderstanding i.e what are our responsibilities for testing?. I also find that asking: &#8220;Where do you think this card goes?&#8221; reaps different result to asking the question: &#8220;Where do you want the card to go?&#8221; so I am sure there are other clever questions that can be asked while playing this.</p>
<p><strong>Learnings:</strong></p>
<ul>
<li>This is a very good game for setting the expectations within the team and avoiding conflict due to misunderstandings.</li>
<li>It establishes a level of good communication throughout the team.</li>
<li>Creates a very focused discussion on what things should be happening on the project overall.</li>
<li>Can create commitments from everyone early on.</li>
<li>Helps expose misunderstands that have grown over time.</li>
<li>Reinforces the idea of the whole team being the committed people on the project (if you are bored of pigs and chickens).</li>
<li>It helps highlight responsibilities that no one has taken on or thought about.</li>
</ul>]]></content:encoded>
      </item>
      <item>
         <title>Finding the value</title>
         <link>http://softwareandotherthings.blogspot.com/2013/01/finding-value.html</link>
         <description>&lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/jprusakova/3948695783/" title="P1000138 by janya, on Flickr"&gt;&lt;img alt="P1000138" height="240" src="http://farm3.staticflickr.com/2627/3948695783_beb50e1155_m.jpg" style="margin:5px;padding:5px;" width="180"/&gt;&lt;/a&gt;&lt;/center&gt;What is the most valuable goal of &amp;nbsp;a project? &amp;nbsp;A software project is usually about getting the users features that they will enjoy and that will make them more productive, getting it out on time, and making it work well. &amp;nbsp;But what is more important:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;making users happy&lt;/li&gt;&lt;li&gt;getting more users to use the application (but not necessarily elated)&lt;/li&gt;&lt;li&gt;hitting the deadline&lt;/li&gt;&lt;li&gt;never making a mistake&lt;/li&gt;&lt;li&gt;being able to trace and correct every single mistake on the back end&lt;/li&gt;&lt;li&gt;... lots of other choices?&lt;/li&gt;&lt;/ul&gt;"All of the above" is never a good answer, because time and expertise are limited resources. &lt;br /&gt;&lt;br /&gt;Sometimes an organization will have a clear preference, based on its overall culture and nature of the project. &amp;nbsp;For example, some systems are deadline-driven, such as software that supports Mother's day or Christmas sales season,&amp;nbsp;&lt;a rel="nofollow" target="_blank" href="http://softwareandotherthings.blogspot.com/2012/11/success-of-narwhal.html"&gt;systems used in elections&lt;/a&gt;, tax-preparation applications. &amp;nbsp;In others, being able to trace and correct an error is essential, for example, in software dealing with money.&lt;br /&gt;&lt;br /&gt;However, in a lot of cases the project owner faces a choice, and being aware and deliberate in making that choice can make or break a project. &lt;br /&gt;&lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/jprusakova/3948693307/" title="P1000110 by janya, on Flickr"&gt;&lt;img alt="P1000110" height="180" src="http://farm4.staticflickr.com/3445/3948693307_4ddda2d063_m.jpg" style="margin:5px;padding:5px;" width="240"/&gt;&lt;/a&gt;&lt;/center&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7086785636466343363.post-7870500395787713904</guid>
         <pubDate>Tue, 29 Jan 2013 17:52:00 +0000</pubDate>
      </item>
      <item>
         <title>Using the Quicktate RESTful API</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/8rC-sNNGG4Q/</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.quicktate.com/"&gt;Quicktate&lt;/a&gt; is a service for which I&amp;#8217;ve been consulting for since 2009. We have recently released a new &lt;a rel="nofollow" target="_blank" href="https://api.quicktate.com"&gt;RESTful API&lt;/a&gt; to help make integrating with the service a &lt;em&gt;breeze&lt;/em&gt;. That said, while our new &lt;a rel="nofollow" target="_blank" href="https://api.quicktate.com/v1/api/index.html"&gt;RESTful API documentation&lt;/a&gt; uses &lt;a rel="nofollow" target="_blank" href="http://developers.helloreverb.com/swagger/"&gt;Swagger&lt;/a&gt; to generate our service documentation, many of the common RESTful semantics we rely on are completely missing from that documentation. Until we figure out an easier way to convey that information via Swagger, here&amp;#8217;s some basic information on how to get around the API.&lt;/p&gt;




&lt;h2&gt;Authentication&lt;/h2&gt;

&lt;p&gt;All requests currently are performed using HTTP Basic authentication. While we are still developing our OAuth provider and intend to use that as our primary mechanism for authenticating users, we currently are accepting your username and password via a standard HTTP Basic Authorization request. As a raw HTTP header, you are looking at the following for authenticating as &lt;code&gt;demo@quicktate.com&lt;/code&gt; with password &lt;code&gt;Test1234%&lt;/code&gt;:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;Authorization: Basic ZGVtb0BxdWlja3RhdGUuY29tOlRlc3QxMjM0JQ==&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;As a cUrl request, you&amp;#8217;ll be looking at using the &lt;code&gt;-u demo@quicktate.com:Test1234%&lt;/code&gt; argument to the command.&lt;/p&gt;

&lt;h2&gt;Transcription Requests&lt;/h2&gt;

&lt;p&gt;The basis of Quicktate is transcriptions. However, while there is a &lt;code&gt;/transcription&lt;/code&gt; resource for our API, you don&amp;#8217;t actually create transcriptions - that&amp;#8217;s the job of our typists. Instead, you submit a &lt;code&gt;/transcriptionrequest&lt;/code&gt; to Quicktate and operate on that request until a typist has completed transcribing and turns it into a &lt;code&gt;/transcription&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, we expect very little in the HTTP headers for this type of request. Because you&amp;#8217;re creating a new Transcription request, the method will be &lt;code&gt;POST&lt;/code&gt;. What&amp;#8217;s most important is the body of the request. Most developers are used to submitting the request as a form request, to where in a PHP application, the variables will come across in &lt;code&gt;$_POST&lt;/code&gt;. In this case, however, we expect the body of the message to be either XML or JSON (as indicated in the &lt;code&gt;Content-Type&lt;/code&gt; header).&lt;/p&gt;

&lt;p&gt;What should be in the body of the message? The transcription request. When creating a transcription request for the first time, you&amp;#8217;ll need to supply us with the following information:&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="1" border="1"&gt;
&lt;tr&gt;&lt;td&gt;Field Name&lt;/td&gt;&lt;td&gt;Required?&lt;/td&gt;&lt;td&gt;Description&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;callbackDestination&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;The URL or e-mail address where a callback should occur upon completion of the transcription.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&amp;#8220;callbackMethod&amp;#8220;&lt;/td&gt;&lt;td&gt;No *&lt;/td&gt;&lt;td&gt;The way the callbackDestination should be invoked. This is mandatory if callbackDestination is specified. Valid values include: &amp;#8220;HTTPPOST&amp;#8220;, &amp;#8220;RESTPOST&amp;#8220;, &amp;#8220;XMLRPC&amp;#8220;, &amp;#8220;EMAIL&amp;#8220;.
&lt;tr&gt;&lt;td&gt;&amp;#8220;metadata&amp;#8220;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Your custom metadata for this transcription request. This is sent back to you in the callback so that you have data you can trace back to some internal identifier or record.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&amp;#8220;language&amp;#8220;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Pretty self-explainatory. Valid values are: 1 = English, 2 = Spanish. Others on the way!&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&amp;#8220;audiourl&amp;#8220;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;The URL of the audio file you wish to be downloaded and transcribed. Must be accessible from the internet. This is required if no &amp;#8220;audiodata&amp;#8220; is present.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&amp;#8220;audiodata&amp;#8220;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;A Base 64 encoded block of the audio file to be transcribed. This is required if no &amp;#8220;audiourl&amp;#8220; is present.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;So, a sample HTTP request might look like the following:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;POST /v1/api/transcriptionrequest HTTP/1.1
&lt;/span&gt;&lt;span class='line'&gt;Authorization: Basic ZGVtb0BxdWlja3RhdGUuY29tOlRlc3QxMjM0JQ==
&lt;/span&gt;&lt;span class='line'&gt;User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
&lt;/span&gt;&lt;span class='line'&gt;Host: api.quicktate.com
&lt;/span&gt;&lt;span class='line'&gt;Accept: application/json
&lt;/span&gt;&lt;span class='line'&gt;Content-Type: application/json
&lt;/span&gt;&lt;span class='line'&gt;Content-Length: 208
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;{ 
&lt;/span&gt;&lt;span class='line'&gt;  "callbackDestination": "https://private.host.callback.com/callback-url.php",
&lt;/span&gt;&lt;span class='line'&gt;  "callbackMethod": "HTTPPOST",
&lt;/span&gt;&lt;span class='line'&gt;  "metadata": "My custom metadata",
&lt;/span&gt;&lt;span class='line'&gt;  "language": 1,
&lt;/span&gt;&lt;span class='line'&gt;  "audiourl": "http://www.quicktate.com/audio.wav"
&lt;/span&gt;&lt;span class='line'&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;or from cUrl it would look like the following:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;curl -u demo@quicktate.com:Test1234% -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{ "callbackDestination": "https://private.host.callback.com/callback-url.php", "callbackMethod": "HTTPPOST", "metadata": "My custom metadata", "language": 1, "audiourl": "http://www.quicktate.com/audio.wav" }' -v https://api.quicktate.com/v1/api/transcriptionrequest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;The response I&amp;#8217;m likely to receive back will look like the following:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;HTTP/1.1 201 Created
&lt;/span&gt;&lt;span class='line'&gt;Server: nginx
&lt;/span&gt;&lt;span class='line'&gt;Date: Mon, 28 Jan 2013 06:14:43 GMT
&lt;/span&gt;&lt;span class='line'&gt;Content-Type: application/json
&lt;/span&gt;&lt;span class='line'&gt;Transfer-Encoding: chunked
&lt;/span&gt;&lt;span class='line'&gt;Connection: keep-alive
&lt;/span&gt;&lt;span class='line'&gt;X-Powered-By: PHP/5.3.17-1~dotdeb.0
&lt;/span&gt;&lt;span class='line'&gt;Vary: Accept
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Max-Age: 86400
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Origin: *
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Credentials: true
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Headers: Authorization, X-Authorization, Origin, Accept, Content-Type, X-Requested-With, X-HTTP-Method-Override
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Methods: GET, POST, PUT, DELETE, HEAD, OPTIONS
&lt;/span&gt;&lt;span class='line'&gt;Location: /v1/api/transcriptionrequest/14967237&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;What&amp;#8217;s important to realize is that you will only have a successful request submitted when the status code returned is a 201. If you get a 400-level error message, check which one. If it&amp;#8217;s a 401 or a 403, then you are not sending the proper credentials. If it&amp;#8217;s just a 400 error, then you need to look at how you&amp;#8217;re sending your data to the API, because the API doesn&amp;#8217;t recognize the payload.&lt;/p&gt;

&lt;p&gt;Once you&amp;#8217;ve gotten past that, you may be wondering, how do I access the transcription request now? There is &lt;strong&gt;no&lt;/strong&gt; body to this whatsoever. This is one of those REST semantics at play. If you look in the return headers, there is a &lt;code&gt;Location&lt;/code&gt; header which specifies exactly where you can access your &lt;code&gt;transcriptionRequest&lt;/code&gt;. Simply submit a &lt;code&gt;GET&lt;/code&gt; request to that URL and you&amp;#8217;ll find the status of your transcriptionRequest. The response will look something similar to the following:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;HTTP/1.1 200 Success
&lt;/span&gt;&lt;span class='line'&gt;Server: nginx
&lt;/span&gt;&lt;span class='line'&gt;Date: Mon, 28 Jan 2013 06:14:43 GMT
&lt;/span&gt;&lt;span class='line'&gt;Content-Type: application/json
&lt;/span&gt;&lt;span class='line'&gt;Transfer-Encoding: chunked
&lt;/span&gt;&lt;span class='line'&gt;Connection: keep-alive
&lt;/span&gt;&lt;span class='line'&gt;X-Powered-By: PHP/5.3.17-1~dotdeb.0
&lt;/span&gt;&lt;span class='line'&gt;Vary: Accept
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Max-Age: 86400
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Origin: *
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Credentials: true
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Headers: Authorization, X-Authorization, Origin, Accept, Content-Type, X-Requested-With, X-HTTP-Method-Override
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Methods: GET, POST, PUT, DELETE, HEAD, OPTIONS
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;{
&lt;/span&gt;&lt;span class='line'&gt;  "id": 14967237,
&lt;/span&gt;&lt;span class='line'&gt;  "callbackDestination": "https://private.host.callback.com/callback-url.php",
&lt;/span&gt;&lt;span class='line'&gt;  "callbackMethod": "",
&lt;/span&gt;&lt;span class='line'&gt;  "status": 0,
&lt;/span&gt;&lt;span class='line'&gt;  "metadata": "Represents an unprocessed audio file. ",
&lt;/span&gt;&lt;span class='line'&gt;  "datePosted": "2012-12-01T01:23:45-0600",
&lt;/span&gt;&lt;span class='line'&gt;  "language": 99,
&lt;/span&gt;&lt;span class='line'&gt;  "audiodata": null,
&lt;/span&gt;&lt;span class='line'&gt;  "audiourl": null
&lt;/span&gt;&lt;span class='line'&gt;},&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h2&gt;Completed Transcriptions&lt;/h2&gt;

&lt;p&gt;That is, until your transcription is complete. Once your transcription is complete, the resource URL will permanently move. As a result, you&amp;#8217;ll see the status code for the previous URL change from 200 to 302, indicating that it&amp;#8217;s been permanently moved. Fortunately, we point you in the direction of where you need to go again, through the &lt;code&gt;Location&lt;/code&gt; header:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;HTTP/1.1 302 Moved
&lt;/span&gt;&lt;span class='line'&gt;Server: nginx
&lt;/span&gt;&lt;span class='line'&gt;Date: Mon, 28 Jan 2013 06:14:43 GMT
&lt;/span&gt;&lt;span class='line'&gt;Content-Type: application/json
&lt;/span&gt;&lt;span class='line'&gt;Transfer-Encoding: chunked
&lt;/span&gt;&lt;span class='line'&gt;Connection: keep-alive
&lt;/span&gt;&lt;span class='line'&gt;X-Powered-By: PHP/5.3.17-1~dotdeb.0
&lt;/span&gt;&lt;span class='line'&gt;Vary: Accept
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Max-Age: 86400
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Origin: *
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Credentials: true
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Headers: Authorization, X-Authorization, Origin, Accept, Content-Type, X-Requested-With, X-HTTP-Method-Override
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Methods: GET, POST, PUT, DELETE, HEAD, OPTIONS
&lt;/span&gt;&lt;span class='line'&gt;Location: /v1/api/transcription/14967237&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;When you submit a &lt;code&gt;GET&lt;/code&gt; request to the &lt;code&gt;Location&lt;/code&gt; URL listed above, your payload will look like the following:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;HTTP/1.1 200 Success
&lt;/span&gt;&lt;span class='line'&gt;Server: nginx
&lt;/span&gt;&lt;span class='line'&gt;Date: Mon, 28 Jan 2013 06:14:43 GMT
&lt;/span&gt;&lt;span class='line'&gt;Content-Type: application/json
&lt;/span&gt;&lt;span class='line'&gt;Transfer-Encoding: chunked
&lt;/span&gt;&lt;span class='line'&gt;Connection: keep-alive
&lt;/span&gt;&lt;span class='line'&gt;X-Powered-By: PHP/5.3.17-1~dotdeb.0
&lt;/span&gt;&lt;span class='line'&gt;Vary: Accept
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Max-Age: 86400
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Origin: *
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Credentials: true
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Headers: Authorization, X-Authorization, Origin, Accept, Content-Type, X-Requested-With, X-HTTP-Method-Override
&lt;/span&gt;&lt;span class='line'&gt;Access-Control-Allow-Methods: GET, POST, PUT, DELETE, HEAD, OPTIONS
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;{
&lt;/span&gt;&lt;span class='line'&gt;  "id": 14967243,
&lt;/span&gt;&lt;span class='line'&gt;  "metadata": "Represents a processed audio file. ",
&lt;/span&gt;&lt;span class='line'&gt;  "datePosted": "2012-12-01T01:23:45-0600",
&lt;/span&gt;&lt;span class='line'&gt;  "dateCompleted": "2012-12-01T01:25:30-0600",
&lt;/span&gt;&lt;span class='line'&gt;  "wordcount": null,
&lt;/span&gt;&lt;span class='line'&gt;  "language": 99,
&lt;/span&gt;&lt;span class='line'&gt;  "transcription": "This is a completed transcription request."
&lt;/span&gt;&lt;span class='line'&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h2&gt;More to Come&lt;/h2&gt;

&lt;p&gt;Hopefully by next week, I&amp;#8217;ll have another writeup on how to interact with your transcription requests before we begin processing them.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/01/28/using-the-quicktate-restful-api/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/8rC-sNNGG4Q" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/01/28/using-the-quicktate-restful-api</guid>
         <pubDate>Mon, 28 Jan 2013 06:17:00 +0000</pubDate>
      </item>
      <item>
         <title>Agile steps</title>
         <link>http://softwareandotherthings.blogspot.com/2013/01/agile-steps.html</link>
         <description>&lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/jprusakova/8230857153/" title="P1090143 by janya, on Flickr"&gt;&lt;img alt="P1090143" src="http://farm9.staticflickr.com/8340/8230857153_5b53592010_n.jpg" style="margin:10px;padding:10px;" width="320"/&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="MsoNormal"&gt;The teacher looked a bit glamorous and very assured of himself.&amp;nbsp;&amp;nbsp; “The most important thing is steps.&amp;nbsp; We do a step forward, a step sideways, a step backward, and another sideways.”&amp;nbsp;&amp;nbsp; The class tried, lots of stepping on other people’s feet ensued.&amp;nbsp; A few students missed the first bit, and found themselves off by a step, confusing their neighbors. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;A brave soul raised his hand and asked out loud: “What if people next to me are doing something else?” The teacher responded with authority: “They will know to do these steps.”&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;A lot of Agile learning takes their students through similar ordeal.&amp;nbsp; Steps are shown, expectations are announced, and students are told that the rest of the world will just fall in line.&amp;nbsp; With that people are sent out to their regular workplaces and teams to create beautiful new work successes with Agile.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;Class discussion is often framed differently than in the real world, and there is a lot of pressure to agree with the teacher and with the other students. &amp;nbsp;Make no mistake, a group of professionals taking an Agile training does not represent a regular workplace crowd, a typical organization, or a normal project team. Students participating in an Agile class are different in that they all agreed to learn Agile, are curious and open-minded enough to consider a different work philosophy and methodology, and are willing to challenge themselves with training. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;When the class is over, and everybody goes back to work, the students will need something other than just Agile steps or procedures to guide their every day work. If the organization is serious about switching to Agile and getting the benefits of the new approach, everybody needs to get the underlying philosophy, the ways to get into the rhythm and on the right step.&amp;nbsp; The team needs to be able to stay in&amp;nbsp;sync,&amp;nbsp; while realizing that someone will inevitably drop the ball and require help. &amp;nbsp;When going through training in Agile, practitioners must learn to realize when they’re off beat, when other people are off, and how help the team to all follow the rhythm.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Steps are necessary, but they are simple and easy to do. Agile training should be about being and doing Agile in the real world, where someone will always be off-beat, and not know the steps. &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;hr /&gt;&lt;a rel="nofollow" target="_blank" href="http://www.agiledotnet.com/"&gt;Registration for AgileDotNet 2013 in Dallas, TX is open now - the most advanced discussion on Agile and technology in the real world.&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear:both;text-align:center;"&gt;&lt;a rel="nofollow" target="_blank" href="http://www.agiledotnet.com/"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-8wgGX5b1Fmw/UP2WyjIjsNI/AAAAAAAAANE/uA7Bp1Sm2Gc/s1600/AgileDotNet2013-logo-web1.gif"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;center&gt;&lt;br /&gt;&lt;/center&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7086785636466343363.post-2637028508711379382</guid>
         <pubDate>Tue, 15 Jan 2013 17:30:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-8wgGX5b1Fmw/UP2WyjIjsNI/AAAAAAAAANE/uA7Bp1Sm2Gc/s72-c/AgileDotNet2013-logo-web1.gif" width="72" />
      </item>
      <item>
         <title>SqlFileStream Access is Denied</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/Q431QV0c4Pw/</link>
         <description>&lt;p&gt;I started playing around with SQL filestreams yesterday. We have a need to store large binary objects both quickly and efficiently from SharePoint in our SQL database for regulatory purposes. I found a great &lt;a rel="nofollow" target="_blank" href="http://www.codeproject.com/Articles/32216/How-to-store-and-fetch-binary-data-into-a-file-str"&gt;article on Code Project&lt;/a&gt; on how to actually store binary data in a filestream column. However, as I ran the code, I encountered a &lt;code&gt;Win32Exception&lt;/code&gt; with the message &amp;#8220;Access is denied.&amp;#8221;.&lt;/p&gt;

&lt;p&gt;I double (and triple) checked that the permissions for the account executing the code were correct. Since we&amp;#8217;re using SharePoint, we are using only Windows authentication. Furthermore, I made sure that our connection string was using Integrated Security:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;Server=sqlserver01;Database=Journaling;Integrated Security=true;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Ultimately, it came down to the fact that the SQL Server was not setup to allow remote server connections to filestream. I managed to fix this by following the &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/cc645923.aspx"&gt;Enable and Configure FILESTREAM&lt;/a&gt; article on MSDN. The &lt;em&gt;Allow remote clients to have streaming access to FILESTREAM data.&lt;/em&gt; box was not checked, thus causing my problems.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/01/08/sqlfilestream-access-is-denied/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/Q431QV0c4Pw" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/01/08/sqlfilestream-access-is-denied</guid>
         <pubDate>Tue, 08 Jan 2013 19:16:00 +0000</pubDate>
      </item>
      <item>
         <title>JOpt Simple 4.4 released</title>
         <link>http://cleveralias.blogs.com/thought_spearmints/2013/01/jopt-simple-44-released.html</link>
         <description>JOpt Simple is my Java library for parsing command line options. You can find the changes in this latest release here. This release incorporates a number of smaller features and bug fixes, many of which were originated by users. Happy...</description>
         <author>Pholser</author>
         <guid isPermaLink="false">http://cleveralias.blogs.com/thought_spearmints/2013/01/jopt-simple-44-released.html</guid>
         <pubDate>Tue, 08 Jan 2013 03:17:56 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://pholser.github.com/jopt-simple">JOpt Simple</a> is my Java library for parsing command line options. You can find the changes in this latest release <a rel="nofollow" target="_blank" href="http://pholser.github.com/jopt-simple/changes.html">here</a>.</p>

<p>This release incorporates a number of smaller features and bug fixes, many of which were originated by users.</p>

<p>Happy parsing!</p>]]></content:encoded>
      </item>
      <item>
         <title>PHP preg_match Maximum Length</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/MLvY2Gwlwj8/</link>
         <description>&lt;p&gt;Last weekend and this weekend I spent a good deal of time trying to track down a PHP error I was having in my customer&amp;#8217;s production environment. This wasn&amp;#8217;t an exception being thrown by PHP, but rather, I couldn&amp;#8217;t readily identify if it was a PHP error or not, because different parts of our infrastructure were throwing different errors during the request.&lt;/p&gt;




&lt;p&gt;The problem was first noticed by an early adopter of the new RESTful API we released a month ago. He kept receiving an HTTP error code 400 with the following message:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;{
&lt;/span&gt;&lt;span class='line'&gt;    "message": "Invalid Payload Format"
&lt;/span&gt;&lt;span class='line'&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;When I dug into this, I found this error was coming from the &lt;a rel="nofollow" target="_blank" href="https://github.com/codeinchaos/restful-zend-framework"&gt;RESTful Zend Framework component&lt;/a&gt; I was using to develop our RESTful web service. However, when I looked at the customer&amp;#8217;s request payload, it looked fine (the &lt;code&gt;audiodata&lt;/code&gt; parameter was about 60k in size, properly Base64 encoded):&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;{
&lt;/span&gt;&lt;span class='line'&gt;  "callbackDestination": "chris@chrisweldon",
&lt;/span&gt;&lt;span class='line'&gt;  "callbackMethod": "EMAIL",
&lt;/span&gt;&lt;span class='line'&gt;  "language": 1,
&lt;/span&gt;&lt;span class='line'&gt;  "audiodata": "gEUS9gckvq37RG4J7LYg12YdZAwVJCB053EiDJp9iNLDr6vGyOWvFDzyPwqVoS6UVO+ ... etc"
&lt;/span&gt;&lt;span class='line'&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;However, when I started digging in and debugging this issue, I saw that about half the web requests being sent to my php-fpm backend were malformed. The payload looked like this:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;{
&lt;/span&gt;&lt;span class='line'&gt;  "callbackDestination": "chris@chrisweldon",
&lt;/span&gt;&lt;span class='line'&gt;  "callbackMethod": "EMAIL",
&lt;/span&gt;&lt;span class='line'&gt;  "language": 1,
&lt;/span&gt;&lt;span class='line'&gt;  "audiodata": "gEUS9gckvq37RG4J7LYg12YdZAwVJCB053EiDJp9iNLDr6vGyOWvFDzyPwqVoS6UVO+ STOPPED SHORT"
&lt;/span&gt;&lt;span class='line'&gt;{
&lt;/span&gt;&lt;span class='line'&gt;  "callbackDestination": "chris@chrisweldon",
&lt;/span&gt;&lt;span class='line'&gt;  "callbackMethod": "EMAIL",
&lt;/span&gt;&lt;span class='line'&gt;  "language": 1,
&lt;/span&gt;&lt;span class='line'&gt;  "audiodata": "gEUS9gckvq37RG4J7LYg12YdZAwVJCB053EiDJp9iNLDr6vGyOWvFDzyPwqVoS6UVO+ EVEN SHORTER&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;This was a very strange pecularity. The body of the message was being duplicated, but the &lt;code&gt;audiodata&lt;/code&gt; parameter was being cut short in two different places in the request. I presumed this was a problem with nginx, but I couldn&amp;#8217;t find any information to guarantee this. Furthermore, the behavior seemed rather erratic. Some requests would include the full payload, others would have this behavior from above.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s when I took a look at my syslog. I started to see the following errors in &lt;code&gt;/var/log/syslog&lt;/code&gt;:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;Jan  6 16:24:53 app01 kernel: [4435039.857398] php5-fpm[19547]: segfault at 7fff7b2a8fe0 ip 000000000048f7dc sp 00007fff7b2a8fd0 error 6 in php5-fpm[400000+824000]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;I checked the &lt;code&gt;/var/log/php-fpm.log&lt;/code&gt; and saw a similar output there as well:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='plain'&gt;&lt;span class='line'&gt;[06-Jan-2013 16:24:53] WARNING: [pool www] child 19547 exited on signal 11 (SIGSEGV) after 450.542383 seconds from start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Segmentation faults? This seemed rather extreme just for handling 60k of payload.&lt;/p&gt;

&lt;p&gt;I continued digging further and figured out what was going on. I managed to find that the first request passed to the application servers contained the &lt;strong&gt;complete&lt;/strong&gt; payload, properly Base64 encoded. However, this request was what triggered the segmentation fault. Once that segmentation fault was triggered, the signal abruptly terminated and nginx re-dispatched the request to a separate application node. This application node was receiving the malformed body, not causing a segmentation fault, and was instead returning the &lt;code&gt;Invalid Payload Format&lt;/code&gt; message.&lt;/p&gt;

&lt;p&gt;So, to get to the bottom of what was going on, I started throwing logging statements into my application to see where I got to. Eventually, I ended up at a validation block of code, to validate that exact parameter that was having the truncation problems (&lt;code&gt;audiodata&lt;/code&gt;):&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;if (trim($value-&amp;gt;audiodata) != &amp;#39;&amp;#39;) {&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    // Verify the data is base64 encoded.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    if (!preg_match(&amp;quot;/^(?:[a-z0-9+&amp;#92;/]{4})*(?:[a-z0-9+&amp;#92;/]{2}==|[a-z0-9+&amp;#92;/]{3}=)?$/i&amp;quot;, $value-&amp;gt;audiodata)) {&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;        $this-&amp;gt;setMessage(&amp;#39;The audio data supplied was either not Base64 encoded or was incomplete.&amp;#39;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;        return false;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    }&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;It turns out, &lt;code&gt;preg_match&lt;/code&gt; has a &lt;em&gt;configurable&lt;/em&gt; maximum upper limit on the number of characters (&lt;a rel="nofollow" target="_blank" href="http://stackoverflow.com/questions/6173223/preg-match-has-string-size-limit"&gt;source&lt;/a&gt;). This really makes sense, as regular expression matching should be on small bodies of text (generally, &amp;lt; 10k characters is my good recommendation). Therefore, this was not a suitable solution. We would be better off attempting to base64 decode the text, and if it fails, assume it&amp;#8217;s invalid. This can easily be done with the following:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;if (trim($value-&amp;gt;audiodata) != &amp;#39;&amp;#39;) {&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    // Verify the data is base64 encoded.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    if (base64_decode(chunk_split($value-&amp;gt;audiodata)) == false) {&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;        $this-&amp;gt;setMessage(&amp;#39;The audio data supplied was either not Base64 encoded or was incomplete.&amp;#39;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;        return false;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;    }&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="x"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;After deploying this code change, all is well. No more segmentation faults.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/01/06/php-preg-match-maximum-length/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/MLvY2Gwlwj8" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/01/06/php-preg-match-maximum-length</guid>
         <pubDate>Sun, 06 Jan 2013 22:09:00 +0000</pubDate>
      </item>
      <item>
         <title>Chris Weldon - Microsoft MVP</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/8m9ejGYYVYQ/</link>
         <description>&lt;p&gt;&lt;img class="left" src="http://www.chrisweldon.net/images/posts/2013-01-05-chris-weldon-microsoft-mvp/mvplogo.gif" title="Microsoft MVP Logo"&gt;
2012 was a stressful, but rewarding year. Those who know me know I &lt;strong&gt;love&lt;/strong&gt; to speak at conferences and user groups. Just how much do I love to speak? Check out my &lt;a rel="nofollow" target="_blank" href="http://spkr8.com/neraath"&gt;SpeakerRate profile&lt;/a&gt;. Last year I had 20 talks logged at SpeakerRate, 28 talks in total. Most of those talks were local user groups and local techfests, but I finally managed to hit the national spotlight with one talk at Agile 2012. I know this pales in comparison to some technical speakers, but it&amp;#8217;s not about the quantity - it&amp;#8217;s about the quality. I put a lot of time preparing my presentations, as I want my audience to not just be encouraged, but to be &lt;em&gt;motivated&lt;/em&gt; to take what they&amp;#8217;ve learned in my sessions and implement them tomorrow.&lt;/p&gt;

&lt;p&gt;The last quarter I eased back on my speaking engagements, largely because I needed to spend more time with my family and because conferences are fairly light in the third quarter. Nevertheless, I woke up on January 1, 2013 to a rather pleasant e-mail - I had been awarded a &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/mvp"&gt;Microsoft MVP&lt;/a&gt; in ASP.Net/IIS. To say this came as a surprise would be a lie, but I had been skeptical if I was going to get the award, given how competitive the awards are. There tens of thousands of professionals all over the world vying for one of these awards, and in some categories (C# and SharePoint, in particular), you have to go through multiple vetting cycles before you end up receiving the award.&lt;/p&gt;

&lt;p&gt;&lt;span class='pullquote-left'&gt;
For those unfamiliar, an MVP Award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others.. No doubt, that&amp;#8217;s how I see myself (though a little more modest). I realize that there are some people who only care to get awards such as these as yet another way to pad the resume. Those individuals most definitely do what they do for the wrong reasons.
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I do what I do for a number of reasons. First, I love to hear myself talk. Just kidding. Those who know me know I can be (somewhat) shy in the company of others, and never as boisterous as some of those in a clique (I&amp;#8217;m looking at you Devlin and Bud :-P). That said, I do love meeting new people. I&amp;#8217;ve forged some really great relationships with people in the community that I would &lt;em&gt;love&lt;/em&gt; to work with (and some of them now do!). Even if I never have that opportunity, being able to meet for beers after work with these people is a whole lot of fun.&lt;/p&gt;

&lt;p&gt;But, while meeting new people is fun, I consider speaking as a selfless act. I don&amp;#8217;t speak for myself - I speak for you, the community. If nobody wanted to hear what I had to say, then my conference rooms would be empty and I&amp;#8217;d likely stay behind my computer or doing other things to help out. However, the fact that I&amp;#8217;ve concentrated on putting together such high-quality, passionate talks on a variety of different technical and professional areas has proven to be useful to many people in my audience. What matters most is having an impact on at least one person&amp;#8217;s perception of a topic, whether that&amp;#8217;s opening their eyes to a new technology, providing a different perspective on how to write software, or simply inspiring them to try again at something they previously failed at - that&amp;#8217;s what I really love.&lt;/p&gt;

&lt;h2&gt;How I View the Award&lt;/h2&gt;

&lt;p&gt;&lt;span class='pullquote-right'&gt;
Some people see the award as an affirmation that they are the most elite, technically proficient individiuals in the world. I won&amp;#8217;t lie - that&amp;#8217;s how I&amp;#8217;ve always percieved Microsoft MVPs. Some of them are stellar individuals who really are at the top of their game. However, to assume that I&amp;#8217;ve reached the pinnacle of my technical abilities is far from the truth. I thought I was a hot shot coming into Improving Enterprises; working with such a talented, professional, and wonderful group of technologists and mentors has really helped me remain consistently modest about my technical abilities.
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;In our field, there are experts, people who cannot achieve a level higher than they are already at. However, those individuals are experts on such a niche topic, that field itself is already evolved to its maximum potential, allowing for experts to finally attain their place. However, I see myself as extremely proficient in a lot of the areas I work - SharePoint, PHP, ASP.Net, and systems administration, in particular. That said, because each of those areas are so broad and have so many different uses, it&amp;#8217;s impossible for me to become an &amp;#8220;expert&amp;#8221; in these fields. It&amp;#8217;s hard for &lt;strong&gt;anyone&lt;/strong&gt; to become an expert in these fields. If you come across anyone who claims to be an expert, I guarantee you&amp;#8217;ll find gaps in their knowledge somewhere. That&amp;#8217;s how I view experts - people who know everything there is to know.&lt;/p&gt;

&lt;p&gt;With that said, I am humbled to know that Microsoft does see me as not only a skilled technologist, but that my contributions to the community are useful. That&amp;#8217;s ultimately how I view this MVP Award - it&amp;#8217;s affirmation that I should continue to do what I&amp;#8217;m doing. It&amp;#8217;s Microsoft willing to expend resources and provide me with information that will continue to help me educate my audience.&lt;/p&gt;

&lt;p&gt;I don&amp;#8217;t (and won&amp;#8217;t) hold my MVP award above anyone else - that&amp;#8217;s just not the type of person I am. Instead, I proudly wear this badge of honor as a beacon for others to reach out to ask questions. I&amp;#8217;m always interested in helping people out - that&amp;#8217;s why I work for Improving Enterprises. Their motto directly aligns with my goals - &lt;em&gt;Improving - It&amp;#8217;s what we do.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Thanks&lt;/h2&gt;

&lt;p&gt;I would not be receiving this award if it weren&amp;#8217;t for the help of &lt;a rel="nofollow" target="_blank" href="http://www.improvingenterprises.com"&gt;Improving Enterprises&lt;/a&gt;. The company actively encourages community participation, and goes above and beyond to help each other out with mentoring, guidance, and access to some of the best people in our area. There are two people from Improving who have been great motivators and put their necks on the line to vouch for me - Devlin Liles and Tim Rayburn. You guys rock and I love working with you both! Allen Hurst, my mentor for the last two and a half years, has truly been an inspiration, and has become one of my best friends. Without him, I likely wouldn&amp;#8217;t have been such an avid speaker. Zain Naboulsi and Chris Koenig, both from Microsoft, were also a great help towards getting me vetted through the MVP process and deserve major kudos.&lt;/p&gt;

&lt;p&gt;Of course, I would not be nearly as successful at the things I do without my family. I thank my father, David Weldon, for showing me the way early in being a speaker. For as long as I can remember, my father not only attended medical conferences, but was frequently a speaker at them, and often times went out of his way to make sure that I could attend to watch him speak. While I rarely ever understood the material, his charisma and style of presenting have rubbed off - in a very positive way. Thank you, dad.&lt;/p&gt;

&lt;p&gt;Finally, to my wife, Melissa, and son, Tristan, you both deserve the sun and the moon. You both motivate me to continually be a better person, encourage me when I am under stress, and are understanding when I am not around. I am often times not around or am too busy to spend the quality time you two deserve, and for that I&amp;#8217;m sorry. I shout from my proverbial mountain top how much I love you both, and how much you both mean to me, and thank you both so incredibly much for being such a wonderful and patient family.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2013/01/05/chris-weldon-microsoft-mvp/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/8m9ejGYYVYQ" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2013/01/05/chris-weldon-microsoft-mvp</guid>
         <pubDate>Sat, 05 Jan 2013 16:08:00 +0000</pubDate>
      </item>
      <item>
         <title>SharePoint 2013 Community Tagging Architecture and Bug</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/Lq7lWeK9aoA/</link>
         <description>&lt;p&gt;I&amp;#8217;ve spent yesterday evening and today really sinking my teeth into the internals of SharePoint 2013&amp;#8217;s social features, trying to identify how items are cataloged and surfaced. This led to some very interesting revelations as to where I can find information relating to each of SharePoint&amp;#8217;s moving parts. As I continued to dig, I managed to identify a significant problem with surfacing hashtags, aka &lt;strong&gt;#tags&lt;/strong&gt;, in community sites. This post serves as a place for hopefully the search engines to surface this problem for other users, and I will catalog my findings and hopefully eventual resolution with Microsoft.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Update (25/Apr/2013)&lt;/strong&gt;: &lt;a rel="nofollow" href="#update"&gt;Microsoft has implemented a bugfix for this. See below for more information.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Background&lt;/h2&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-1-community-discussion.png"&gt;&lt;/p&gt;

&lt;p&gt;This blogpost (and the ordeal mentioned above) all started with the community discussion thread seen in the screenshot above. In order for all social features to work correctly, you have to have the following services configured correctly in your SharePoint 2013 environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managed Metadata Service&lt;/li&gt;
&lt;li&gt;Search Service&lt;/li&gt;
&lt;li&gt;User Profile Service&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Each of these are used in a variety of different ways to knit the social story together. Let&amp;#8217;s start with the lowest common denominator in the tagging story: tags. If you read my &lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2012/12/18/sharepoint-2013-tagging-social-tags/"&gt;previous blog post&lt;/a&gt;, you&amp;#8217;ll get a better understanding of what &lt;strong&gt;Tags &amp;amp; Notes&lt;/strong&gt; are used for in SharePoint. Through that interface, you can tag a list item, file, or even a list with any managed metadata that&amp;#8217;s marked &amp;#8220;taggable&amp;#8221;. The purpose is to help surface relevant content within an enterprise without going through the hassle of creating custom metadata columns on document libraries.&lt;/p&gt;

&lt;p&gt;In SharePoint 2013, there is a new managed metadata term set, dubbed &lt;strong&gt;Hashtags&lt;/strong&gt;. This is a system-level term set, and cannot be deleted or created. However, all terms created within are fully manageable. This term store contains the terms created when a user creates a tag beginning with a hash (#). This occurs no matter where the user tags something: a file, comment, microblog post, or a community discussion. Suppose for a moment that a user adds a community discussion post with four &lt;em&gt;new&lt;/em&gt; hashtags: &lt;code&gt;#reply&lt;/code&gt;, &lt;code&gt;#outlook&lt;/code&gt;, &lt;code&gt;#metadata&lt;/code&gt;, and &lt;code&gt;#termstore&lt;/code&gt;. Upon submitting that post, those terms will immediately be added to the &lt;code&gt;ECMTermLabel&lt;/code&gt; database table in the Managed Metadata Service database.&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PartitionId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TermId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;LCID&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IsDefault&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;].[&lt;/span&gt;&lt;span class="n"&gt;ECMTermLabel&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-2-termstore.png"&gt;&lt;/p&gt;

&lt;p&gt;However, all across SharePoint and &lt;em&gt;especially&lt;/em&gt; the search service, the terms are not refered to by their integer identifiers. Instead, they&amp;#8217;re referred by their &lt;code&gt;UniqueId&lt;/code&gt; guid. This is found by looking at the &lt;code&gt;ECMTerm&lt;/code&gt; table, alongside the &lt;code&gt;ECMTermLabel&lt;/code&gt; table:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;UniqueId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;].[&lt;/span&gt;&lt;span class="n"&gt;ECMTerm&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1088&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1089&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1090&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1091&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-3-term-uniqueid.png"&gt;&lt;/p&gt;

&lt;p&gt;At this point, it&amp;#8217;s important to rehash that hashtags are not social by default. When it comes to using the &lt;strong&gt;Tags &amp;amp; Notes&lt;/strong&gt; board, it is possible to enable any tags used there (including hashtags) to be &amp;#8220;socialized&amp;#8221;. However, the &amp;#8220;new&amp;#8221; social features (community discussions, microblog posts and comments) do not make those tags social. You can check by querying the User Profile Service SocialDB&amp;#8217;s &lt;code&gt;SocialTags&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-4-socialtags.png"&gt;&lt;/p&gt;

&lt;h3&gt;Deeper Dive - Where are my Hashtags?&lt;/h3&gt;

&lt;p&gt;So, I wanted to find out where my hashtags really were being used. So, this took me on a deep dive through the SharePoint content database. As this was all read only, this didn&amp;#8217;t really matter if I was poking around trying to find data. Because there are several tables with hundreds of columns, I wanted to hone in precisely the list I was looking for my hashtags: the &lt;strong&gt;Discussions List&lt;/strong&gt;. I cracked open the &lt;code&gt;AllLists&lt;/code&gt; table and queried based on title:&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tp_SiteId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tp_WebId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tp_ID&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tp_Title&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;].[&lt;/span&gt;&lt;span class="n"&gt;AllLists&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tp_Title&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Discussions List&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-5-contentdb-listid.png"&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;tp_ID&lt;/code&gt; is what I what I needed, as it is the list&amp;#8217;s unique identifier for me to pull content out of the &lt;code&gt;AllUserData&lt;/code&gt; table. This table contains all user-provided data in all SharePoint sites stored within this content database. Therefore, it&amp;#8217;s massive, even for an environment with only a single site collection like a community site. Performing the following query allowed me to find the discussion comment that I added in the topmost screenshot.&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='sql'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tp_ColumnSet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;].[&lt;/span&gt;&lt;span class="n"&gt;AllUserData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;tp_ListId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;75D9F5D7-8B83-4252-BB52-48D5E5F91B01&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;tp_Modified&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-6-contentdb-discussioncomment.png"&gt;&lt;/p&gt;

&lt;p&gt;This yields a field which is viewable in an XML editor. The resulting XML for the screenshot of the comment made by me in the post above looks like the following. As you can see in the &lt;code&gt;ntext9&lt;/code&gt; XML field, we have the hashtags that SharePoint has identified within the body of the comment, as well as their unique identifiers from the managed metadata service. Further proof that community sites are being tagged appropriately.&lt;/p&gt;

&lt;div class='highlight'&gt;&lt;table&gt;&lt;td class='gutter'&gt;&lt;pre class='line-numbers'&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;int1&amp;gt;&lt;/span&gt;42&lt;span class="nt"&gt;&amp;lt;/int1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;int2&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/int2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;int3&amp;gt;&lt;/span&gt;42&lt;span class="nt"&gt;&amp;lt;/int3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;int7&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/int7&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;ntext2&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;div class=&amp;quot;ExternalClass27572E39547C412CA62D7D22B7FC380F&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;p&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;Let&amp;#39;s test. &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;span class=&amp;quot;ms-rtestate-read ms-socialentity&amp;quot; data-hashtag=&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot; data-hashname=&amp;quot;#reply&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;a class=&amp;quot;ms-hashTag&amp;quot; href=&amp;quot;/_layouts/15/FeedRedirector.aspx?type=tag&lt;span class="ni"&gt;&amp;amp;amp;&lt;/span&gt;amp;value=%23reply&amp;quot; rel=&amp;quot;#reply&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;#reply&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/a&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/span&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;span class=&amp;quot;ms-rtestate-read ms-socialentity&amp;quot; data-hashtag=&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot; data-hashname=&amp;quot;#outlook&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;a class=&amp;quot;ms-hashTag&amp;quot; href=&amp;quot;/_layouts/15/FeedRedirector.aspx?type=tag&lt;span class="ni"&gt;&amp;amp;amp;&lt;/span&gt;amp;value=%23outlook&amp;quot; rel=&amp;quot;#outlook&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;#outlook&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/a&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/span&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;span class=&amp;quot;ms-rtestate-read ms-socialentity&amp;quot; data-hashtag=&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot; data-hashname=&amp;quot;#metadata&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;a class=&amp;quot;ms-hashTag&amp;quot; href=&amp;quot;/_layouts/15/FeedRedirector.aspx?type=tag&lt;span class="ni"&gt;&amp;amp;amp;&lt;/span&gt;amp;value=%23metadata&amp;quot; rel=&amp;quot;#metadata&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;#metadata&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/a&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/span&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;span class=&amp;quot;ms-rtestate-read ms-socialentity&amp;quot; data-hashtag=&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot; data-hashname=&amp;quot;#termstore&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;a class=&amp;quot;ms-hashTag&amp;quot; href=&amp;quot;/_layouts/15/FeedRedirector.aspx?type=tag&lt;span class="ni"&gt;&amp;amp;amp;&lt;/span&gt;amp;value=%23termstore&amp;quot; rel=&amp;quot;#termstore&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;#termstore&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/a&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/span&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/p&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/div&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/ntext2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;ntext9&amp;gt;&lt;/span&gt;#metadata|9434622a-60e1-47c6-9b58-17b955c31410;#outlook|497ba856-65ff-45d7-89f6-6302e041e4b8;#reply|5c68c7c8-38cc-4964-850f-8c1e02076c04;#termstore|b2969adf-a746-4c0e-b38f-db7a77de7788&lt;span class="nt"&gt;&amp;lt;/ntext9&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;nvarchar3&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;8b0edc16e721456986d9d04eac185d5d@SharePoint&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/nvarchar3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;h2&gt;The Bug&lt;/h2&gt;

&lt;p&gt;The root cause of me digging down this rabbit hole was no matter what I did, I couldn&amp;#8217;t find content tagged with certain hashtags that I &lt;em&gt;know&lt;/em&gt; existed. I had a tendency to use the &lt;code&gt;#sharepoint&lt;/code&gt; hashtag a &lt;em&gt;lot&lt;/em&gt; in both my microblog feed as well as in my community discussion. Yet, when I attempted to search for that hashtag through the search center user interface, only the microblog posts would show - none of the community discussion threads.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-7-search.png"&gt;&lt;/p&gt;

&lt;p&gt;Furthermore, when I would check the hashtag profile for &lt;code&gt;#sharepoint&lt;/code&gt;, it would show the same - only microblog posts, no community discussions. This is a &lt;strong&gt;significant&lt;/strong&gt; usability issue.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-8-hashtagprofile.png"&gt;&lt;/p&gt;

&lt;p&gt;I verified when creating a reply to a community discussion, complete with a &lt;em&gt;new&lt;/em&gt; hashtag, the hashtag does get added to the managed metadata term set, as seen in the query from the Managed Metadata Service database above. In the &lt;code&gt;ECMTermLabel&lt;/code&gt; database table, we can clearly identify the hashtag terms &lt;code&gt;#reply&lt;/code&gt;, &lt;code&gt;#outlook&lt;/code&gt;, &lt;code&gt;#metadata&lt;/code&gt;, and &lt;code&gt;#termstore&lt;/code&gt; added as part of the comment. As seen in the XML block from &lt;code&gt;AllUserData&lt;/code&gt; above, we see that SharePoint is correctly associating the hashtags in the post with their identity in the managed metadata service. Just to make sure that the latest hashtags are exhibiting this problem, I performed a search and found nothing.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-9-outlook.png"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-10-contenttypes.png"&gt;
The biggest thing that I wanted to find out was whether Discussion Lists were properly surfacing hashtags as the appropriate metadata for the search service to identify them. When I looked at the list settings for the Discussions List, I found that it was affiliated with two content types: &lt;code&gt;Discussion&lt;/code&gt; and &lt;code&gt;Message&lt;/code&gt;. For the discussion list, we can clearly see that it is not directly using hashtags via the columns composition:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-11-columns.png"&gt;&lt;/p&gt;

&lt;p&gt;Furthermore, if you look at the Discussion and Message content types, &lt;strong&gt;neither&lt;/strong&gt; reference Hashtags as a column:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-12-discussion-columns.png"&gt;
&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-13-message-columns.png"&gt;&lt;/p&gt;

&lt;p&gt;Just to double check, I decided to look at the Microfeed for my personal site to see if the hashtags were being elevated as their own column. You can access your microfeed list by going to &lt;code&gt;/personal/USERNAME/Lists/PublishedFeed&lt;/code&gt;. Indeed, when I looked at the columns for this list, &lt;strong&gt;Hashtags&lt;/strong&gt; from the Managed Metadata Columns collection &lt;strong&gt;were&lt;/strong&gt; being surfaced:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-20-sharepoint-2013-community-tagging-architecture-and-bug/bug-14-publishedfeed-columns.png"&gt;&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;&lt;del&gt;If this is indeed a bug, I can hope that Microsoft will fix this problem ASAP, as it&amp;#8217;s a significant hinderance to groups adopting SharePoint 2013 for it&amp;#8217;s social aspects. Despite all the marketing statements indicating that 2013 makes things much easier to find, this seems to be a limitation of SharePoint Social Search. I plan on creating a bug with Microsoft&amp;#8217;s bugreporting system and will keep this post updated with information as it evolves.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (25/Apr/2013)&lt;/strong&gt;: I have received word from Jennifer Bester (&lt;a rel="nofollow" target="_blank" href="http://twitter.com/jbester" name="update"&gt;@jbester&lt;/a&gt;), a Microsoft Field Engineer, that Microsoft &lt;strong&gt;has&lt;/strong&gt; acknowledged this as a bug and has implemented a fix. It is due to be released in the June 2013 CU for SharePoint. As soon as that CU is published I&amp;#8217;ll be applying it to our on-premise environment. SharePoint Online customers &lt;strong&gt;should&lt;/strong&gt; be seeing this bug fixed ahead of the CU.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2012/12/20/sharepoint-2013-community-tagging-architecture-and-bug/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/Lq7lWeK9aoA" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2012/12/20/sharepoint-2013-community-tagging-architecture-and-bug</guid>
         <pubDate>Thu, 20 Dec 2012 19:29:00 +0000</pubDate>
      </item>
      <item>
         <title>SharePoint 2013 Tagging - Social Tags, Hashtags, and Keywords</title>
         <link>http://feedproxy.google.com/~r/chrisweldon/vCab/~3/qvrd6xGfDTA/</link>
         <description>&lt;p&gt;SharePoint 2013 is now publicly available and enterprises are taking an earnest look at many of its features, specifically the social features. I won&amp;#8217;t lie, I&amp;#8217;m a fairly decent microblogger, and at &lt;a rel="nofollow" target="_blank" href="http://www.improvingenterprises.com/"&gt;Improving Enterprises&lt;/a&gt; we actively use &lt;a rel="nofollow" target="_blank" href="http://www.yammer.com/"&gt;Yammer&lt;/a&gt; to communicate company-wide. That feature is increasingly useful to have meaningful conversations when it comes to promoting achievements, asking questions that require a larger audience to answer, and to share transient things like pictures and videos. However, when it comes to sharing documents and collaborating on a project, SharePoint wins over &lt;a rel="nofollow" target="_blank" href="http://www.yammer.com/"&gt;Yammer&lt;/a&gt; every time. That&amp;#8217;s why we have &lt;a rel="nofollow" target="_blank" href="http://office365.microsoft.com/"&gt;Office 365&lt;/a&gt; within our company. So, to hear that many of Yammer&amp;#8217;s features are now native to SharePoint, I became very interested in digging in - as did my customer.&lt;/p&gt;

&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.improvingenterprises.com/"&gt;Improving&lt;/a&gt; is not nearly as large a company as the customer I work for. They are a financial institution with 40k+ employees worldwide. As a result, they have a distinct need to be social. But, they are also encumbered with some regulatory restrictions affecting their social deployment. As a result, introducing social across their firm is quite a challenge, especially when there are many stakeholders who are considering multiple competing products, including &lt;a rel="nofollow" target="_blank" href="http://www.jivesoftware.com/"&gt;Jive&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://www.osqa.net/"&gt;The Open Source Q&amp;amp;A System (OSQA)&lt;/a&gt;, and &lt;a rel="nofollow" target="_blank" href="http://www.yammer.com/"&gt;Yammer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;large&lt;/strong&gt; part of social in the listed products and many other social networks is the concept of tagging. SharePoint 2010 started venturing down the path of tags by creating the &lt;em&gt;Tags and Notes&lt;/em&gt; board, giving users the ability to tag files and lists publicly (or privately), making it easier to categorize items in SharePoint. You could also enhance your user profile by indicating what topics (Keywords) you should be asked about, giving users a sense that you&amp;#8217;re the expert in those key fields. All in all, a good step in the social direction, but still behind the curve.&lt;/p&gt;

&lt;p&gt;SharePoint 2013 continued to build on tagging with the introduction of &lt;strong&gt;#tags&lt;/strong&gt; (prononunced hashtags). This is more beneficial to the social story for many reasons. First: hashtags become a first-class citizen in the sense that users no longer have to go out of their way to add a tag to something (like a conversation, comment, or microblog entry). Second: hashtags are always public, meaning that users have the collection of hashtags at their fingertips, giving them helpful hints on how to categorize their entry. Third: hashtags seem to be used anywhere you can tag - whether it&amp;#8217;s in conversations, comments, or when tagging documents or libraries.&lt;/p&gt;

&lt;p&gt;However, as I continued to dig into the social and tagging story, there seems to be some discrepancies in several of the features. The purpose of this post is to highlight that while &lt;strong&gt;#tags&lt;/strong&gt; seem to be the direction that Microsoft would rather push users to use in their tagging strategy, integrating their existing social tagging strategy seemed to be left behind in SharePoint 2013.&lt;/p&gt;




&lt;h2&gt;Show Me More Tags&lt;/h2&gt;

&lt;h3&gt;Tags &amp;amp; Notes&lt;/h3&gt;

&lt;p&gt;As mentioned above, there are several different ways to tag content in SharePoint 2013. The first is the original tagging strategy through the &lt;em&gt;Tags &amp;amp; Notes&lt;/em&gt; board.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/tags-and-notes-ribbon.png"&gt;
&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/tags-and-notes.png"&gt;&lt;/p&gt;

&lt;p&gt;In this board, when you start typing text, you&amp;#8217;ll get helpful hints of the various &lt;strong&gt;Keywords&lt;/strong&gt; already available by means of other user contributions and pre-populated keywords from administrators of the Managed Metadata. What&amp;#8217;s even more impressive is you can not only leverage Keywords from traditional tags, but also &lt;strong&gt;#tags&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/tags-and-notes-hints.png"&gt;&lt;/p&gt;

&lt;h3&gt;Newsfeed&lt;/h3&gt;

&lt;p&gt;As everyone has been talking about, the Newsfeed is probably the singular most important feature to the social story. It&amp;#8217;s the user&amp;#8217;s &amp;#8220;dashboard&amp;#8221; into what&amp;#8217;s relevant to them, what&amp;#8217;s happening for everyone, and how to get to most other contextually-relevant content in the farm. If you read most of the marketing talk on the SharePoint 2013 social features, one of the biggest considerations was how to surface content that&amp;#8217;s not just useful, but contextually relevant. Finding a sales report from the previous quarter may be useful in my position, but when I&amp;#8217;m trying to search for content on the proposed social media marketing strategy, it isn&amp;#8217;t useful.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/newsfeed.png"&gt;
&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/newsfeed-following.png"&gt;&lt;/p&gt;

&lt;p&gt;From the newsfeed, I can quickly share status updates with everyone, my team, or other audiences of the sites I&amp;#8217;m following. I can mention other users by using an @ symbol in front of their name and also have multiple &lt;strong&gt;#tags&lt;/strong&gt; in a single post. At a glance, I also see information about the sites, documents, people, and tags that I&amp;#8217;m following, making it easy to get around to find items that are most relevant to me. Searching for content is ubiquitous - you can pretty much search for content from anywhere in your SharePoint farm using the out-of-the-box templates.&lt;/p&gt;

&lt;h3&gt;Communities&lt;/h3&gt;

&lt;p&gt;Communities are the next biggest value-add to social adoption in SharePoint 2013. Communities are reminicent to forums and Q&amp;amp;A boards (like &lt;a rel="nofollow" target="_blank" href="http://www.stackoverflow.com/"&gt;StackOverflow&lt;/a&gt;). Users can start threads in different categories of conversation and have rich discussion. &lt;strong&gt;#tags&lt;/strong&gt; are ubiquitous, and can be added to questions and replies. I won&amp;#8217;t go into the number of different features of communities, but suffice to say that I can easily add &lt;strong&gt;#tags&lt;/strong&gt; to any of my interactions and they surface within searches and the newsfeed just like hashtags used in my microblogs.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/community-question.png"&gt;&lt;/p&gt;

&lt;p&gt;However, one thing that appears to be less straight-forward is using managed metadata/keywords to tag individual responses. I can access the &lt;strong&gt;Tags &amp;amp; Notes&lt;/strong&gt; button from the &lt;strong&gt;Page&lt;/strong&gt; tab, but what&amp;#8217;s less clear is what a &amp;#8220;Page&amp;#8221; is in the context of tagging content. Does it relate to the entire thread, or just the question? There are some unanswered questions around general social tagging for community discussions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Off-topic:&lt;/strong&gt; The biggest thing communities are meant to replace: distribution lists. Microsoft threatened to remove distribution lists from Exchange 2007 in favor of SharePoint, but backed off when they nearly had an enterprise revolt. They stayed away from the topic in Exchange 2010 and SharePoint 2010 (as far as I could tell), but 2013 seems to be a renewed effort. The message: communicating heavily through e-mail using Distribution Lists is a terrible approach. I&amp;#8217;m in agreement. When I was a heavy Atlassian Confluence user, I found little point in communicating lengthy conversations in e-mail. Once I left, those e-mails would no longer be useful to future teams, and valuable business justification and decisions will be lost. Instead, I preferred to document and carry out these conversations in a Wiki (largly due to the &lt;a rel="nofollow" target="_blank" href="http://blogs.atlassian.com/2009/01/2009_email_brev/"&gt;E-mail Brevity Challenge of 2009&lt;/a&gt;).&lt;/p&gt;

&lt;h4&gt;Social Tags&lt;/h4&gt;

&lt;p&gt;What&amp;#8217;s important to note, however, is the use of tags via the &lt;strong&gt;Tags &amp;amp; Notes&lt;/strong&gt; board are &lt;strong&gt;not&lt;/strong&gt; social tags by default. This is nothing new from SharePoint 2010, if you&amp;#8217;ve already taken a look at this. What&amp;#8217;s even more surprising is tags in communities or on your newsfeed are also, not social tags. To fix &lt;strong&gt;Tags &amp;amp; Notes&lt;/strong&gt;, you have to go into the document library settings (specifically, the &lt;em&gt;Enterprise Metadata and Keywords Settings&lt;/em&gt; section in order to enable the ability to save the metadata on this list as social tags. I have yet to figure out how to do this for communities or newsfeeds.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/enable-social-tags.png"&gt;&lt;/p&gt;

&lt;p&gt;Personally, I feel that this is a missed opportunity. If Microsoft wants to solidify the social story more, then trying to surface the tagging of documents only helps that cause. Additionally, doesn&amp;#8217;t it make sense that all &lt;strong&gt;#tags&lt;/strong&gt; are social tags? If we&amp;#8217;re using it in a social context, then it should be surfaced by the social controls. I digress, however, as the use cases for tagging vary widely and this may have been a strategic decision.&lt;/p&gt;

&lt;p&gt;Why does marking a tag a social tag important? In SharePoint 2010 (and 2013), the only way you can surface a tag in your newsfeed is to follow it. To be able to follow it, the tag has to be a social tag. Not just any enterprise metadata can be followed in your newsfeed. For a large majority of metadata, however, this is totally fine: we likely don&amp;#8217;t care to surface metadata from a term set dubbed &lt;em&gt;SOX Compliance Restriction Codes&lt;/em&gt; showing ST123X-F.&lt;/p&gt;

&lt;p&gt;&lt;img class="left" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/tag-cloud.png"&gt;&lt;/p&gt;

&lt;p&gt;Another reason social tags are important: the Tag Cloud. The tag cloud is a cool (but not innovative) feature to help surface the most popular tags in your subsite (or across the entire farm). The size of the text changes based on the number of uses of a particular tag. Nevertheless, other items like the tag cloud rely solely on social tags, not managed metadata tags. Therefore, when you drop one of those controls into a site, what&amp;#8217;s rendered is based &lt;strong&gt;only&lt;/strong&gt; on social tags. Crack open the code to check for yourself. I did.&lt;/p&gt;

&lt;h3&gt;Hashtags&lt;/h3&gt;

&lt;p&gt;This is the newest addition to the social tagging strategy in SharePoint 2013. &lt;strong&gt;#tags&lt;/strong&gt;, like enterprise keywords and social tags, are a broadly defined concept meant to be leveraged in a wide capacity. Much like in social networking sites like Twitter and Facebook, the use of tags are to categorize a post, making it easier for individuals to search and identify related contents. All one has to do is add a hash in front of any word and SharePoint will convert that to a hashtag. When viewing the comment with a hashtag, SharePoint automatically renders it as a bold hyperlink to help make navigating and finding related content easier.&lt;/p&gt;

&lt;p&gt;&lt;img class="left" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/hashtags-newsfeed.png"&gt;&lt;/p&gt;

&lt;p&gt;I regularly go to conferences that define a hashtag for people to use when posting to Twitter. This makes it easy for me as a conference organizer &lt;strong&gt;and&lt;/strong&gt; an attendee to perform a search strictly on that hashtag. SharePoint is no different: they&amp;#8217;ve realized that searching for hashtags and surfacing those results is strategically important to help further the social adoption in 2013. We see this through the hashtag profile pages (accessible by simply clicking the hashtag link) and through featured content controls in the search center.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/hashtags-profilepage.png"&gt;
&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/hashtags-trending.png"&gt;
&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/hashtags-search-featured-content.png"&gt;&lt;/p&gt;

&lt;p&gt;Other controls exist (particularly in the newsfeed) that surface trending hashtags, which is useful to help bring visibility to important conversations or activities within the company.&lt;/p&gt;

&lt;h4&gt;Hashtags and Social Tags in the Managed Metadata Service&lt;/h4&gt;

&lt;p&gt;However, where I find the disconnect with the social strategy is that not all hashtags are social tags. Furthermore, not all Managed Metadata / Enterprise Keywords are social tags. Yet, most of this content all ends up in the Managed Metadata Service, but in two distinctly different System Term Sets: Hashtags and Keywords.&lt;/p&gt;

&lt;p&gt;&lt;img class="left" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/managed-metadata-service-overview.png"&gt;&lt;/p&gt;

&lt;p&gt;Even in our simple test environment with 7 enterprise users testing the social features, it became quite easy to cross-polute our term sets. While all of our terms in the Hashtag set are definitely hashtags, many of the terms in the Keywords set can be clasified as hashtags.&lt;/p&gt;

&lt;p&gt;&lt;img class="left" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/managed-metadata-service-hashtags-set.png"&gt;
&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/managed-metadata-service-keywords-set.png"&gt;&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s really disappointing about this is the fact that none of those tags in either are guaranteed to make it to the social tags. Those are stored completely separately from the Managed Metadata Service. Social tags are an aspect of the user profile service and are stored in those databases. This is where things start to get very confusing. If you crack open the &lt;em&gt;User Profile Service Social Database&lt;/em&gt;, there&amp;#8217;s a &lt;code&gt;SocialTags&lt;/code&gt; table that contains all tags used for Social elements. As you can see in the below results, these include regular keyword metadata tags as well as hashtags.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/user-profile-service-social-tags-table.png"&gt;&lt;/p&gt;

&lt;p&gt;There are a couple of ways this is relevant. I can choose to follow a hashtag in SharePoint quite easily. In fact, SharePoint does an &lt;strong&gt;excellent&lt;/strong&gt; job surfacing how to follow hashtags on your newsfeeds. While I can also follow social (not hash) tags, there is a distinct disconnect. If I tag a document with the &lt;strong&gt;SharePoint&lt;/strong&gt; tag, if I&amp;#8217;m following the &lt;strong&gt;#SharePoint&lt;/strong&gt; hashtag, I won&amp;#8217;t see that document in my newsfeed. I have to be following &lt;strong&gt;both&lt;/strong&gt; the &lt;strong&gt;SharePoint&lt;/strong&gt; tag and the hashtag.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/hashtags-follow.png"&gt;&lt;/p&gt;

&lt;p&gt;This also affects search. As seen above, I can search for a hashtag and see all content tagged as a featured search result. However, searching for standard social tags can only be done through the tag profile page, or by using a specialized search string that&amp;#8217;s really only formable by clicking links only from the tag profile. The result is an inconsistent search experience for users when it comes to tags.&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://www.chrisweldon.net/images/posts/2012-12-18-sharepoint-social-tags/social-tags-search.png"&gt;&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;m overwhelmingly optimistic about the social story in SharePoint 2013. It&amp;#8217;s been missing for too long and has hindered adoption of SharePoint as a fundamental enterprise collaboration platform. For enterprises which have internet filters restricting access to Facebook, Twitter, and many other social networking sites, this will come as a welcome relief to employees who enjoy that form of social interaction. The communities and the newsfeed bridge two types of social communities: the forum community with the more mainstream social media community.&lt;/p&gt;

&lt;p&gt;That said, Microsoft has introduced a major uphill battle for the enterprise to strategize on how to roll out social. I firmly believe that leaving it strictly to the community to self-describe their social story will result in the same cluttered mess that SharePoint is in most enterprises. Adoption will languish and the story gets that much more difficult for the organization to trust the social story in v.Next.&lt;/p&gt;

&lt;p&gt;My gut recommendation for tagging in SharePoint 2013 is the following. This is likely to evolve as I come to understand the original intent behind how &lt;strong&gt;#tags&lt;/strong&gt; were supposed to play with social tags.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you&amp;#8217;re rolling this new, recommend users always define tags in terms of &lt;strong&gt;#tags&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If you&amp;#8217;re upgrading:

&lt;ul&gt;
&lt;li&gt;See which keywords make sense to resurface as &lt;strong&gt;#tags&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Delist the original keywords you converted to &lt;strong&gt;#tags&lt;/strong&gt; as taggable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Drop the Tag Cloud Web Part into community sites to surface popular tags.&lt;/li&gt;
&lt;li&gt;Appoint someone in the organization as being responsible for the Keywords and Hashtags term stores.

&lt;ul&gt;
&lt;li&gt;This person should be responsible for pre-populating these term stores with common terminology throughout the organization.&lt;/li&gt;
&lt;li&gt;This person should seek out other more specific terminology used within specialized departments.&lt;/li&gt;
&lt;li&gt;This person should prune irrelevant, inappropriate, or duplicate terms in each of the stores to keep the sets fairly sane and easy for users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Give employees time to play with and &lt;em&gt;learn to use&lt;/em&gt; the social features in SharePoint 2013.

&lt;ul&gt;
&lt;li&gt;Users who have used Facebook and Twitter understand the value and will quickly feel at-home.&lt;/li&gt;
&lt;li&gt;Users who have used forums will also feel right at-home with communities and will quickly want to create their own.

&lt;ul&gt;
&lt;li&gt;Dissuade them from creating a new community unless they have a significant enough interest and make them realize they need to be a curator to keep it alive.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Users who are anti-social or have not adopted Facebook or Twitter (like my parents) need this time to understand the value of that feature.&lt;/li&gt;
&lt;li&gt;All users need time to figure out what they have to do to follow &lt;strong&gt;#tags&lt;/strong&gt;, users, documents, and lists.&lt;/li&gt;
&lt;li&gt;Come up with a compelling story of how your department uses social.

&lt;ul&gt;
&lt;li&gt;After all, if you&amp;#8217;re not eating your own dog food, how do you expect your users to use it?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Either way, the social features will really help to drive adoption of SharePoint 2013 and you&amp;#8217;ll enjoy them when you start playing with them. If you have any questions, don&amp;#8217;t heistate to drop a comment below or shoot me an e-mail at chris (at) chrisweldon (dot) net.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.chrisweldon.net/blog/2012/12/18/sharepoint-2013-tagging-social-tags/"&gt;&amp;#9875; Permalink&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/chrisweldon/vCab/~4/qvrd6xGfDTA" height="1" width="1"/&gt;</description>
         <author>Chris Weldon</author>
         <guid isPermaLink="false">http://www.chrisweldon.net/blog/2012/12/18/sharepoint-2013-tagging-social-tags</guid>
         <pubDate>Tue, 18 Dec 2012 15:07:00 +0000</pubDate>
      </item>
      <item>
         <title>Working with Dynamic Schema in Azure Mobile Services</title>
         <link>http://feedproxy.google.com/~r/TimRayburnsBlog/~3/BXS6s_7ecJc/</link>
         <description>&lt;p&gt;Lately I&amp;#8217;ve been developing on a side project using the awesome &lt;a rel="nofollow" target="_blank" href="http://chriskoenig.net/2012/10/17/new-azure-sdk-and-services-updates/"&gt;Azure Mobile Services&lt;/a&gt; offering from Microsoft.  Specifically I&amp;#8217;ve been developing a Windows Phone 8 application, the details of which will be revealed in time.  One of the best features of Azure Mobile Services is the ability to work with a Dynamic Schema, it will automatically insert new columns for fields it has never received before.&lt;/p&gt;

&lt;p&gt;There are many great reasons for this during development.  It allows for rapid iteration, which is great.  But, let&amp;#8217;s take the example of the &lt;a rel="nofollow" target="_blank" href="https://github.com/WindowsAzure-TrainingKit/HOL-Windows8AndMobileServices/blob/master/HOL.md"&gt;Todo Hands On Lab&lt;/a&gt;, and look at the DataContract established for it&amp;#8217;s entity.&lt;/p&gt;

 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoItem&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;text&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;complete&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now, lets say I wanted to add a property called Description to this, I might update the above code as follows:&lt;/p&gt;

 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoItem&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;text&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;complete&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;description&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;If I change nothing else other than this, I when I run my program I&amp;#8217;d expect that the Description column would be added to the database when I saved a new item.  But, instead, I get the following exception when I save an item:&lt;/p&gt;

&lt;pre&gt;
Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Error: Unable to insert a null value for new property 'description'
  Source=Microsoft.Azure.Zumo.WindowsPhone8.Managed
  InnerException: 
&lt;/pre&gt;


&lt;p&gt;I was more than a little baffled by this concept, my first read of this exception got me thinking things like: &amp;#8221;&lt;em&gt;who on earth would design a dynamic data feature to create NON NULLABLE FIELDS?!?!?&lt;/em&gt;&amp;#8221; and other less kind statements.  Well, as they say, pride commeth before the fall.  As I&amp;#8217;ve researched this error, I&amp;#8217;ve realized it&amp;#8217;s entirely reasonable.  Why?  Ah&amp;#8230; REST.&lt;/p&gt;

&lt;p&gt;Azure Mobile Services data offering is built as a set of RESTful services, using JSON serialization.  That means that initially my request to add an entry named &amp;#8220;Foo&amp;#8221; would have looked like this:&lt;/p&gt;

 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;When I added the additional field but didn&amp;#8217;t set a value for it, the serializer added it to the submitted output, resulting in:&lt;/p&gt;

 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Sure, that makes sense &amp;#8230; Unless your the SQL Server who is now being asked to add that new field.  Why?  Because you&amp;#8217;ve got NO IDEA what the data type of description is.  Whoops!  So how do we solve this?  Well, there are a couple of ways we can do that.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We could add the field manually in SQL Server, specifying the data type desired.  This works great, but kindof unravels the whole point of Dynamic Schema.&lt;/li&gt;
&lt;li&gt;We could put in temporary code, so that the first time we send this up, it&amp;#8217;s populated.  After that, the field is nullable so there is no problem storing nulls from that point onward.  I&amp;#8217;m not a big fan of &amp;#8220;secret recipes&amp;#8221; in code bases, and this model leaves no trace for the next guy of the &amp;#8220;proper procedure&amp;#8221; so I decided against it.&lt;/li&gt;
&lt;li&gt;We could add a Setup script, which pushed a single completely populated entity.  This could be run all sorts of ways, from a unit test to a rake task, but would ensure the schema desired.  This solution is better, but still a little buried for me.&lt;/li&gt;
&lt;li&gt;We could make the DBAs amongst us cry, and decide that our entities will provide a default value for reference types such as string (note value types don&amp;#8217;t have this problem, they can&amp;#8217;t be null) in the constructor of our type.  This technically takes more space, and I&amp;#8217;m certain the DBAs will yell at me about other reasons, but on the other hand it leaves a clear pattern to be followed by future developers.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;I chose option 4.  That resulted in this code:&lt;/p&gt;

 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoItem&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;TodoItem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;text&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;complete&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;description&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; 


&lt;p&gt;Now, you can feel free to make a different choice, but for me and my project, this pattern is working just fine.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=BXS6s_7ecJc:SPhluI3tAaA:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=BXS6s_7ecJc:SPhluI3tAaA:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/BXS6s_7ecJc" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://TimRayburn.net/blog/working-with-dynamic-schema-in-azure-mobile-services</guid>
         <pubDate>Wed, 12 Dec 2012 17:45:00 +0000</pubDate>
      </item>
      <item>
         <title>Windows Phone 8 Development on a Mac</title>
         <link>http://feedproxy.google.com/~r/TimRayburnsBlog/~3/QgLnA_WFfTg/</link>
         <description>&lt;p&gt;So you want to do Windows Phone 8 development on a Mac, the traditional answer to this has been, your out of luck.  The hurdles are two fold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Windows Phone Emulator has always, since Windows Phone 7, been run as a HyperV virtual machine.  This means if your running Windows itself inside a VM, running the emulator is like trying to run a VM inside a VM.  This has traditionally been an unsupported scenario.&lt;/li&gt;
&lt;li&gt;The Windows Phone 8 Emulator raised the bar again, because it only runs on Windows 8.  That causes two problems for us.  The first is that Boot Camp hasn&amp;#8217;t been updated to support Windows 8 yet, so we can&amp;#8217;t (easily) get the necessary drivers for our Mac to run Windows 8.&lt;/li&gt;
&lt;li&gt;The second problem that Windows 8 requirement brings us is that HyperV in Windows 8 requires &lt;a rel="nofollow" target="_blank" href="http://www.ryanlowdermilk.com/2012/09/does-my-computer-support-slat/"&gt;&amp;#8220;Second Level Address Translation&amp;#8221;&lt;/a&gt; support from it&amp;#8217;s CPUs.  That means the CPU its running on has to support very new virtualization support in order to run.  That will make it even more difficult for a VM solution to work for us.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;But fear not my valiant friends, for there is an answer.  &lt;a rel="nofollow" target="_blank" href="http://www.vmware.com/products/fusion/overview.html"&gt;VMWare Fusion&lt;/a&gt; has heard your cries, and there is a way to solve this problem.  Here are the necessary steps, care of &lt;a rel="nofollow" target="_blank" href="http://social.msdn.microsoft.com/Forums/en-US/wptools/thread/ed72010c-321c-4667-97b2-3ff1540e7f87"&gt;an awesome MSDN forums post&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using &lt;a rel="nofollow" target="_blank" href="http://www.vmware.com/products/fusion/overview.html"&gt;VMWare Fusion 5&lt;/a&gt; or better, create and install a Windows 8 virtual machine.  If you have one already, your fine.&lt;/li&gt;
&lt;li&gt;Stop the virtual machine by shutting down Windows 8.&lt;/li&gt;
&lt;li&gt;At the VMWare Virtual Machine list, right click Windows 8 machine then click &amp;#8220;Show in Finder&amp;#8221;.&lt;/li&gt;
&lt;li&gt;Right click the file then click &amp;#8220;Show package contents&amp;#8221;, then find and open with a text editor a file with the extension .vmx&lt;/li&gt;
&lt;li&gt;Go till the end of the file and add this two lines (first check whether they were previously added):
 &lt;pre&gt;
 hypervisor.cpuid.v0 = "FALSE"
 vhv.enable = "TRUE"
 &lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;At the VMWare Virtual Machine list, right click Windows 8, click &amp;#8220;Preferences&amp;#8221; then &amp;#8220;Advanced&amp;#8221;. Choose &amp;#8220;Intel VT-X with EPT&amp;#8221; as &amp;#8220;Preferred virtualization engine&amp;#8221;.&lt;/li&gt;
&lt;li&gt;Start your virtual machine, launch Visual Studio, and develop away.  The emulator will happily run.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Obviously this solution is a &amp;#8220;It works on my machine&amp;#8221; situation, but I&amp;#8217;m sure you will find success down this path.&lt;/p&gt;

&lt;h2&gt;Update 12/12/12&lt;/h2&gt;

&lt;p&gt;Several questions were asked, so quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does Parallels support this?  As of today, no.  &lt;a rel="nofollow" target="_blank" href="http://forum.parallels.com/showthread.php?t=264780"&gt;See this support forum post from them.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Does your processor have to support SLAT?  Yes, your physical hardware must be current enough to support SLAT.  For Macs, this means you need to be running an i5 or i7 mac.&lt;/li&gt;
&lt;li&gt;What hardware are you running?  As of today, I&amp;#8217;m running this solution on a Thunderbolt MacBook Pro running a 2.3 Ghz i7 and Lion, not Mountain Lion.  The official Model Identifier for my mac is MacBookPro8,3.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=QgLnA_WFfTg:uEUQtJw6rsA:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=QgLnA_WFfTg:uEUQtJw6rsA:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/QgLnA_WFfTg" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://TimRayburn.net/blog/windows-phone-8-development-on-a-mac</guid>
         <pubDate>Tue, 11 Dec 2012 13:02:00 +0000</pubDate>
      </item>
      <item>
         <title>Beckoning of Lovely – 2012</title>
         <link>http://brandonbarber.net/archives/365</link>
         <description>Nice video for the Holidays &amp;#8211; amy krouse rosenthal For 2012, the Beckoning of Lovely up to Dec 21, 2012</description>
         <author>Brandon</author>
         <guid isPermaLink="false">http://brandonbarber.net/?p=365</guid>
         <pubDate>Sat, 08 Dec 2012 20:58:33 +0000</pubDate>
         <content:encoded><![CDATA[<p>Nice video for the Holidays &#8211; <a rel="nofollow" target="_blank" href="http://www.whoisamy.com/beckoningoflovely">amy krouse rosenthal</a></p>
<p>For 2012, the Beckoning of Lovely up to Dec 21, 2012</p>
<p></p>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>TEDX SMU Video (in full)</title>
         <link>http://brandonbarber.net/archives/356</link>
         <description>Typically I will attend TEDX SMU every year (this is the 4th) but couldn&amp;#8217;t make it this year. Luckily, you can watch the entire day of talks right here. I am halfway through and have been inspired, great talks and great stuff to absorb in your daily life. http://new.livestream.com/tedx/TEDxSMU2012reTHiNK a few good ones: Pay it [...]</description>
         <author>Brandon</author>
         <guid isPermaLink="false">http://brandonbarber.net/?p=356</guid>
         <pubDate>Thu, 06 Dec 2012 04:43:54 +0000</pubDate>
         <content:encoded><![CDATA[<p>Typically I will attend TEDX SMU every year (this is the 4th) but couldn&#8217;t make it this year.<br />
Luckily, you can watch the entire day of talks right here. I am halfway through and have been inspired, great talks and great stuff to absorb in your daily life.</p>
<p><a rel="nofollow" title="TEDXSMU 2012 (City Performance Hall in Dallas)" target="_blank" href="http://new.livestream.com/tedx/TEDxSMU2012reTHiNK">http://new.livestream.com/tedx/TEDxSMU2012reTHiNK</a></p>
<p></p> 
<p>a few good ones:<br />
<a rel="nofollow" title="Pay it Forward Foundation" target="_blank" href="http://www.payitforwardfoundation.org">Pay it Forward Foundation </a></p>
<p><a rel="nofollow" title="Greg Harper" target="_blank" href="http://www.harpervision.tv/site/">Greg Parker</a></p>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Building a large-scale successful application under a hard deadline</title>
         <link>http://door64.com/blog/n/45181</link>
         <description>&lt;p&gt;It's a challenge for many teams, companies, and open source foundations.  How do we build something that works, handles large volumes, and is ready when needed?&lt;/p&gt;
&lt;p&gt;Well, this one was a success - &lt;a rel="nofollow" target="_blank" href="http://softwareandotherthings.blogspot.com/2012/11/success-of-narwhal.html"&gt;Narwhal&lt;/a&gt;, a software project undertaken by Obama campaign this year.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://door64.com/blog/n/45181"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">45181 at http://door64.com</guid>
         <pubDate>Tue, 27 Nov 2012 17:23:03 +0000</pubDate>
      </item>
      <item>
         <title>Need Holiday Cash? $$ Make a referral</title>
         <link>http://brandonbarber.net/archives/353</link>
         <description>A few openings in .NET, Java, SCCM/Windows, UX right now&amp;#8230; Ask me about our new referral program. We will pay out $500 for any referrals who get placed for at least 60 days. Referral Guidelines: 1. Referral does not already exist in our internal database. 2. Referral has not applied to one of our current [...]</description>
         <author>Brandon</author>
         <guid isPermaLink="false">http://brandonbarber.net/?p=353</guid>
         <pubDate>Wed, 21 Nov 2012 17:38:25 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong>A few openings in .NET, Java, SCCM/Windows, UX right now&#8230;</strong></p>
<p><strong>Ask me about our new referral program.</strong> We will pay out $500 for any referrals who get placed for at least 60 days.</p>
<p><strong>Referral Guidelines:</strong></p>
<p>1. Referral does not already exist in our internal database.</p>
<p>2. Referral has not applied to one of our current open positions in the last 60 days.</p>
<p>3. If the candidate you refer is hired for Improving or an external client through our Networked Recruiting, you will receive a referral award of $500 (gift card) after the employee has worked for 60 days.</p>
<p>4. *Anyone who is not a salaried Improving Enterprises employee or relative is eligible.</p>
<p>5. Referral program is effective between 7/15/12 and 12/31/13 and may be extended at the discretion of Improving Enterprises.</p>]]></content:encoded>
         <category>Recruiting</category>
      </item>
      <item>
         <title>Amazing solutions with an iPad</title>
         <link>http://door64.com/blog/n/45135</link>
         <description>&lt;p&gt;Gadgets may be cool, but they're only as useful as people make them.&lt;br /&gt;
Here are &lt;a rel="nofollow" target="_blank" href="http://softwareandotherthings.blogspot.com/2012/11/smart-technology-in-customer-service.html"&gt;some examples&lt;/a&gt; of very interesting business processes leveraging modern toys:&lt;br /&gt;
&lt;a rel="nofollow" target="_blank" href="http://softwareandotherthings.blogspot.com/2012/11/smart-technology-in-customer-service.html" title="http://softwareandotherthings.blogspot.com/2012/11/smart-technology-in-customer-service.html"&gt;http://softwareandotherthings.blogspot.com/2012/11/smart-technology-in-c...&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://door64.com/blog/n/45135"&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
         <author>Jane Prusakova</author>
         <guid isPermaLink="false">45135 at http://door64.com</guid>
         <pubDate>Wed, 21 Nov 2012 15:11:42 +0000</pubDate>
      </item>
   </channel>
</rss><!-- fe3.yql.bf1.yahoo.com compressed/chunked Sun May 26 00:27:45 UTC 2013 -->
