<?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:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
	<title>CodeBetter.Com Posts</title>
    
	<link>http://codebetter.com</link>
	<description>Stuff you need to Code Better!</description>
	<lastBuildDate>Tue, 27 Aug 2019 06:54:35 +0000</lastBuildDate>
		<language />
        <image>
		<url>http://codebetter.com/favicon.ico</url>
		<title>CodeBetter.Com Posts</title>
		<link>http://codebetter.com</link>
	</image>
    
<generator>http://wordpress.org/?v=4.2.2</generator>
	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/CodeBetter" /><feedburner:info uri="codebetter" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="https://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FCodeBetter" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FCodeBetter" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/CodeBetter" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FCodeBetter" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FCodeBetter" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FCodeBetter" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FCodeBetter" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
		<title>Learning how to develop GraphQL solutions with .NET</title>
		<link>http://codebetter.com/glennblock/2019/08/27/learning-how-to-develop-graphql-solutions-with-dotnet/</link>
		<comments>http://codebetter.com/glennblock/2019/08/27/learning-how-to-develop-graphql-solutions-with-dotnet/#comments</comments>
		<pubDate>Tue, 27 Aug 2019 06:54:35 +0000</pubDate>
		<dc:creator>Glenn Block</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET Core]]></category>
		<category><![CDATA[GraphQL]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/glennblock/?p=1019]]></guid>
		<description><![CDATA[If you are building a data-driven web or mobile application, then key concerns you need to address is how data will be surfaced to the client and how the client can update the state on the server. This is not a&#160;&#8230; <a href="http://codebetter.com/glennblock/2019/08/27/learning-how-to-develop-graphql-solutions-with-dotnet/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p><a href="http://codebetter.com/glennblock/files/2019/08/Screen-Shot-2019-08-26-at-11.04.33-PM1.png"><img class=" size-full wp-image-1016 aligncenter" src="http://codebetter.com/glennblock/files/2019/08/Screen-Shot-2019-08-26-at-11.04.33-PM1.png" alt="Screen Shot 2019-08-26 at 11.04.33 PM" width="600" height="94" /></a></p>
<p>If you are building a data-driven web or mobile application, then key concerns you need to address is how data will be surfaced to the client and how the client can update the state on the server. This is not a new problem, and one that we have been solving for decades.</p>
<p><a href="https://graphql.org/">GraphQL</a> provides one way to address this problem and uses an approach that provides significant benefits over previous RPC-based approaches. GraphQL was originally created at Facebook several years ago. It has been widely adopted since by Github, Concur, Airbnb and <a href="https://graphql.org/users/">more</a>. We&#8217;re even now adopting it at DocuSign. If you are doing React development, GraphQL has become the de-facto way to query from React clients.</p>
<h2>What is GraphQL?</h2>
<p>At its heart, GraphQL is several things.</p>
<ul>
<li>A schema that allows defining a structured view of data that will be surfaced to / queried / updated by a GraphQL client.</li>
<li>A query language for interacting with a GraphQL endpoint to retrieve, update, and subscribe to notifications.</li>
<li><a href="https://graphql.org/code/#tools">Tooling and SDKs </a>for building GraphQL clients and servers, or interacting with GraphQL endpoints such as the GraphiQL editor, clients like Apollo and Relay, servers like Apollo, GraphQL for .NET, and more.</li>
</ul>
<p>A few things that have stood out for me that I have really liked about GraphQL.</p>
<ul>
<li>It provides a standard way to query and update data including non-crud based actions. It supports &#8220;graphs&#8221; of data allowing queries to pull hierarchical data.</li>
<li>It puts power in UI teams hands to be able to hand craft queries with the data they need, without having to constantly send custom requests to the API team.</li>
<li>It has <a href="https://github.com/graphql/graphiql">GraphiQL</a> which is an awesome intellisense-driven tool for querying GraphQL endpoints that you can provide to developers for interacting with the endpoint.</li>
<li>It can work side by side with, and wrap existing &#8220;REST&#8221; APIs</li>
<li>It is not opinionated about where data resides, it is not bound to a database. Data  could live in MongoDB, SQL, in documents like S3/Azure Blob, or even in memory. It is really easy to make GraphQL work with any data store</li>
<li>It allows full control from the server-side as to what data is exposed.</li>
</ul>
<p>There are also plenty of <a href="https://goodapi.co/blog/rest-vs-graphql">tradeoffs</a> with GraphQL vs traditional APIs and it is not a silver bullet. Fortunately it is not mutually exclusive and can live side by side with &#8220;REST&#8221; APIs. Still you should go in with eyes open (as with any other technology or approach).</p>
<h2>GraphQL with .NET</h2>
<p>Yes you can develop GraphQL solutions with .NET! There are several open source projects that enable this, my favorite one being <a href="https://github.com/graphql-dotnet">GraphQL for .NET</a>. GraphQL for .NET lets you create GraphQL schemas and queries in C#, and then surface them via an ASP.NET core endpoint. It also provides a C# client which you can use to issue queries from an application such as as a Xamarin mobile client. All of the libraries are also available on NuGet. If you head to the GraphQL for .NET <a href="https://graphql-dotnet.github.io/docs/getting-started/introduction">documentation</a> you can find out more.</p>
<p>I&#8217;ve also created an ASP.NET Core example endpoint which can be ran on Windows, Mac or Linux which you can download from <a href="https://github.com/graphql-dotnet/example-orders">here</a>. The readme contains lots of example queries you can run using the GraphiQL editor that is built in.</p>
<h2>Check out my LinkedIn Learning Course</h2>
<p>If you are interested in learning more about GraphQL for .NET, you can also check out my LinkedIn Learning Course: <a href="https://www.linkedin.com/learning/api-development-in-dot-net-with-graphql/">API Development in .NET with GraphQL</a>. In the course I&#8217;ll take you through building the Orders GraphQL endpoint above from scratch in ASP.NET Core. I show you how to use GraphQL for .NET to define your schema, queries, and mutations, and subscriptions and expose them via ASP.NET Core. It&#8217;s heavily code based so you can follow along and build it with me. If you check out the course, let me know what you think.</p>
<h2>GraphQL is growing</h2>
<p>GraphQL is exploding in traction, with more and more companies adopting it as the standard. All signs are that will continue. It is exciting that this powerful ecosystem is available now to you as a .NET developer!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=tVBtlfQQ9QM:Jl6z-TJ3KPc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/glennblock/2019/08/27/learning-how-to-develop-graphql-solutions-with-dotnet/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/d372d9c0ab35dbe84c6d0a6902ae0594?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Glenn Block</media:title>
        </media:content>
    		</item>
	<item>
		<title>No Longer a Microsoft MVP–Hello MVP Reconnect</title>
		<link>http://codebetter.com/robreynolds/2019/07/01/no-longer-a-microsoft-mvp/</link>
		<comments>http://codebetter.com/robreynolds/2019/07/01/no-longer-a-microsoft-mvp/#comments</comments>
		<pubDate>Mon, 01 Jul 2019 18:02:42 +0000</pubDate>
		<dc:creator>Rob Reynolds</dc:creator>
				<category><![CDATA[chocolatey]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[mvp]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/robreynolds/?p=158]]></guid>
		<description><![CDATA[Today marks the first time in nearly a decade that I am no longer an MVP. I will be joining the MVP alum in the MVP Reconnect program. Getting the MVP award every year has become a great side benefit&#160;&#8230; <a href="http://codebetter.com/robreynolds/2019/07/01/no-longer-a-microsoft-mvp/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>Today marks the first time in nearly a decade that I am no longer an MVP. I will be joining the MVP alum in the MVP Reconnect program.</p>
<blockquote><p>Getting the MVP award every year has become a great side benefit and validation, but the real achievements have been in working with the community and all the things that we’ve accomplished over the last decade!</p></blockquote>
<p>When I first received the Microsoft MVP award in 2010, it was an achievement I had been working towards and it was something that really validated the work I was doing in the community. It was a goal I had set – to become a Microsoft MVP. When I got it, I was so excited and felt like Microsoft folks were really paying attention to what I was doing. Keep in mind back then that open source wasn’t even a contribution category, but I was doing a lot of talks in the community and working on the Chuck Norris Framework.</p>
<p>After achieving the award for the first time, my focus shifted to primarily doing great things in the community. A lot of that for the last few years has been hands on and I’ve been at the forefront of those efforts. And accordingly, Microsoft continued to validate that what I was doing was important and helpful for developers using Microsoft technologies.</p>
<p>Over the last few years, my role has shifted a bit to building a long term viable business to support the Chocolatey community. This means managing a business and building an amazing team that can help move my vision forward. This last year especially I’ve been focused in that effort of building a great team and that has meant that I’ve had less visible contributions. I’ve been focused enabling my team to do great things, and two of them <em><strong>are</strong></em> MVPs, which is fantastic!</p>
<p>I’m certainly very appreciative of my time as an MVP and have met a lot of amazing folks in the MVP community! I would have loved to have that 10 year blue disk, but Microsoft has rightly saw that my contributions over the last year have not been up to the standard of other folks out there and has made a proper decision on that front.</p>
<p>One thing I will miss is filling out the renewal paperwork every year as it forced me to take some time to reflect on all the great work we were doing in the community, and it put numbers to that work. I think I will look for my own time to do that reflection at some interval, hopefully a bit more often than annually. I always think of this <a href="https://www.imdb.com/title/tt0091042/" target="_blank">Ferris Bueller</a> quote when I take a moment to reflect. It’s certainly a great quote to apply to your life:</p>
<blockquote><p>“Life moves pretty fast. If you don’t stop and look around once in awhile, you could miss it.” – <a href="https://www.imdb.com/title/tt0091042/" target="_blank">Ferris Bueller’s Day Off</a></p></blockquote>
<p>Thank you Microsoft for the opportunity and validation over the years – I’m going to continue doing great things in the community and maybe that will bring me back to the MVP award, but maybe it won’t. And that is totally fine.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=Uybci09SQN0:Ja0fQ0zCSKM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/robreynolds/2019/07/01/no-longer-a-microsoft-mvp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/33a97150e4280a56c137fbfd763eb03d?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Rob Reynolds</media:title>
        </media:content>
    		</item>
	<item>
		<title>The Next Chapter</title>
		<link>http://codebetter.com/robreynolds/2017/01/25/the-next-chapter/</link>
		<comments>http://codebetter.com/robreynolds/2017/01/25/the-next-chapter/#comments</comments>
		<pubDate>Wed, 25 Jan 2017 08:37:13 +0000</pubDate>
		<dc:creator>Rob Reynolds</dc:creator>
				<category><![CDATA[chocolatey]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[chocolatey for business]]></category>
		<category><![CDATA[personal]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/robreynolds/?p=149]]></guid>
		<description><![CDATA[Six years ago I started working furiously on this little side project about package management for Windows. It started to grow and over time it became clear that it was going to be something important. A community flourished and there&#160;&#8230; <a href="http://codebetter.com/robreynolds/2017/01/25/the-next-chapter/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>Six years ago I started working furiously on this little side project about package management for Windows. It started to grow and over time it became clear that it was going to be something important. A community flourished and there was a tremendous uptake for this little tool.</p>
<p>Fast forward to present, starting soon I will be focused solely on Chocolatey as the Founder of Chocolatey Software, Inc*! It&#8217;s an exciting opportunity to really see where we can take this Windows software management thing!</p>
<p>I also could not have had the opportunity to move forward without the support of a tremendous community, who has contributed to Chocolatey&#8217;s success in many ways. Your support does not go unnoticed &#8211; we will continue to make open source improvements, along with ensuring that organizations can take Chocolatey to the next level with <a href="https://chocolatey.org/compare">Chocolatey for Business</a>.</p>
<p><img class="alignnone size-full wp-image-152" src="http://codebetter.com/robreynolds/files/2017/01/logo_square_slogan_300.png" alt="Chocolatey.IO - Software Management Automation" width="378" height="300" /></p>
<p>It&#8217;s a bit bittersweet as I&#8217;ve had the opportunity work with a lot of fantastic folks at Puppet and do some really awesome things for furthering automation on Windows. In many ways Puppet has been an amazing place to work (I highly recommend it, they have the remote employee situation handled). However, an opportunity to follow my first love, Chocolatey, is a dream I won&#8217;t pass up.</p>
<p>Not everyone gets the opportunity to follow their dreams, so when you get a chance it can be both a thrilling and scary experience! Here&#8217;s to the future of Chocolatey and Windows automation!</p>
<p>* &#8211; For those keeping track &#8211; Chocolatey Software was formed in November 2016 as a spin off of RealDimensions Software, LLC</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=TZ0wb2veAE8:GqAasQl5wYw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/robreynolds/2017/01/25/the-next-chapter/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/33a97150e4280a56c137fbfd763eb03d?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Rob Reynolds</media:title>
        </media:content>
    		</item>
	<item>
		<title>A new serverless adventure at Auth0</title>
		<link>http://codebetter.com/glennblock/2016/09/20/a-new-serverless-adventure-at-auth0/</link>
		<comments>http://codebetter.com/glennblock/2016/09/20/a-new-serverless-adventure-at-auth0/#comments</comments>
		<pubDate>Tue, 20 Sep 2016 04:17:31 +0000</pubDate>
		<dc:creator>Glenn Block</dc:creator>
				<category><![CDATA[serverless]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/glennblock/?p=1010]]></guid>
		<description><![CDATA[Last week was my last of a great ride at Splunk. I have now joined Auth0 working on a new developer-focused offering around Serverless compute, with Webtask. I&#8217;ve also started a new blog to discuss more broader topics on tech, startups etc. Read&#160;&#8230; <a href="http://codebetter.com/glennblock/2016/09/20/a-new-serverless-adventure-at-auth0/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>Last week was my <a href="https://medium.com/@gblock/a-new-beginning-9f2ad944bc8d#.b14937xf0">last</a> of a great ride at Splunk. I have now joined Auth0 working on a new developer-focused offering around Serverless compute, with <a href="https://webtask.io/">Webtask</a>. I&#8217;ve also started a new <a href="https://medium.com/@gblock/">blog</a> to discuss more broader topics on tech, startups etc.</p>
<p>Read more on what I am doing now <a href="https://medium.com/@gblock/adventures-in-serverless-at-auth0-39074b7d1c38#.6ylfydp5o">here</a>!</p>
<p>&nbsp;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=jIfUuR6xsVA:C3qX72gAsgM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/glennblock/2016/09/20/a-new-serverless-adventure-at-auth0/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/d372d9c0ab35dbe84c6d0a6902ae0594?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Glenn Block</media:title>
        </media:content>
    		</item>
	<item>
		<title>.NET Fringe is back!</title>
		<link>http://codebetter.com/glennblock/2016/06/17/net-fringe-is-back/</link>
		<comments>http://codebetter.com/glennblock/2016/06/17/net-fringe-is-back/#comments</comments>
		<pubDate>Fri, 17 Jun 2016 05:57:40 +0000</pubDate>
		<dc:creator>Glenn Block</dc:creator>
				<category><![CDATA[.net]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/glennblock/?p=991]]></guid>
		<description><![CDATA[And we&#8217;re back! Yes it&#8217;s true, .NET Fringe is back! We&#8217;re gathering back in Portland from July 10th through 12th for 3 days of unadulterated .NET OSS awesomeness. Last year we had a magical event, and we heard you tell&#160;&#8230; <a href="http://codebetter.com/glennblock/2016/06/17/net-fringe-is-back/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<h1>And we&#8217;re back!</h1>
<p><img class="alignnone" src="http://i.giphy.com/xT77XRlFIooQYQsy6A.gif" alt="" width="400" height="167" /></p>
<p>Yes it&#8217;s true, <a href="http://dotnetfringe.org/">.NET Fringe</a> is back! We&#8217;re gathering back in Portland from<strong> July 10th through 12th</strong> for 3 days of unadulterated .NET OSS awesomeness. Last year we had a <a href="https://joevetta.github.io/2015/04/16/dotnetfringe.html">magical event</a>, and we heard you tell us that you couldn&#8217;t wait for next year. So this year we&#8217;re back and we&#8217;re taking it up a notch! You can hear more about why we&#8217;re doing .NET Fringe and our plans for this year in our recent Channel 9 Interview.</p>
<p><a href="https://channel9.msdn.com/Events/NET-Fringe/NET-Fringe-2016/NET-Fringe-2016/player" target="_blank"><img class="alignleft wp-image-998 size-full" src="http://codebetter.com/glennblock/files/2016/06/Adron_2016-Jun-16.jpg" alt="Adron_2016-Jun-16" width="600" height="337" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>The Topics</h2>
<p>We&#8217;ve got a rich and diverse set of topics this year that is very timely and relevant to what is happening in the industry. Just look at the list!</p>
<ul>
<li>.NET Core</li>
<li>DevOps</li>
<li>Docker</li>
<li>Hadoop</li>
<li>IOT</li>
<li>Kubernetes</li>
<li>Linked Data</li>
<li>Microservices</li>
<li>Machine Learning</li>
<li>Mobile</li>
<li>Spark</li>
<li>Xamarin</li>
<li>JSON.NET</li>
<li>IOT</li>
<li>OSS Project Management</li>
</ul>
<h2>The Speakers</h2>
<p>And an excellent lineup of <a href="http://dotnetfringe.org/#speakers" target="_blank">speakers</a> starting with our keynotes. We are thrilled that the list includes Don Syme, the creator of F#!</p>
<p><img class="alignleft  wp-image-1002" src="http://codebetter.com/glennblock/files/2016/06/Screen-Shot-2016-06-16-at-8.24.28-PM.png" alt="Screen Shot 2016-06-16 at 8.24.28 PM" width="406" height="311" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2></h2>
<h2>Lightning Talks</h2>
<p>This year back by popular demand we&#8217;ll be having about 15 Lightning talks split across the two days. Got an idea you&#8217;d like to speak on, we&#8217;re <a href="https://github.com/dotnetfringe/dotnetfringe.github.io/wiki/Lightning-Talks">open</a> for submissions.</p>
<h2>Workshops</h2>
<p>Once again we&#8217;ll have workshops free for attendees on July 10th. Aaron Stannard is back with more AKKA.NET goodness, and we have several other workshops. Stay tuned to dotnetfringe.org.</p>
<h2>Everything else</h2>
<p>There&#8217;s a ton of other cool stuff, like another awesome <a href="http://www.mcmenamins.com/CrystalBallroom">venue</a>, the <a href="http://dotnetfringe.org/#geektrain">Geek Train</a> from Seattle, a bike ride around Portland, live music, some great food oh and <a href="http://dotnetfringe.org/#map">Portland</a>!</p>
<h2>Discounts for bloggers</h2>
<p>Are you wanting to attend .NET Fringe but are short on cash?</p>
<p>Go write a blog post (and no, not just a one liner) either about your .NET Fringe experience last year, or why you want to attend this year. Then follow @dotnetfringe, tweet with your blog post and include @dotnetfringe or #dotnetfringe. We&#8217;ll follow you back and then DM you a <strong>70% DISCOUNT CODE</strong>.</p>
<h2>Don&#8217;t wait</h2>
<p>.NET Fringe is around the corner. It&#8217;s going to be amazing. Go <a href="https://ti.to/dotnetfringe/dotnetfringe-2016">register</a> and come join us!</p>
<h2> <img class="alignnone" src="http://i.giphy.com/zE9Jh7QahXTb2.gif" alt="" width="380" height="285" /></h2>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=IMGQmqvqsBU:Mc03lgcXlpw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/glennblock/2016/06/17/net-fringe-is-back/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/d372d9c0ab35dbe84c6d0a6902ae0594?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Glenn Block</media:title>
        </media:content>
    		</item>
	<item>
		<title>Chocolatey For Business / Chocolatey Professional Coming May 2</title>
		<link>http://codebetter.com/robreynolds/2016/04/22/chocolatey-for-business-chocolatey-professional-coming-may-2/</link>
		<comments>http://codebetter.com/robreynolds/2016/04/22/chocolatey-for-business-chocolatey-professional-coming-may-2/#comments</comments>
		<pubDate>Sat, 23 Apr 2016 04:43:48 +0000</pubDate>
		<dc:creator>Rob Reynolds</dc:creator>
				<category><![CDATA[chocolatey]]></category>
		<category><![CDATA[news]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/robreynolds/?p=142]]></guid>
		<description><![CDATA[This is a very exciting time for Chocolatey! Over the past 5 years, there have been some amazing points in Chocolatey&#8217;s history. Now we are less than 10 days from another historical moment for Chocolatey &#8211; when licensed editions become&#160;&#8230; <a href="http://codebetter.com/robreynolds/2016/04/22/chocolatey-for-business-chocolatey-professional-coming-may-2/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p class="mc-toc-title">This is a very exciting time for Chocolatey! Over the past 5 years, there have been some amazing points in Chocolatey&#8217;s history. Now we are less than 10 days from another historical moment for Chocolatey &#8211; when licensed editions become available for purchase! This is the moment when we are able to offer features that enable businesses to better manage software through Chocolatey and offer non-free features to our community! This also marks when the community (and organizations) take the next step to ensure the longevity of Chocolatey for the next 10-20 years. I started this process with a dream and a <a href="https://www.kickstarter.com/projects/ferventcoder/chocolatey-the-alternative-windows-store-like-yum/description" target="_blank">Kickstarter</a> and now it&#8217;s finally coming to fruition!</p>
<h3 class="null">Features</h3>
<p>Here is a list of the licensed features that will be coming in May. I really think you are going to like what we&#8217;ve been cooking up:</p>
<ul>
<li>Malware protection / Virus scanning &#8211; Automatic protection from software flagged by multiple virus scanners &#8211; <a href="https://www.kickstarter.com/projects/ferventcoder/chocolatey-the-alternative-windows-store-like-yum/posts/1518468" target="_blank">Read more&#8230;</a></li>
<li>No more 404s &#8211; Alternate permanent download location for Professional customers. <a href="https://www.kickstarter.com/projects/ferventcoder/chocolatey-the-alternative-windows-store-like-yum/posts/1479944" target="_blank">Read more&#8230;</a></li>
<li>Integration with existing Antivirus &#8211; Great for businesses that don&#8217;t want to reach out to VirusTotal.</li>
<li>(Business Only) Create packages from software files/installers &#8211; Do you keep all the applications you install for your business internally somewhere? <strong>Chocolatey can automatically create packages for all the software your organization uses in under 5 minutes!</strong> &#8211; <a href="https://puppet.com/resources/on-demand-webinar/package-management-on-windows-chocolatey" target="_blank">Shown as a preview in a March webinar (fast forward to 36:45)</a></li>
<li>Install Directory Switch &#8211; You no longer need to worry about the underlying directives to send to native installers to install software into special locations. You can <strong>simply pass one directory switch to Chocolatey </strong>and it will handle this for you.</li>
<li>Support and prioritization of bugs and features for customers.</li>
</ul>
<h3 class="null">Sold! But How Do I Buy?</h3>
<p>While we are still getting the front end systems setup and ensuring all of the backend systems are in place and working properly, <strong>we are limiting availability to the first 500 professional licenses and 20 businesses</strong> (Note: we do not expect any issues with our payment processor). Because we are limiting availability, you must register for the <a href="https://chocolatey.eventbrite.com/" target="_blank">Go Live Event</a> at <a href="https://chocolatey.eventbrite.com/" target="_blank">https://chocolatey.eventbrite.com</a> if you are interested.</p>
<p>It bears repeating, the links for purchase will <em><strong>only</strong></em> be sent to folks who have registered for the event, so secure <a href="https://chocolatey.eventbrite.com/" target="_blank">your spot now</a>!</p>
<h4 class="null"></h4>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=j0naO_yzAns:4Eqk4zMVnDc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/robreynolds/2016/04/22/chocolatey-for-business-chocolatey-professional-coming-may-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/33a97150e4280a56c137fbfd763eb03d?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Rob Reynolds</media:title>
        </media:content>
    		</item>
	<item>
		<title>Chocolatey Has a New Logo!!!</title>
		<link>http://codebetter.com/robreynolds/2016/04/19/chocolatey-has-a-new-logo/</link>
		<comments>http://codebetter.com/robreynolds/2016/04/19/chocolatey-has-a-new-logo/#comments</comments>
		<pubDate>Tue, 19 Apr 2016 22:51:26 +0000</pubDate>
		<dc:creator>Rob Reynolds</dc:creator>
				<category><![CDATA[chocolatey]]></category>
		<category><![CDATA[news]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/robreynolds/?p=135]]></guid>
		<description><![CDATA[A designer started a conversation with us in December 2014 and we&#8217;ve recently come to a decision point on Chocolatey &#8211; a new logo (and soon a new website)! A special thanks goes out to Julian Krispel-Samsel!]]></description>
		<content:encoded><![CDATA[<p>A designer started a conversation with us in <a href="https://github.com/chocolatey/chocolatey/issues/640" target="_blank">December 2014</a> and we&#8217;ve recently come to a decision point on Chocolatey &#8211; a new logo (and soon a new website)! A special thanks goes out to <a href="https://github.com/juliankrispel" target="_blank">Julian Krispel-Samsel</a>!</p>
<p><a href="http://codebetter.com/robreynolds/files/2016/04/new_icon.png"><img class="alignnone wp-image-137" src="http://codebetter.com/robreynolds/files/2016/04/new_icon.png" alt="new_icon" width="300" height="264" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=ImOC-Q5Y4ws:pcr9T9_n4Cw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/robreynolds/2016/04/19/chocolatey-has-a-new-logo/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/33a97150e4280a56c137fbfd763eb03d?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Rob Reynolds</media:title>
        </media:content>
    		</item>
	<item>
		<title>Bash on Windows–What it Means for Chocolatey</title>
		<link>http://codebetter.com/robreynolds/2016/03/31/chocolatey-loves-apt-bash-on-windows/</link>
		<comments>http://codebetter.com/robreynolds/2016/03/31/chocolatey-loves-apt-bash-on-windows/#comments</comments>
		<pubDate>Thu, 31 Mar 2016 22:12:52 +0000</pubDate>
		<dc:creator>Rob Reynolds</dc:creator>
				<category><![CDATA[chocolatey]]></category>
		<category><![CDATA[apt]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows 10]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/robreynolds/?p=132]]></guid>
		<description><![CDATA[Microsoft announced the most amazing thing at //build/ yesterday, Bash on Windows 10. Not some sort of VM or container, but running native ELF binaries on Windows under an Ubuntu subsystem. Let me say that again slowly. Windows running native&#160;&#8230; <a href="http://codebetter.com/robreynolds/2016/03/31/chocolatey-loves-apt-bash-on-windows/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>Microsoft announced the most amazing thing at <a href="http://build.microsoft.com/">//build/</a> yesterday, <a href="http://www.hanselman.com/blog/DevelopersCanRunBashShellAndUsermodeUbuntuLinuxBinariesOnWindows10.aspx">Bash on Windows 10</a>. Not some sort of VM or container, but running native ELF binaries on <a href="http://blog.dustinkirkland.com/2016/03/ubuntu-on-windows.html">Windows under an Ubuntu subsystem</a>. Let me say that again slowly. Windows running native Linux binaries. Not recompiled. Go read <a title="http://blog.dustinkirkland.com/2016/03/ubuntu-on-windows.html" href="http://blog.dustinkirkland.com/2016/03/ubuntu-on-windows.html">http://blog.dustinkirkland.com/2016/03/ubuntu-on-windows.html</a>, I’ll wait. <img src="http://codebetter.com/robreynolds/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<blockquote><p>Linux geeks can think of it sort of the inverse of &#8220;wine&#8221; &#8212; Ubuntu binaries running natively in Windows.  Microsoft calls it their &#8220;Windows Subsystem for Linux&#8221; –Dustin Kirkland</p></blockquote>
<p>In case you missed the announcement, head to <a title="https://channel9.msdn.com/Events/Build/2016/KEY01" href="https://channel9.msdn.com/Events/Build/2016/KEY01">https://channel9.msdn.com/Events/Build/2016/KEY01</a> and fast forward to 48:15.</p>
<p>Almost immediately folks started asking what this means for Chocolatey. It’s a great question. Here’s the low down. This is fantastic for Chocolatey! You now have a fantastic way to get Unix apps and utilities with <span style="font-family: Consolas">dpkg</span>/<span style="font-family: Consolas">apt</span> in addition to great Windows apps and software with <span style="font-family: Consolas">choco</span>. More developers are going to be using the terminal to do things. It means more users of both apt and choco. More productivity for Windows users and developers. Think about that for a second. On no other platform will you have this ability. It’s an exciting time to be in Windows!</p>
<p>What you can expect to see is more collaboration between choco and apt if they can communicate. Just like you can work with <span style="font-family: Consolas">choco install -–source windowsfeatures</span> (back in the latest 0.9.10 betas!), expect to see <span style="font-family: Consolas">choco install rsync -–source apt</span>. <a title="https://github.com/chocolatey/choco/issues/678" href="https://github.com/chocolatey/choco/issues/678">https://github.com/chocolatey/choco/issues/678</a></p>
<p>Coming up soon you are going to see what’s coming in the next version of Chocolatey and why it is going to amaze you as another big leap in package management for Windows!</p>
<p>Here’s a preview with PowerShell tab completion and updating path (environment variables) without needing to restart PowerShell (<a title="https://raw.githubusercontent.com/wiki/chocolatey/choco/images/gifs/choco_install.gif" href="https://raw.githubusercontent.com/wiki/chocolatey/choco/images/gifs/choco_install.gif">https://raw.githubusercontent.com/wiki/chocolatey/choco/images/gifs/choco_install.gif</a> if the image doesn’t show):</p>
<p><img src="https://raw.githubusercontent.com/wiki/chocolatey/choco/images/gifs/choco_install.gif" alt="" /></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=FiM_cs3tQ90:HFbPuOqgJ2I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/robreynolds/2016/03/31/chocolatey-loves-apt-bash-on-windows/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/33a97150e4280a56c137fbfd763eb03d?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Rob Reynolds</media:title>
        </media:content>
    		</item>
	<item>
		<title>Celebrating 5 Years With Chocolatey!</title>
		<link>http://codebetter.com/robreynolds/2016/03/28/5-years-with-chocolatey/</link>
		<comments>http://codebetter.com/robreynolds/2016/03/28/5-years-with-chocolatey/#comments</comments>
		<pubDate>Mon, 28 Mar 2016 15:57:02 +0000</pubDate>
		<dc:creator>Rob Reynolds</dc:creator>
				<category><![CDATA[chocolatey]]></category>
		<category><![CDATA[boxstarter]]></category>
		<category><![CDATA[chef]]></category>
		<category><![CDATA[chocolateygui]]></category>
		<category><![CDATA[pester]]></category>
		<category><![CDATA[puppet]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/robreynolds/?p=126]]></guid>
		<description><![CDATA[Chocolatey turned 5 years old recently! I committed the first lines of Chocolatey code on March 22, 2011. At that time I never imagined that Chocolatey would grow into a flourishing community and a tool that is widely used by&#160;&#8230; <a href="http://codebetter.com/robreynolds/2016/03/28/5-years-with-chocolatey/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>Chocolatey turned <a href="https://twitter.com/ferventcoder/status/712410862611341312">5 years old recently</a>! I committed the first lines of Chocolatey code on <a href="https://github.com/ferventcoder/nugetpackages/commit/d16ed7ac675395b3bb8ecee90fb13efb03d4b619">March 22, 2011</a>. At that time I never imagined that Chocolatey would grow into a flourishing community and a tool that is widely used by individuals and organizations to help automate the wild world of Windows software. It&#8217;s come a long way since I first showed off early versions of Chocolatey to some friends for feedback. Over the last 2 years things have really taken off!</p>
<p>The number of downloads has really increased year over year!</p>
<p><a href="https://twitter.com/ferventcoder/status/700821290303623169"><img class="alignnone" src="https://pbs.twimg.com/media/CbnRP_CVIAETF3j.jpg:large" alt="Chocolatey usage by downloads over the years 2013-2015" width="644" height="475" /></a><br />
<span style="font-size: small"><strong>Note:</strong> While not a completely accurate representation of usage and popularity, the number of downloads gives a pretty good context. Going up by 7 million in 2014 and then by almost 30 million downloads in one year really shows a trend!</span></p>
<p><span style="font-size: small"><strong>Note:</strong> The Chocolatey package has about 1,000 downloads per hour. I shut off the statistics for the install script back in October 2015 due to the extreme load on the site, so the number of Chocolatey package downloads is missing some of the statistics.</span></p>
<h2>History</h2>
<p>Let’s take a little stroll through some of the interesting parts of Chocolatey’s history. The history of Chocolatey really starts when I joined the Nubular (Nu) team in summer 2010.</p>
<ul>
<li>July 2010 – <a href="https://www.youtube.com/watch?v=IvxAa4XURss">Nu (Package Management for .NET)</a> is reintroduced and quickly takes off in popularity (I also <a href="http://ferventcoder.com/archive/2010/07/15/gems---package-management-for-.net.aspx">wrote</a> <a href="http://ferventcoder.com/archive/2010/07/16/how-to---gems-and-.net.aspx">several</a> <a href="http://ferventcoder.com/archive/2010/07/17/how-to-ndash-gems-and-.net-ndash-dependencies-references.aspx">posts</a> <a href="http://ferventcoder.com/archive/2010/07/19/gems-for-.net-ndash-community-response.aspx">about</a> <a href="http://ferventcoder.com/archive/2010/07/26/the-future-of-.net-open-source-software-delivery.aspx">it</a>).</li>
<li>October 6, 2010 &#8211; <a href="http://ferventcoder.com/archive/2010/10/06/the-evolution-of-package-management-for-.net.aspx">NuGet is introduced</a>. The Nu team had joined up with Microsoft in late August to work on NuPack (as it was called then).</li>
<li>February 2011 &#8211; Joke with other folks on the NuGet team at MVP summit that if we ever introduced a machine package manager, we’d call it Chocolatey NuGet because it wouldn’t be vanilla NuGet packages.</li>
<li>March 21, 2011 – First lines of Chocolatey <a href="https://github.com/ferventcoder/nugetpackages/commit/d16ed7ac675395b3bb8ecee90fb13efb03d4b619">are committed</a>. The PowerShell version of Chocolatey represents the first public known use of PowerShell as an application and not just scripts and modules.</li>
<li>March 23, 2011 – First release of Chocolatey is <a href="https://www.nuget.org/packages/chocolatey/0.6.0">0.6.0</a>. I hope you were not using it that early. 😉</li>
<li>March 28, 2011 – I started talking about Chocolatey <a href="http://nuget.codeplex.com/discussions/251435">on the NuGet list</a>.</li>
<li>March 29, 2011 – <a href="https://twitter.com/ackenpacken">Svein Ackenhausen</a> coins the term “cinst” that would be the main call for choco until 2013.</li>
<li>April 1, 2011 – <a href="https://twitter.com/chriso">Chris Ortman</a> writes the <a href="https://chrisortman.wordpress.com/2011/04/01/getting-started-with-chocolatey/">first public blog post</a> about Chocolatey.</li>
<li>April 26, 2011 – I <a href="https://www.youtube.com/watch?v=N-hWOUL8roU">put up a video</a> showing Chocolatey installing 11 pieces of software. Pardon the music, it was swapped out from my original track.</li>
<li>September 2011 &#8211; Community Repository (<a href="https://chocolatey.org">https://chocolatey.org</a>) introduced.</li>
<li>September 7, 2011 – <a href="https://twitter.com/chrissie1">Christiaan Baes</a> writes a <a href="https://web.archive.org/web/20110926191629/http://blogs.lessthandot.com/index.php/DesktopDev/MSTech/chocolatey-gui">post about a side project</a> that is known as <a href="https://github.com/chocolatey/ChocolateyGUI#features">ChocolateyGUI</a>.</li>
<li>October 07, 2011 – A year after NuGet was introduced, I blog about <a href="http://ferventcoder.com/archive/2011/10/07/letrsquos-get-chocolatey-kind-of-like-apt-get-for-windows.aspx">Chocolatey for the first time</a>.</li>
<li>December 22, 2011 – <a href="https://twitter.com/anthonymastrean/">Anthony Mastrean</a> <a href="https://github.com/chocolatey/chocolatey/pull/43">introduces Pester</a> (a <a href="https://github.com/Pester/Pester">PowerShell BDD testing framework</a>) to Chocolatey.</li>
<li>March 2012 – Chocolatey is featured in the <a href="http://www.amazon.com/Pro-NuGet-Experts-Voice-Microsoft/dp/1430241918/">Pro Nuget Book</a>.</li>
<li>April 1, 2012 – <a href="https://twitter.com/mwrockx">Matt Wrock</a> <a href="https://github.com/mwrock/boxstarter/commit/2d96de030cf5f45b42690c3e01847f632b4e37e6">commits</a> the first lines of <a href="http://boxstarter.org/">BoxStarter</a>.</li>
<li>April 23, 2012 – After bouncing ideas off of <a href="https://twitter.com/dahlbyk">Keith Dahlby</a> and <a href="https://twitter.com/aaronlerch">Aaron Lerch</a>, I figure out how to do <a href="https://github.com/chocolatey/chocolatey/commit/3533d00a835c11aaba9aa3f34ff9d052496ff696#diff-48c72ff2102462265651d53d3d4e374f">mocking for PowerShell testing</a> (which Matt Wrock later puts into <a href="https://github.com/pester/Pester">Pester</a> proper). I also determine a proper way to structure a PowerShell application (function per file).</li>
<li>May 13, 2012 – <a href="https://twitter.com/rismoney">Rich Siegel</a> starts working on <a href="https://github.com/chocolatey/puppet-chocolatey/commit/1c5f52ea0f06d109a9c24ba803dbd924f74d66a4">Puppet integration</a>.</li>
<li>September 2012 – Chocolatey is featured on <a href="http://lifehacker.com/5942417/chocolatey-brings-lightning-quick-linux-style-package-management-to-windows">Lifehacker</a>.</li>
<li>October 4, 2012 – <a href="https://twitter.com/guilhemlettron">Guilhem Lettron</a> starts working on <a href="https://github.com/chocolatey/chocolatey-cookbook/commit/99e151ca271ba8bf0f1e200a363649ceebf66daa">Chef integration</a>.</li>
<li>October 19, 2012 – After <a href="https://github.com/pester/Pester/commit/84d5acbab1d809a121378048908dd2a8b2dfefc9">putting</a> <a href="https://github.com/pester/Pester/commit/ec77ceab7ba99bec93376ad6ca1f6f2d5dfc9d22">proper</a> <a href="https://github.com/pester/Pester/commit/4178c343a6574a8a9521be8a77006572fc49e311">mocking</a> <a href="https://github.com/pester/Pester/commit/dd7dca288bf5d7258532243687b3f6b6e4936af3">support</a> into <a href="https://github.com/pester/Pester">Pester</a>, Matt Wrock <a href="https://github.com/chocolatey/chocolatey/commit/654703b9d4388eb385776986ce6d0ee53485a146">retrofits Chocolatey</a> to use that.</li>
<li>January 2013 – <a href="https://github.com/chocolatey/choco/wiki/AutomaticPackages">Automatic packaging</a> is introduced.</li>
<li>February 13, 2013 – <a href="https://twitter.com/gep13">Gary Ewan Park</a> gives <a href="https://chocolatey.org/packages/ChocolateyGUI">ChocolateyGUI</a> a new home and <a href="https://github.com/chocolatey/ChocolateyGUI/commit/c722821573cafce6bfb50760618a8c1803e76e7f">takes over project maintenance</a>.</li>
<li>June 2013 – Community repo reaches <a href="http://ferventcoder.com/archive/2013/06/01/chocolatey-official-public-feed-now-has-1000-stable-packages.aspx">1,000 stable packages</a>.</li>
<li>October 2013 – Community repo surpasses 1 million downloads.</li>
<li>December 13, 2013 – First lines of the C# Chocolatey rewrite are <a href="https://github.com/chocolatey/choco/commit/b3dbcb851d95e9c0bd7f9f0438b7b087405e7e12">committed</a>.</li>
<li>February 6, 2014 – <a href="https://twitter.com/RichardSimp">Richard Simpson</a> joins Gary on <a href="https://chocolatey.org/packages/ChocolateyGUI">ChocolateyGUI</a> and <a href="https://github.com/chocolatey/ChocolateyGUI/commit/2d9bab432f58230f6c15f387608d58657201e536">commits the initial changes</a> for the modern version and look.</li>
<li>March 2014 – Microsoft validates the idea of Chocolatey.</li>
<li>July 2014 – The Chocolatey package itself surpasses <a href="https://twitter.com/ferventcoder/status/490992889036419072">1 million downloads</a>.</li>
<li>Sep 2014 – <a href="http://codebetter.com/robreynolds/2014/09/27/chocolatey-newsletter/">Introduced Chocolatey Newsletter</a>.</li>
<li>September 23, 2014 – I <a href="https://www.youtube.com/watch?v=cZl_wKSciVk">show</a> the first C# version of Chocolatey at a conference where my <a href="https://www.youtube.com/watch?v=cZl_wKSciVk">first demo uses choco from non-Windows</a>. There are a lot of murmurs in the crowd.</li>
<li>Oct 2014 – <a href="https://www.kickstarter.com/projects/ferventcoder/chocolatey-the-alternative-windows-store-like-yum">Kickstarter for Chocolatey</a> started.</li>
<li>Oct 2014 – <a href="http://codebetter.com/robreynolds/2014/10/27/chocolatey-now-has-package-moderation/">Community Feed Moderation turned on</a>. <a href="https://twitter.com/IntrepidPenguin" target="_blank">Thomas Walter</a> handles a lion&#8217;s share of moderation over 2015 so others can concentrate on the framework.</li>
<li>November 2014 – Chocolatey version 0.9.8.27 is the first package version alone with more than <a href="https://chocolatey.org/packages/chocolatey/0.9.8.27">1 million downloads</a>. A record that isn’t broken again until October 2015 when <a href="https://chocolatey.org/packages/chocolatey/0.9.9.8">0.9.9.8 has 5.6 million downloads</a>!</li>
<li>February 2015 – Community repository hits <a href="https://twitter.com/ferventcoder/status/568158076093763584">10 million downloads</a>.</li>
<li>March 3, 2015 – First C# Chocolatey version is <a href="https://chocolatey.org/packages/chocolatey/0.9.9">released</a>.</li>
<li>March 23, 2015 – <a href="https://twitter.com/dtgm1594">dtgm</a> <a href="https://github.com/dtgm/chocolatey-packages/commit/fcfa4c140253adc2b21eb2dfb886606e76fa6fdc#diff-5300e33986d291296548da9cd1586aa3">modernizes the automatic package</a> process to achieve high quality automatic packages with checksums.</li>
<li>October 2015 – CloudFlare and caching are introduced to the community repository to reduce pressure.</li>
<li>November 2015 – Memcached is introduced to the community repository for a single cache across load balancers.</li>
<li>December 2015 – Indexing is reintroduced to the community repository.</li>
<li>Q4 2015 – Introduced the <a href="http://codebetter.com/robreynolds/2016/01/16/chocolatey-community-update/">validator, the verifier, and the cleaner to the community feed</a> to assist in moderation.</li>
<li>January 2016 – Moderation backlog is <a href="http://codebetter.com/robreynolds/2016/01/16/chocolatey-community-update/">reduced to near zero</a> and is now manageable thanks to the automation.</li>
<li>February 1, 2016 – First Professional Licenses of Chocolatey are shipped to Kickstarters.</li>
<li>March 21, 2016 – CloudFlare caching tweaks introduced on the community repository to handle the increased pressure that will come from <a href="https://www.kickstarter.com/projects/ferventcoder/chocolatey-the-alternative-windows-store-like-yum/posts/1527031">tab completion for package names</a>.</li>
<li>March 23, 2016 – Virus scan results shown on the community repository for packages.</li>
</ul>
<p>This doesn’t represent everything that has happened. I tried to list out and attribute everything I could find and remember. There have been so many amazing package maintainers over the years, there are too many of you to possibly list. You know who you are. You have made the community what it is today and have been instrumental in shaping enhancements in Chocolatey.</p>
<h2>Looking to the Future</h2>
<p>The community has been amazing in helping Chocolatey grow and showing that there is a need that it fills. Package maintainers have put in countless and sometimes thankless hours to ensure community growth and consumers have really found the framework useful! Thank you so much! The next version of Chocolatey is coming and it is <a href="https://github.com/chocolatey/choco/blob/master/CHANGELOG.md">going to be amazing</a>. Here&#8217;s to the next 5 years, may we change the world of Windows forever!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=xMm9nToIifw:MxPmlnhVlGo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/robreynolds/2016/03/28/5-years-with-chocolatey/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/33a97150e4280a56c137fbfd763eb03d?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Rob Reynolds</media:title>
        </media:content>
    		</item>
	<item>
		<title>Why can’t you just communicate properly?</title>
		<link>http://codebetter.com/kylebaley/2016/01/28/why-cant-you-just-communicate-properly/</link>
		<comments>http://codebetter.com/kylebaley/2016/01/28/why-cant-you-just-communicate-properly/#comments</comments>
		<pubDate>Thu, 28 Jan 2016 17:42:17 +0000</pubDate>
		<dc:creator>Kyle Baley</dc:creator>
				<category><![CDATA[Sundry]]></category>
		<category><![CDATA[Communication]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/kylebaley/?p=326]]></guid>
		<description><![CDATA[Online communication bugs me. Actually, bugs isn&#8217;t accurate. Maybe saddens and fatigues. When volleying with people hiding behind their keyboard shield and protected by three timezones, you have to make a conscious effort to remain optimistic. It&#8217;s part of the&#160;&#8230; <a href="http://codebetter.com/kylebaley/2016/01/28/why-cant-you-just-communicate-properly/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>Online communication bugs me. Actually, <em>bugs</em> isn&#8217;t accurate. Maybe <em>saddens and fatigues</em>. When volleying with people hiding behind their keyboard shield and protected by three timezones, you have to make a conscious effort to remain optimistic. It&#8217;s part of the reason I haven&#8217;t taken to <a href="http://twitter.com/kyle_baley" target="_blank" rel="external">Twitter</a> as much as I probably should.</p>
<p><img class="pull-left" style="float: left;margin: 10px" src="https://upload.wikimedia.org/wikipedia/en/7/79/The_Simpsons-Jeff_Albertson.png" alt="" /></p>
<p>I&#8217;ve talked on this subject <a href="http://kyle.baley.org/2009/05/and-you-opened-your-mouthwhy-or-how-to-comment-for-the-greater-good/" target="_blank" rel="external">before</a> and it&#8217;s something I often have in the back of my mind when reading comments. It&#8217;s come to the forefront recently with some conversations we&#8217;ve had at Western Devs, which led to our most recent <a href="http://www.westerndevs.com/podcasts/Podcast-Is-Web-Development-Terrible/">podcast</a>. I wasn&#8217;t able to attend so here I am.</p>
<p>There are certain phrases you see in comments that automatically seem to devolve a discussion. They include:</p>
<ul>
<li>&#8220;Why don&#8217;t you just&#8230;&#8221;</li>
<li>&#8220;Sorry but&#8230;&#8221;</li>
<li>&#8220;Can&#8217;t you just&#8230;&#8221;</li>
<li>&#8220;It&#8217;s amazing that&#8230;&#8221;</li>
</ul>
<p>Ultimately, all of these phrases can be summarized as follows:</p>
<blockquote><p>I&#8217;m better than you and here&#8217;s why&#8230;</p></blockquote>
<p>In my younger years, I could laugh this off amiably and say &#8220;Oh this wacky world we live in&#8221;. But I&#8217;m turning 44 in a couple of days and it&#8217;s time to start practicing my crotchety, even if it means complaining about people being crotchety.</p>
<p>So to that end: I&#8217;m asking, nay, <em>begging</em> you to avoid these and similar phrases. This is for your benefit as much as the reader&#8217;s. These phrases don&#8217;t make you sound smart. Once you use them, it&#8217;s very unlikely anyone involved will feel better about themselves, let alone engage in any form of meaningful discussion. Even if you have a valid point, who wants to be talked down to like that? Have you completely forgot what it&#8217;s like to learn?</p>
<blockquote style="margin-bottom: 20px">
<div class="notice">&#8220;For fuck&#8217;s sake, Mom, why don&#8217;t you just type the terms you want to search for in the address bar instead of typing WWW.GOOGLE.COM into Bing?&#8221;</div>
</blockquote>
<p>Now I know (from experience) it&#8217;s hard to fight one&#8217;s innate sense of superiority and the overwhelming desire to make it rain down on the unwashed heathen. So take it in steps. After typing your comment, remove all instances of &#8220;just&#8221; (except when just means &#8220;recently&#8221; or &#8220;fair&#8221;, of course). The same probably goes for &#8220;simply&#8221;. It has more of a condescending tone than a dismissive one. &#8220;Actually&#8221; is borderline. Rule of thumb: Don&#8217;t start a sentence with it.</p>
<p>Once you have that little nervous tic under control, it&#8217;s time to remove the negatives. Here&#8217;s a handy replacement guide to get you started:</p>
<table>
<thead>
<tr>
<th>Original phrase</th>
<th>Replacement</th>
</tr>
</thead>
<tbody>
<tr>
<td>&#8220;Can&#8217;t you&#8221;</td>
<td>&#8220;Can you&#8221;</td>
</tr>
<tr>
<td>&#8220;Why don&#8217;t you&#8221;</td>
<td>&#8220;Can you&#8221;</td>
</tr>
<tr>
<td>&#8220;Sorry but&#8221;</td>
<td><em>no replacement; delete the phrase</em></td>
</tr>
<tr>
<td>&#8220;It&#8217;s amazing that&#8230;&#8221;</td>
<td><em>delete your entire comment and have a <a href="http://www.gocomics.com/bloomcounty/2008/12/03" target="_blank" rel="external">dandelion break</a></em></td>
</tr>
</tbody>
</table>
<div></div>
<p>See the difference? Instead of saying <em>Sweet Zombie Jayzus, you must be the stupidest person on the planet for doing it this way</em>, you&#8217;ve changed the tone to <em>Have you considered this alternative</em>? In both instances, you&#8217;ve made your superior knowledge known but in the second, it&#8217;s more likely to get acknowledged. More importantly, you&#8217;re less likely to look like an idiot when the response is: <em>I did consider that avenue and here are legitimate reasons why I decided to go a different route</em>.</p>
<p>To be fair, sometimes the author of the work you&#8217;re commenting on needs to be knocked down a peg or two themselves. I have yet to meet one of these people who respond well to <em>constructive </em><s>criticism</s> critique, let alone the <em>destructive</em> type I&#8217;m talking about here. Generally, I find they feel the need to cultivate an antagonistic personality but in my experience, they usually don&#8217;t have the black turtlenecks to pull it off. Usually, it ends up backfiring and their dismissive comments become too easy to dismiss over time.</p>
<p>Kyle the Inclusive</p>
<h5>Originally posted to: <a href="http://www.westerndevs.com/communication/Why-can-t-you-just/">http://www.westerndevs.com/communication/Why-can-t-you-just/</a></h5>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=XcyXkKN8zKk:VLUSD6Eufns:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/kylebaley/2016/01/28/why-cant-you-just-communicate-properly/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/12012c3732bd1a70449093d07fba76d0?s=96&amp;d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&amp;r=G" medium="image">
            <media:title type="html">Kyle Baley</media:title>
        </media:content>
    		</item>
	<item>
		<title>Chocolatey Community Feed Update!</title>
		<link>http://codebetter.com/robreynolds/2016/01/16/chocolatey-community-update/</link>
		<comments>http://codebetter.com/robreynolds/2016/01/16/chocolatey-community-update/#comments</comments>
		<pubDate>Sat, 16 Jan 2016 14:22:40 +0000</pubDate>
		<dc:creator>Rob Reynolds</dc:creator>
				<category><![CDATA[chocolatey]]></category>
		<category><![CDATA[news]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/robreynolds/?p=110]]></guid>
		<description><![CDATA[Average approval time for moderated packages is currently under 10 hours! In my last post, I talked about things we were implementing or getting ready to implement to really help out with the process of moderation.  Those things are: The validator&#160;&#8230; <a href="http://codebetter.com/robreynolds/2016/01/16/chocolatey-community-update/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<blockquote><p>Average approval time for moderated packages is currently under 10 hours!</p></blockquote>
<p>In <a href="http://codebetter.com/robreynolds/2015/12/18/chocolatey-community-state-of-union/">my last post</a>, I talked about things we were implementing or getting ready to implement to really help out with the process of moderation.  Those things are:</p>
<ul>
<li><a href="https://github.com/chocolatey/package-validator" target="_blank">The validator </a>&#8211; checks the quality of the package</li>
<li><a href="https://github.com/chocolatey/package-verifier" target="_blank">The verifier </a>&#8211; tests the package install/uninstall and provides logs</li>
<li><a href="https://github.com/chocolatey/package-cleanup" target="_blank">The cleaner</a> &#8211; provides reminders and closes packages under review when they have gone stale.</li>
</ul>
<h2>The Cleanup Service</h2>
<p>We&#8217;ve created a cleanup service, known as the cleaner that went into production recently.</p>
<ul>
<li>It looks for packages under review that have gone stale &#8211; defined as 20 or more days since last review and no progress</li>
<li>Sends a notice/reminder that the package is waiting for the maintainer to fix something and that if another 15 days goes by with no progress, the package will automatically be rejected.</li>
<li>15 days later if no progress is made, it automatically rejects packages with a nice message about how to pick things back up later when the maintainer is ready.</li>
</ul>
<h2>Current Backlog</h2>
<p>We&#8217;ve found that with all of this automation in place, the moderation backlog was quickly reduced and will continue to be manageable.</p>
<p>A visual comparison:</p>
<div id="attachment_103" style="width: 710px" class="wp-caption alignleft"><a href="http://codebetter.com/robreynolds/files/2015/12/moderation_backlog.png"><img class="wp-image-103" title="12/18/2015 - 1630 packages ready for a moderator" src="http://codebetter.com/robreynolds/files/2015/12/moderation_backlog.png" alt="12/18/2015 - 1630 packages ready for a moderator" width="700" height="84" /></a><p class="wp-caption-text">December 18, 2015 &#8211; 1630 packages ready</p></div>
<p>&nbsp;</p>
<div id="attachment_112" style="width: 710px" class="wp-caption alignnone"><a href="http://codebetter.com/robreynolds/files/2016/01/current_backlog_20160116.png"><img class="wp-image-112" title="01/01/2016 - 7 packages ready for a moderator. 7!" src="http://codebetter.com/robreynolds/files/2016/01/current_backlog_20160116.png" alt="01/01/2016 - 7 packages ready for a moderator" width="700" height="109" /></a><p class="wp-caption-text">January 16, 2016 &#8211; 7 packages ready</p></div>
<p>Note the improvements all around! The most important numbers to key in on are the first 3, they represent a waiting for reviewer to do something status. With the validator and verifier in place, moderation is much faster and more accurate, and the validator has increased package quality all around with its review!</p>
<p>The waiting for maintainer (927 in the picture above) represents the bulk of the total number of packages under moderation currently. These are packages that require an action on the part of the maintainer to actively move the package to approved. This is also where the clean up service comes in.</p>
<p>The cleaner sent 800+ reminders two days ago. If there is no response by early February on those packages, the waiting for maintainer status will drop significantly as those packages will automatically be rejected. Some of those packages have been waiting for maintainer action for over a year and are likely abandoned. If you are a maintainer and you have not been getting emails from the site, you should log in now and make sure your email address is receiving emails and that the messages are not going to your spam folder. A rejected package version is reversible, the moderators can put it back to submitted at any time when a maintainer is ready to work on moving the package towards approval again.</p>
<h2>Statistics</h2>
<p>This is where it really starts to get exciting.</p>
<p>Some statistics:</p>
<ul>
<li>Around 30 minutes after a package is submitted the validator runs.</li>
<li>Within 1-2 hours the verifier has finished testing the package and posts results.</li>
<li>Typical human review wait time after a package is deemed good is less than a day now.</li>
</ul>
<p>We&#8217;re starting to build statistics on average time to approval for packages that go through moderation that will be visible on the site.  Running some statistics by hand, we&#8217;ve approved 236 packages that have been created since January 1st, the average final good package (meaning that it was the last time someone submitted fixes to the package) to approval time has been 15 hours. There are some packages that drove that up due to fixing some things in our verifier and rerunning the tests. If I change to only looking at packages since those fixes have went in on the 10th, that is 104 packages with an average approval within 7 hours!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=BosqmEKOfRA:khd8RNiPcmE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/robreynolds/2016/01/16/chocolatey-community-update/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/33a97150e4280a56c137fbfd763eb03d?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Rob Reynolds</media:title>
        </media:content>
    		</item>
	<item>
		<title>Migrating from Jekyll to Hexo</title>
		<link>http://codebetter.com/kylebaley/2015/12/24/migrating-from-jekyll-to-hexo/</link>
		<comments>http://codebetter.com/kylebaley/2015/12/24/migrating-from-jekyll-to-hexo/#comments</comments>
		<pubDate>Fri, 25 Dec 2015 02:51:19 +0000</pubDate>
		<dc:creator>Kyle Baley</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Hexo]]></category>
		<category><![CDATA[Jekyll]]></category>
		<category><![CDATA[Western Devs]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/kylebaley/?p=323]]></guid>
		<description><![CDATA[WesternDevs has a shiny new look thanks to graphic designer extraodinaire, Karen Chudobiak. When implementing the design, we also decided to switch from Jekyll to Hexo. Besides having the opportunity to learn NodeJS, the other main reason was Windows. Most&#160;&#8230; <a href="http://codebetter.com/kylebaley/2015/12/24/migrating-from-jekyll-to-hexo/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p><a href="http://www.westerndevs.com">WesternDevs</a> has a shiny new look thanks to graphic designer extraodinaire, <a href="http://www.karenchudobiak.ca/" target="_blank" rel="external">Karen Chudobiak</a>. When implementing the design, we also decided to switch from Jekyll to Hexo. Besides having the opportunity to learn NodeJS, the other main reason was Windows. Most of us use it as our primary machine and Jekyll doesn&#8217;t officially support it. There are <a href="http://jekyll-windows.juthilo.com/" target="_blank" rel="external">instructions</a> available by people who were obviously more successful at it than we were. And there are even <a href="https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/" target="_blank" rel="external">simpler ones</a> that I discovered during the course of writing this post and that I wish existed three months ago.</p>
<p><img class="pull-right alignright" src="https://avatars2.githubusercontent.com/u/6375567?v=3&amp;s=200" alt="" /></p>
<p>Regardless, here we are and it&#8217;s already been a positive move overall, not least because the move to Node means more of us are available to help with the maintenance of the site. But it wasn&#8217;t without it&#8217;s challenges. So I&#8217;m going to outline the major ones we faced here in the hopes that it will help you make your decision more informed than ours was.</p>
<p>To preface this, note that I&#8217;m new to Node and in fact, this is my first real project with it. That said, I&#8217;m no expert in Ruby either, which is what Jekyll is written in. And the short version of my first impressions is: Jekyll feels more like a real product but I had an easier time customizing Hexo once I dug into it. Here&#8217;s the longer version</p>
<h2>DOCUMENTATION/RESOURCES</h2>
<p>You&#8217;ll run into this very quickly. Documentation for Hexo is decent but incomplete. And once you start Googling, you&#8217;ll discover many of the resources are in Chinese. I found very quickly that there is<code>posts</code> collection and that each post has a <code>categories</code> collection. But as to what these objects look like, I couldn&#8217;t tell. They aren&#8217;t arrays. And you can&#8217;t <code>JSON.stringify</code> them because they have circular references in them. <code>util.inspect</code> works but it&#8217;s not available everywhere.</p>
<h2>MULTI-AUTHOR SUPPORT</h2>
<p>By default, Hexo doesn&#8217;t support multiple authors. Neither does Jekyll, mind you, but we found a<a href="https://github.com/mmistakes/minimal-mistakes" target="_blank" rel="external">pretty complete</a> theme that does. In Hexo, there&#8217;s a <a href="https://www.npmjs.com/package/hexo-multiauthor" target="_blank" rel="external">decent package</a> that gets you partway there. It lets you specify an author ID on a post and it will attach a bunch of information to it. But you can&#8217;t, for example, get a full list of authors to list on a Who We Are page. So we created a separate data file for the authors. But we also haven&#8217;t figured out how to use that file to generate a .json file to use for the Featured section on the home page. So at the moment, we have author information in three places. Our temporary solution is to disallow anyone from joining or leaving Western Devs.</p>
<h2>CUSTOMIZATION</h2>
<p>If you go with Hexo and choose an <a href="https://hexo.io/themes/" target="_blank" rel="external">existing themes</a>, you won&#8217;t run into the same issues we did. Out of the box, it has good support for posts, categories, pagination, even things like tags and aliases with the <a href="https://hexo.io/plugins/" target="_blank" rel="external">right plugins</a>.</p>
<p>But we started from a design <em>and</em> were migrating from an existing site with existing URLs and had to make it work. I&#8217;ve mentioned the challenge of multiple authors already. Another one: maintaining our URLs. Most of our posts aren&#8217;t categorized. In Jekyll, that means they show up at the root of the site. In Hexo, that&#8217;s not possible. At least at the moment and I suspect this is a bug. We eventually had to fork Hexo itself to maintain our existing URLs.</p>
<p>Another challenge: excerpts. In Jekyll, excerpts work like this: Check the front matter for an <code>excerpt</code>. If one doesn&#8217;t exist, take the first few characters from the post. In Hexo, excerpts are empty by default. If you add a <code>&lt;!--more--&gt;</code> tag in your post, everything before that is considered an excerpt. If you specify an <code>excerpt</code> in your front matter, it&#8217;s ignored because there is already an <code>excerpt</code>property on your posts.</p>
<p>Luckily, there&#8217;s a <a href="https://github.com/lalunamel/hexo-front-matter-excerpt" target="_blank" rel="external">plugin</a> to address the last point. But it still didn&#8217;t address the issue of all our posts without an excerpt where we relied solely on the contents of the post.</p>
<p>So if you&#8217;re looking to veer from the scripted path, be prepared. More on this later in the &#8220;good parts&#8221; section.</p>
<h2>OVERALL FEELING OF RAWNESS</h2>
<p>This is more a culmination of the previous issues. It just feels like Hexo is a work-in-progress whereas Jekyll feels more like a finished product. There&#8217;s a strong community behind Jekyll and plenty of help. Hexo still has bugs that suggest it&#8217;s just not used much in the wild. Like <a href="https://github.com/hexojs/hexo-renderer-marked/issues/16" target="_blank" rel="external">rendering headers with links in them</a>. It makes the learning process a bit challenging because with Jekyll, if something didn&#8217;t work, I&#8217;d think <em>I&#8217;m obviously doing something wrong</em>. With Hexo, it&#8217;s <em>I might be doing something wrong or there might be a bug</em>.</p>
<hr />
<h2>THE GOOD PARTS</h2>
<p>I said earlier that the move to Hexo was positive overall and not just because I&#8217;m optimistic by nature. There are two key benefits we&#8217;ve gained just in the last two weeks.</p>
<h3>GENERATION TIME</h3>
<p>Hexo is fast, plain and simple. Our old Jekyll site took six seconds to generate. Doesn&#8217;t sound like much but when you&#8217;re working on a feature or tweaking a post, then saving, then refreshing, then rinsing, then repeating, that six seconds adds up fast. In Hexo, a full site generation takes three seconds. But more importantly, it is smart enough to do incremental updates while you&#8217;re working on it. So if you run <code>hexo server</code>, then see a mistake in your post, you can save it, and the change will be reflected almost instantly. In fact, it&#8217;s usually done by the time I&#8217;ve switched back to the browser.</p>
<h3>CONTRIBUTORS</h3>
<p>We had logistical challenges with Jekyll. To the point where we had two methods for Windows users that wanted to contribute (i.e. add a post). One involved a <a href="http://www.westerndevs.com/docker-and-western-devs/">Docker image</a> and the other <a href="http://www.westerndevs.com/using-azure-arm-to-deploy-a-docker-container/">Azure ARM</a>. Neither was ideal as they took between seconds and minutes to refresh if you made changes. Granted, both methods furthered our collective knowledge in both Docker and Azure but they both kinda sucked for productivity.</p>
<p>That meant that realistically, only the Mac users really contributed to the maintenance of the site. And our Docker/Azure ARM processes were largely ignored as we would generally just test in production. I.e. create a post, check it in, wait for the site to deploy, make necessary changes, etc, etc.</p>
<p>With the switch to Hexo, we&#8217;ve had no fewer than five contributors to the site&#8217;s maintenance already. Hexo just works on Windows. And on Mac. Best of both worlds.</p>
<h3>CUSTOMIZATION</h3>
<p>This is listed under the challenges but ever the optimist, I&#8217;m including it here as well. We&#8217;ve had to make some customizations for our site, including <a href="https://github.com/westerndevs/hexo" target="_blank" rel="external">forking Hexo</a> itself. And for me personally, once I got past the <em>why isn&#8217;t this working the way I want?</em> stage, it&#8217;s been a ton of fun. It&#8217;s crazy simple to muck around in the node modules to try stuff out. And just as simple to fork something and reference it in your project when the need arises. I mentioned an earlier issue rendering links in headers. No problem, we just swapped out the markdown renderer for <a href="https://github.com/celsomiranda/hexo-renderer-markdown-it" target="_blank" rel="external">another one</a>. And if that doesn&#8217;t work, we&#8217;ll tweak something until it does.</p>
<hr />
<p>I want to talk more on specific conversion issues we ran into as a guide to those following in our footsteps. But there are enough of them to warrant a follow up post without all this pre-amble. For now, we&#8217;re all feeling the love for Hexo. So much so that no less than three other Western Devs are in the process of converting their personal blogs to it.</p>
<h5>Originally posted to: <a href="http://www.westerndevs.com/jekyll/hexo/Migrating-from-Jekyll-to-Hexo/">http://www.westerndevs.com/jekyll/hexo/Migrating-from-Jekyll-to-Hexo/</a></h5>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=_MMGjBTFw2w:tYsVobWpghw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/kylebaley/2015/12/24/migrating-from-jekyll-to-hexo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/12012c3732bd1a70449093d07fba76d0?s=96&amp;d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&amp;r=G" medium="image">
            <media:title type="html">Kyle Baley</media:title>
        </media:content>
    		</item>
	<item>
		<title>Chocolatey Community Feed State of the Union</title>
		<link>http://codebetter.com/robreynolds/2015/12/18/chocolatey-community-state-of-union/</link>
		<comments>http://codebetter.com/robreynolds/2015/12/18/chocolatey-community-state-of-union/#comments</comments>
		<pubDate>Fri, 18 Dec 2015 16:08:17 +0000</pubDate>
		<dc:creator>Rob Reynolds</dc:creator>
				<category><![CDATA[chocolatey]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/robreynolds/?p=99]]></guid>
		<description><![CDATA[tl;dr: Everything on https://chocolatey.org/notice is coming to fruition! We&#8217;ve automatically tested over 6,500 packages, a validator service is coming up now to check quality and the unreviewed backlog has been reduced by 1,000 packages! We sincerely hope that the current&#160;&#8230; <a href="http://codebetter.com/robreynolds/2015/12/18/chocolatey-community-state-of-union/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p class="p1"><b>tl;dr:</b> Everything on <a href="https://chocolatey.org/notice"><span class="s1">https://chocolatey.org/notice</span></a> is coming to fruition! We&#8217;ve automatically tested over 6,500 packages, a validator service is coming up now to check quality and the unreviewed backlog has been reduced by 1,000 packages! We sincerely hope that the current maintainers who have been waiting weeks and months to get something reviewed can be understanding that we’ve dug ourselves into a moderation mess and are currently finding our way out of this situation.</p>
<p class="p1"><a href="https://chocolatey.org/notice"><img class="alignnone wp-image-101" title="Notice on Chocolatey.org" src="http://codebetter.com/robreynolds/files/2015/12/choco_notice.png" alt="Notice on Chocolatey.org" width="640" height="304" /></a><br />
We’ve added a few things to <a href="https://chocolatey.org">Chocolatey.org</a> (the community feed) to help speed up review times for package maintainers. A little over a year ago we introduced <a href="https://github.com/chocolatey/choco/wiki/ChocolateyFAQs#what-is-moderation"><span class="s1">moderation</span></a> for all new package versions (besides <a href="https://github.com/chocolatey/choco/wiki/ChocolateyFAQs#what-is-a-trusted-package"><span class="s1">trusted packages</span></a>) and from the user perspective it has been a fantastic addition. The usage has went up by over 20 million packages installed in one year versus just 5 million the 3 years before it! It’s been an overwhelming response for the user community. Let me say that again for effect: Chocolatey’s usage of community packages has increased 400% in one year over the prior three years combined!</p>
<p class="p1">But let’s be honest, we’ve nearly failed in another area. Keeping the moderation backlog low. We introduced moderation as a security measure for Chocolatey’s community feed because it was necessary, but we introduced it too early. We didn’t have the infrastructure automation in place to handle the sheer load of packages that were suddenly thrown at us. And once we put moderation in place, more folks wanted to use Chocolatey so it suddenly became much more popular. And because we have automation surrounding updating and pushing packages (namely automatic packages), we had some folks who would submit 50+ packages at a time. With one particular maintainer submitting 200 packages automatically, and a review of each of them taking somewhere between 2-10 minutes, you don’t have to be a detective to understand how this is going to become a consternation. And from the backlog you can see it really hasn’t worked out well.</p>
<p class="p1"><a href="http://codebetter.com/robreynolds/files/2015/12/moderation_backlog.png"><img class="alignnone wp-image-103" title="1597 submitted" src="http://codebetter.com/robreynolds/files/2015/12/moderation_backlog.png" alt="1597 submitted" width="700" height="84" /></a></p>
<p class="p1">The most important number to understand here is the number in the submitted (underlined). This is the number of packages where a moderator has not yet looked at a package. A goal is to keep this well under 100. We want that time from a high quality package getting submitted to approved within 1-2 days.</p>
<p class="p1">Moderation has up until recently been a very manual process. Sometimes depending on which moderator that looked at your package determined whether it was going to be held in review for various reasons. We’ve added moderators and we’ve added more <a href="https://github.com/chocolatey/choco/wiki/Moderation"><span class="s1">guidance around moderation</span></a> to help bring a more structured review process. But it’s not enough.</p>
<p class="p1">Some of you may not know this, but our moderators are volunteers and we currently lack full-time employees to help fix many of the underlying issues. Even considering that we’ve also needed to work towards Kickstarter delivery and the Chocolatey rewrite (making choco better for the long term), it’s still not the greatest news to know that it has taken a long time to fix moderation, but hopefully it brings some understanding. Our goal is to eventually bring on full-time employees but we are not there yet. The Kickstarter was a start, but it was just that. A kick start. A few members of the core team who are also moderators have focused on ensuring the Kickstarter turns into a model that can ensure the longevity of Chocolatey. It may have felt that we have been ignoring the needs of the community, but that has not been our intention at all. It’s just been really busy and we needed to address multiple areas surrounding Chocolatey with a small number of volunteers.</p>
<h2 class="p3"><b>So What Have We Fixed?</b></h2>
<p class="p1"><b>All moderation review communication is done on the package page.</b> Now all review is done on the website, which means that there is no email back and forth (the older process) and what looks like one-sided communication on the site. This is a significant improvement.</p>
<p class="p1"><b>Package review logging.</b> Now you can see right from the discussion when and who submits package, when statuses change and where the conversation is.</p>
<p class="p1"><a href="http://codebetter.com/robreynolds/files/2015/12/review_logging.png"><img class="alignnone wp-image-104" title="package review logging" src="http://codebetter.com/robreynolds/files/2015/12/review_logging.png" alt="package review logging" width="640" height="410" /></a></p>
<p class="p1"><b>More moderators.</b> A question that comes up quite a bit surrounds the number of moderators that we have and adding more. We have added more moderators. We are up to 12 moderators for the site. Moderators are chosen based on building trust, usually through being extremely familiar with Chocolatey packaging and what is expected of approved packages. Learning what is expected usually comes through having your own packages approved and having a few packages. We’ve written most of this up at <a href="https://github.com/chocolatey/choco/wiki/Moderation"><span class="s1">https://github.com/chocolatey/choco/wiki/Moderation</span></a>.</p>
<p class="p1"><b>Maintainers can self-reject packages</b> that no longer apply. Say your package has a download url for the software that is always the same. You have some older package versions that could take advantage of being purged out of the queue since they are no longer applicable.</p>
<p class="p1"><b>The package validation service</b> (<a href="https://github.com/chocolatey/package-validator"><span class="s1">the validator</span></a>). The validator checks the quality of a package based on requirements, guidelines and suggestions for creating packages for Chocolatey’s community feed. Many of the validation items will automatically roll back into choco and will be displayed when packaging a package. We like to think of the validator as unit testing. It is validating that everything is as it should be and meets the minimum requirements for a package on the community feed.</p>
<p class="p1"><a href="http://codebetter.com/robreynolds/files/2015/12/validated.png"><img class="alignnone wp-image-105" title="validation results" src="http://codebetter.com/robreynolds/files/2015/12/validated.png" alt="validation results" width="528" height="480" /></a></p>
<p class="p1"><b>The package verifier service</b> (<a href="https://github.com/chocolatey/package-verifier"><span class="s1">the verifier</span></a>). The verifier checks the correctness (that the package actually works), that it installs and uninstalls correctly, has the right dependencies to ensure it is installed properly and can be installed silently. The verifier runs against both submitted packages and existing packages (checking every two weeks that a package can still install and sending notice when it fails). We like to think of the verifier as integration testing. It’s testing all the parts and ensuring everything is good. On the site, you can see the current status of a package based on a little colored ball next to the title. If the ball is green or red, the ball is a link to the results (only on the package page, not in the list screen).</p>
<p class="p1"><a href="http://codebetter.com/robreynolds/files/2015/12/verified_green_ball.png"><img class="alignnone wp-image-106 size-full" title="passed verification - green colored ball with link" src="http://codebetter.com/robreynolds/files/2015/12/verified_green_ball.png" alt="passed verification - green colored ball with link" width="597" height="91" /></a></p>
<ul>
<li class="p4">Green means good. The ball is a link to the results</li>
<li class="p4">Orange if still pending verification (has not yet run).</li>
<li class="p4">Red means it failed verification for some reason. The ball is a link to the results.</li>
<li class="p4">Grey means unknown or excluded from verification (if excluded, a reason will be listed on the package page).</li>
</ul>
<p class="p1">Coming Soon &#8211; <b>Moderators will be automatically be assigned to backlog items</b>. Once a package passes both validation and verification, a moderator is automatically assigned to review the package. Once the backlog is in a manageable state, this will be added.</p>
<h2 class="p3"><b>What About Maintainer Drift?</b></h2>
<p class="p1">Many maintainers come in to help out at different times in their lives and they do it nearly always as volunteers. Sometimes it is the tools they are using at the current time and sometimes it has to do with where they work. Over time folks’ preferences/workplaces change and so maintainers drift away from keeping packages up to date because they have no internal incentive to continue to maintain those packages. It’s a natural human response. I&#8217;ve been thinking about ways to reduce maintainer drift for the last three years and I keep coming back to the idea that consumers of those packages could come along and provide a one time or weekly tip to the maintainer(s) as a thank you for keeping package(s) updated. We are talking to Gratipay now &#8211; <a href="https://github.com/gratipay/inside.gratipay.com/issues/441"><span class="s1">https://github.com/gratipay/inside.gratipay.com/issues/441</span></a> This, in addition to a reputation system, I feel will go a long way to help reduce maintainer drift.</p>
<h2 class="p3"><b>Final Thoughts</b></h2>
<p class="p1">Package moderation review time is down to mere seconds as opposed to minutes like before. This will allow a moderator to review and approve package versions much more quickly and will reduce our backlog and keep it lower.</p>
<p class="p1"><b>It’s already working!</b> The number in the unreviewed backlog are down by 1,000 from the month prior. This is because a moderator doesn’t have to wait until a proper time when they can have a machine up and ready for testing and in the right state. Now packages can be reviewed faster. This is only with the verifier in place, sheerly testing package installs. The validator expects to cut that down to near seconds of review time. The total number of packages in the moderation backlog have also been reduced, but honestly I only usually pay attention to the unreviewed backlog number as it is the most important metric for me.</p>
<p class="p1">The verifier has rolled through over 6,500 verifications to date! <a href="https://gist.github.com/choco-bot/"><span class="s1">https://gist.github.com/choco-bot/</span></a></p>
<p class="p1"><a href="http://codebetter.com/robreynolds/files/2015/12/chocobot_verified.png"><img class="alignnone wp-image-102 size-full" title="When chocobot hit 6500 packages verified" src="http://codebetter.com/robreynolds/files/2015/12/chocobot_verified.png" alt="When chocobot hit 6500 packages verified" width="422" height="255" /></a></p>
<p class="p1">We sincerely hope that the current maintainers who have been waiting weeks and months to get something reviewed can be understanding that we’ve dug ourselves into a moderation mess and are currently finding our way out of this situation. We may have some required findings and will ask for those things to be fixed, but for anything that doesn&#8217;t have required findings, we will approve them as we get to them.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=pTEQCtT2jJ0:jgPaD4RtGOQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/robreynolds/2015/12/18/chocolatey-community-state-of-union/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/33a97150e4280a56c137fbfd763eb03d?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Rob Reynolds</media:title>
        </media:content>
    		</item>
	<item>
		<title>Testing with Data</title>
		<link>http://codebetter.com/kylebaley/2015/11/19/testing-with-data/</link>
		<comments>http://codebetter.com/kylebaley/2015/11/19/testing-with-data/#comments</comments>
		<pubDate>Fri, 20 Nov 2015 00:04:04 +0000</pubDate>
		<dc:creator>Kyle Baley</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/kylebaley/?p=318]]></guid>
		<description><![CDATA[It’s not a coincidence that this is coming off the heels of Dave Paquette’s post on GenFu and Simon Timms’ post on source control for databases in the same way it was probably not a coincidence that Hollywood released three&#160;&#8230; <a href="http://codebetter.com/kylebaley/2015/11/19/testing-with-data/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>It’s not a coincidence that this is coming off the heels of Dave Paquette’s <a href="http://www.westerndevs.com/realistic-sample-data-with-genfu/">post on GenFu</a> and Simon Timms’ <a href="http://www.westerndevs.com/source-control-for-sql-databases/">post on source control for databases</a> in the same way it was probably not a coincidence that Hollywood released three body-swapping movies in the 1987-1988 period (four if you include Big).</p>
<p>I was asked recently for some advice on generating data for use with integration and UI tests. I already have some ideas but asked the rest of the Western Devs for some elucidation. My tl;dr version is the same as what I mentioned in our <a href="http://www.westerndevs.com/on-ui-testing/">discussion on UI testing</a>: it’s hard. But manageable. Probably.</p>
<p>The solution needs to balance a few factors:</p>
<ul>
<li>Each test must start from a predictable state</li>
<li>Creating that predictable state should be fast as possible</li>
<li>Developers should be able to figure out what is going on by reading the test</li>
</ul>
<p>The two options we discussed both assume the first factor to be immutable. That means you either clean up after yourself when the test is finished or you wipe out the database and start from scratch with each test. Cleaning up after yourself might be faster but has more moving parts. Cleaning up might mean different things depending on which step you’re in if the test fails.</p>
<p>So given that we will likely re-create the database from scratch before each and every test, there are two options. My <em>current</em> favourite solution is a hybrid of the two.</p>
<h3 id="maintain-a-database-of-known-data">Maintain a database of known data</h3>
<p>In this option, you have a pre-configured database. Maybe it’s a SQL Server .bak file that you restore before each test. Maybe it’s a <code>GenerateDatabase</code> method that you execute. I’ve done the latter on a Google App Engine project, and it works reasonably well from an implementation perspective. We had a class for each domain aggregate and used dependency injection. So adding a new test customer to accommodate a new scenario was fairly simple. There are a number of other ways you can do it, some of which Simon touched on in his post.</p>
<p>We also had it set up so that we could create only the customer we needed for that particular test if we needed to. That way, we could use a step like<code>Given I'm logged into 'Christmas Town'</code> and it would set up only that data.</p>
<p>There are some drawbacks to this approach. You still need to create a new class for a new customer if you need to do something out of the ordinary. And if you need to do something only <em>slightly</em> out of the ordinary, there’s a strong tendency to use an existing customer and tweak its data ever so slightly to fit your test’s needs, other tests be damned. With these tests falling firmly in the <em>long-running</em> category, you don’t always find out the effects of this until much later.</p>
<p>Another drawback: it’s not obvious in the test exactly what data you need for that specific test. You can accommodate this somewhat just with a naming convention. For example,<code>Given I'm logged into a company from India</code>, if you’re testing how the app works with rupees. But that’s not always practical. Which leads us to the second option.</p>
<h3 id="create-an-api-to-set-up-the-data-the-way-you-want">Create an API to set up the data the way you want</h3>
<p>Here, your API contains steps to fully configure your database exactly the way you want. For example:</p>
<div class="highlight">
<pre><code class="language-cucumber"><span class="k">Given </span><span class="nf">I have a company named "</span><span class="s">Christmas Town</span><span class="nf">" owned by "</span><span class="s">Jack Skellington</span><span class="nf">"</span>
<span class="k">And </span><span class="nf">I have </span><span class="s">5</span><span class="nf"> product categories</span>
<span class="k">And </span><span class="nf">I have </span><span class="s">30</span><span class="nf"> products</span>
<span class="k">And </span><span class="nf">I have a customer</span>
<span class="nf">...</span></code></pre>
</div>
<p>&nbsp;</p>
<p>You can probably see the major drawback already. This can become <em>very</em> verbose. But on the other hand, you have the advantage of seeing exactly what data is included which is helpful when debugging. If your test data is wrong, you don’t need to go mucking about in your source code to fix it. Just update the test and you’re done.</p>
<p>Also note the lack of specifics in the steps. Whenever possible, I like to be very vague when setting up my test data. If you have a <a href="http://genfu.io/">good framework for generating test data</a>, this isn’t hard to do. And it helps uncover issues you may not account for using hard-coded data (as anyone named D’Arcy O’Toole can probably tell you).</p>
<hr />
<p>Loading up your data with a granular API isn’t realistic which is why I like the hybrid solution. By default, you pre-load your database with <em>some</em> common data, like lookup tables with lists of countries, currencies, product categories, etc. Stuff that needs to be in place for the majority of your tests.</p>
<p>After that, your API doesn’t need to be that granular. You can use something like<code>Given I have a basic company</code> which will create the company, add an owner and maybe some products and use that to test the process for creating an order. Under the hood, it will probably use the specific steps.</p>
<p>One reason I like this approach: it hides only the details you don’t care about. When you say<code>Given I have a basic company and I change the name to "Rick's Place"</code>, that tells me, “I don’t care how the company is set up but the company name is important”. Very useful to help narrow the focus of the test when you’re reading it.</p>
<p>This approach will understandably lead to a whole bunch of different methods for creating data of various sizes and coarseness. And for that you’ll need to…</p>
<h3 id="maintain-test-data">Maintain test data</h3>
<p>Regardless of your method, maintaining your test data will require constant vigilance. In my experience, there is a tremendous urge to take shortcuts when it comes to test data. You’ll re-use a test company that doesn’t quite fit your scenario. You’ll alter your test to fit the data rather than the other way around. You’ll duplicate a data setup step because your API isn’t discoverable.</p>
<p>Make no mistake, maintaining test data is work. It should be treated with the same respect and care as the rest of your code. Possibly more so since the underlying code (in whatever form it takes) technically won’t be tested. Shortcuts and bad practices should <em>not</em> be tolerated and let go because “it’s just test data”. Fight the urge to let things slide. Call it out as soon as you see it. Refactor mercilessly once you see opportunities to do so.</p>
<p>Don’t be afraid to flip over a table or two to get your point across.</p>
<p>– Kyle the Unmaintainable</p>
<div style="font-size: 9pt">Originally posted to: <a href="http://www.westerndevs.com/testing-with-data/">http://www.westerndevs.com/testing-with-data</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=6l1bspO8ve4:OsPs2UqvOW4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/kylebaley/2015/11/19/testing-with-data/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/12012c3732bd1a70449093d07fba76d0?s=96&amp;d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&amp;r=G" medium="image">
            <media:title type="html">Kyle Baley</media:title>
        </media:content>
    		</item>
	<item>
		<title>Running a .NET app against a Postgres database in Docker</title>
		<link>http://codebetter.com/kylebaley/2015/10/25/running-a-net-app-against-a-postgres-database-in-docker/</link>
		<comments>http://codebetter.com/kylebaley/2015/10/25/running-a-net-app-against-a-postgres-database-in-docker/#comments</comments>
		<pubDate>Sun, 25 Oct 2015 17:32:59 +0000</pubDate>
		<dc:creator>Kyle Baley</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Presenting]]></category>
		<category><![CDATA[Western Devs]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/kylebaley/?p=314]]></guid>
		<description><![CDATA[Some days/weeks/time ago, I did a presentation at MeasureUP called “Docker For People Who Think Docker Is This Weird Linux Thing That Doesn’t Impact Me”. The slides for that presentation can be found here and the sample application here. Using&#160;&#8230; <a href="http://codebetter.com/kylebaley/2015/10/25/running-a-net-app-against-a-postgres-database-in-docker/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<div class="headline-wrap">
<p>Some days/weeks/time ago, I did a presentation at MeasureUP called “Docker For People Who Think Docker Is This Weird Linux Thing That Doesn’t Impact Me”. The slides for that presentation can be found <a href="http://www.slideshare.net/KyleBaley/docker-for-people-who-have-heard-of-docker-but-think-its-just-this-weird-linux-thing-that-doesnt-impact-me">here</a> and the sample application <a href="https://github.com/stimms/AzureCodeCamp">here</a>.</p>
</div>
<div class="article-wrap">
<h2 id="using-the-sample-app-with-postgresql">Using the sample app with PostgreSQL</h2>
<p>The sample application is just a plain ol’ .NET application. It is meant to showcase different ways of doing things. One of those things is data access. You can configure the app to access the data from SQL storage, Azure table storage, or in-memory. By default, it uses the in-memory option so you can clone the app and launch it immediately just to see how it works.</p>
<p><img src="http://i.imgur.com/xeKON0u.png" alt="PancakeProwler" /></p>
<p>Quick summary: Calgary, Alberta hosts an annual event called the <a href="http://www.calgarystampede.com/">Calgary Stampede</a>. One of the highlights of the 10-ish day event is the pancake breakfast, whereby dozens/hundreds of businesses offer up pancakes to people who want to eat like the pioneers did, assuming the pioneers had pancake grills the size of an Olympic swimming pool.</p>
<p>The sample app gives you a way to enter these pancake breakfast events and each day, will show that day’s breakfasts on a map. There’s also a recipe section to share pancake recipes but we won’t be using that here.</p>
<p>To work with Docker we need to set the app up to use a data access mechanism that will work on Docker. The sample app supports Postgres so that will be our database of choice. Our first step is to get the app up and running locally with Postgres <em>without</em> Docker. So, assuming you have Postgres installed, find the <code>ContainerBuilder.cs</code> file in the <code>PancakeProwler.Web</code> project. In this file, comment out the following near the top of the file:</p>
<pre class="highlight"><code class="language-c#"><span class="c1">// Uncomment for InMemory Storage</span>
<span class="n">builder</span><span class="p">.</span><span class="n">RegisterAssemblyTypes</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Data</span><span class="p">.</span><span class="n">InMemory</span><span class="p">.</span><span class="n">Repositories</span><span class="p">.</span><span class="n">RecipeRepository</span><span class="p">).</span><span class="n">Assembly</span><span class="p">)</span>
       <span class="p">.</span><span class="n">AsImplementedInterfaces</span><span class="p">()</span>
       <span class="p">.</span><span class="n">SingleInstance</span><span class="p">();</span></code></pre>
<p>And uncomment the following later on:</p>
<div class="highlight">
<pre><code class="language-c#"><span class="c1">// Uncomment for PostgreSQL storage</span>
<span class="n">builder</span><span class="p">.</span><span class="n">RegisterAssemblyTypes</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">PancakeProwler</span><span class="p">.</span><span class="n">Data</span><span class="p">.</span><span class="n">Postgres</span><span class="p">.</span><span class="n">IPostgresRepository</span><span class="p">).</span><span class="n">Assembly</span><span class="p">)</span>
    <span class="p">.</span><span class="n">AsImplementedInterfaces</span><span class="p">().</span><span class="n">InstancePerRequest</span><span class="p">().</span><span class="n">PropertiesAutowired</span><span class="p">();</span></code></pre>
</div>
<p>This configures the application to use Postgres. You’ll also need to do a couple of more tasks:</p>
<ul>
<li>Create a user in Postgres</li>
<li>Create a Pancakes database in Postgres</li>
<li>Update the <code>Postgres</code> connection string in the web project’s <code>web.config</code> to match the username and database you created</li>
</ul>
<p>The first two steps can be accomplished with the following script in Postgres:</p>
<div class="highlight">
<pre><code class="language-sql"><span class="k">CREATE</span> <span class="k">DATABASE</span> <span class="ss">"Pancakes"</span><span class="p">;</span>

<span class="k">CREATE</span> <span class="k">USER</span> <span class="ss">"Matt"</span> <span class="k">WITH</span> <span class="n">PASSWORD</span> <span class="s1">'moo'</span><span class="p">;</span>

<span class="k">GRANT</span> <span class="k">ALL</span> <span class="k">PRIVILEGES</span> <span class="k">ON</span> <span class="k">DATABASE</span> <span class="ss">"Pancakes"</span> <span class="k">TO</span> <span class="ss">"Matt"</span><span class="p">;</span></code></pre>
</div>
<p>Save this to a file. Change the username/password if you like but be aware that the sample app has these values hard-wired into the connection string. Then execute the following from the command line:</p>
<pre><code>psql -U postgres -a -f "C:\path\to\sqlfile.sql"
</code></pre>
<p>At this point, you can launch the application and create events that will show up on the map. If you changed the username and/or password, you’ll need to update the Postgres connection string first.</p>
<p>You might have noticed that you didn’t create any tables yet but the app still works. The sample is helpful in this regard because all you need is a database. If the tables aren’t there yet, they will be created the first time you launch the app.</p>
<blockquote><p>Note: recipes rely on having a search provider configured. We won’t cover that here but I hope to come back to it in the future.</p></blockquote>
<p>Next, we’ll switching things up so you can run this against Postgres running in a Docker container.</p>
<h2 id="switching-to-docker">Switching to Docker</h2>
<p>I’m going to give away the ending here and say that there is no magic. Literally, all we’re doing in this section is installing Postgres on another “machine” and connecting to it. The commands to execute this are just a little less click-y and more type-y.</p>
<p>The first step, of course, is installing Docker. At the time of writing, this means installing <a href="http://docs.docker.com/windows/started/">Docker Machine</a>.</p>
<p>With Docker Machine installed, launch the Docker Quickstart Terminal and wait until you see an ASCII whale:</p>
<p><img src="http://i.imgur.com/UOgoWfK.png" alt="Docker Machine" /></p>
<p>If this is your first time running Docker, just know that a lightweight Linux virtual machine has been launched in VirtualBox on your machine. Check your Start screen and you’ll see VirtualBox if you want to investigate it but the <code>docker-machine</code> command will let you interact with it for many things. For example:</p>
<pre><code>docker-machine ip default
</code></pre>
<p>This will give you the IP address of the default virtual machine, which is the one created when you first launched the Docker terminal. Make a note of this IP address and update the Postgres connection string in your web.config to point to it. You can leave the username and password the same:</p>
<div class="highlight">
<pre><code class="language-xml"><span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">"Postgres"</span> <span class="na">connectionString=</span><span class="s">"server=192.168.99.100;user id=Matt;password=moo;database=Pancakes"</span> <span class="na">providerName=</span><span class="s">"Npgsql"</span> <span class="nt">/&gt;</span></code></pre>
</div>
<p>Now we’re ready to launch the container:</p>
<pre><code>docker run --name my-postgres -e POSTGRES_PASSWORD=moo -p 5432:5432 -d postgres`
</code></pre>
<p>Breaking this down:</p>
<table class="docker-breakdown">
<tbody>
<tr>
<td><code>docker run</code></td>
<td>Runs a docker container from an image</td>
</tr>
<tr>
<td><code>--name my-postgres</code></td>
<td>The name we give the container to make it easier for us to work with. If you leave this off, Docker will assign a relatively easy-to-remember name like “floral-academy” or “crazy-einstein”. You also get a less easy-to-remember identifier which works just as well but is…less…easy-to-remember</td>
</tr>
<tr>
<td><code>-e POSTGRES_PASSWORD=moo</code></td>
<td>The <code>-e</code> flag passes an environment variable to the container. In this case, we’re setting the password of the default postgres user</td>
</tr>
<tr>
<td><code>-p 5432:5432</code></td>
<td>Publishes a port from the container to the host. Postgres runs on port 5432 by default so we publish this port so we can interact with Postgres directly from the host</td>
</tr>
<tr>
<td><code>-d</code></td>
<td>Run the container in the background. Without this, the command will sit there waiting for you to kill it manually</td>
</tr>
<tr>
<td><code>postgres</code></td>
<td>The name of the image you are creating the container from. We’re using the <a href="https://hub.docker.com/_/postgres/">official postgres image</a> from Docker Hub.</td>
</tr>
</tbody>
</table>
<p>If this is the first time you’ve launched Postgres in Docker, it will take a few seconds at least, possibly even a few minutes. It’s downloading the Postgres image from Docker Hub and storing it locally. This happens only the first time for a particular image. Every subsequent postgres container you create will use this local image.</p>
<p>Now we have a Postgres container running. Just like with the local version, we need to create a user and a database. We can use the same script as above and a similar command:</p>
<pre><code>psql -h 192.168.99.100 -U postgres -a -f "C:\path\to\sqlfile.sql"
</code></pre>
<p>The only difference is the addition of <code>-h 192.168.99.100</code>. You should use whatever IP address you got above from the <code>docker-machine ip default</code> command here. For me, the IP address was 192.168.99.100.</p>
<p>With the database and user created, and your web.config updated, we’ll need to stop the application in Visual Studio and re-run it. The reason for this is that the application won’t recognize that we’ve changed database so we need to “reboot” it to trigger the process for creating the initial table structure.</p>
<p>Once the application has been restarted, you can now create pancake breakfast events and they will be stored in your Docker container rather than locally. You can even launch pgAdmin (the Postgres admin tool) and connect to the database in your Docker container and work with it like you would any other remote database.</p>
<h2 id="next-steps">Next steps</h2>
<p>From here, where you go is up to you. The sample application can be configured to use <a href="https://www.elastic.co/">Elastic Search</a>for the recipes. You could start an Elastic Search container and configure the app to search against that container. The principle is the same as with Postgres. Make sure you open both ports 9200 and 9300 and update the <code>ElasticSearchBaseUri</code> entry in <code>web.config</code>. The command I used in the presentation was:</p>
<pre><code>docker run --name elastic -p 9200:9200 -p 9300:9300 -d elasticsearch
</code></pre>
<p>I also highly recommend Nigel Poulton’s <a href="http://www.pluralsight.com/courses/docker-deep-dive">Docker Deep Dive</a> course on Pluralsight. You’ll need access to Linux either natively or in a VM but it’s a great course.</p>
<p>There are also a number of posts right here on Western Devs, including an <a href="http://www.westerndevs.com/docker/yet-another-docker-intro/">intro to Docker for OSX</a>, tips on <a href="http://www.westerndevs.com/getting-docker-running-on-windows-10/">running Docker on Windows 10</a>, and a summary or two on a discussion <a href="http://www.westerndevs.com/westerndevs-learn-about-docker-part-2/">we had on it internally</a>.</p>
<p>Other than that, Docker is great for experimentation. Postgres and Elastic Search are both available pre-configured in Docker on Azure. If you have access to Azure, you could spin up a Linux VM with either of them and try to use that with your application. Or look into Docker Compose and try to create a container with both.</p>
<p>For my part, I’m hoping to convert the sample application to ASP.NET 5 and see if I can get it running in a Windows Server Container. I’ve been saying that for a couple of months but I’m putting it on the internet in an effort to make it true.</p>
<div style="font-size: 9pt">Originally posted to: <a href="http://www.westerndevs.com/running-a-net-app-against-postgres-database-in-docker/">http://www.westerndevs.com/running-a-net-app-against-postgres-database-in-docker/</a></div>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=mT9jMR0NzHk:BT8Zdmss9V8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/kylebaley/2015/10/25/running-a-net-app-against-a-postgres-database-in-docker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/12012c3732bd1a70449093d07fba76d0?s=96&amp;d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&amp;r=G" medium="image">
            <media:title type="html">Kyle Baley</media:title>
        </media:content>
    		</item>
	<item>
		<title>Are you in the mood for HTTP?</title>
		<link>http://codebetter.com/glennblock/2015/10/21/are-you-in-the-mood-for-http/</link>
		<comments>http://codebetter.com/glennblock/2015/10/21/are-you-in-the-mood-for-http/#comments</comments>
		<pubDate>Wed, 21 Oct 2015 21:27:07 +0000</pubDate>
		<dc:creator>Glenn Block</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/glennblock/?p=983]]></guid>
		<description><![CDATA[Sometimes you are just in that mood (no, not that mood ;-)), you know that mood when you want to talk HTTP and APIs with a bunch of people that care. Recently Darrel Miller and I realized we&#8217;re in that&#160;&#8230; <a href="http://codebetter.com/glennblock/2015/10/21/are-you-in-the-mood-for-http/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>Sometimes you are just in that mood (no, not that mood ;-)), you know that mood when you want to talk HTTP and APIs with a bunch of people that care. Recently <a href="https://twitter.com/darrel_miller">Darrel Miller </a>and I realized we&#8217;re in that mood, and so with a little <a href="https://twitter.com/jchannon/status/650725194647126016">nudging</a> from Jonathan Channon, we decided now is a good time. And so, &#8220;<a href="https://www.crowdcast.io/e/in-the-mood-for-http">In the Mood for HTTP</a>&#8221; was born.</p>
<p>It is a new Q&amp;A style show, where folks submit questions on all things HTTP and Darrel and I give answers. Every show is live via Google Hangouts on Air, AND it is recorded and immediately available. In terms of the content, one thing I think that is really nice is we&#8217;re getting to dive into some really deep areas of building APIs that are not well covered. For example what level of granularity of media types should you use? Do Microservices impact your API design? And much more!</p>
<p>We&#8217;re not always in agreement, we&#8217;re not always right. We do always have fun!</p>
<p>Read Darrel&#8217;s blog <a href="http://bizcoder.com/in-the-mood-for-http-open-q-a">post</a> which goes into more detail of that what and why, then come join us! You can find the previous episodes on our YouTube channel <a href="https://www.youtube.com/channel/UCMRYw8VY7mFUg78AEuIbtyg">here</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=jr-sO9ylywY:BWU9jxNtD2w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/glennblock/2015/10/21/are-you-in-the-mood-for-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/d372d9c0ab35dbe84c6d0a6902ae0594?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Glenn Block</media:title>
        </media:content>
    		</item>
	<item>
		<title>Save your DNS and your SANITY when using VPN on a Mac (without rebooting)</title>
		<link>http://codebetter.com/glennblock/2015/10/01/save-your-dns-and-your-sanity-when-using-vpn-on-a-mac/</link>
		<comments>http://codebetter.com/glennblock/2015/10/01/save-your-dns-and-your-sanity-when-using-vpn-on-a-mac/#comments</comments>
		<pubDate>Thu, 01 Oct 2015 14:34:39 +0000</pubDate>
		<dc:creator>Glenn Block</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Uncategorized]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/glennblock/?p=956]]></guid>
		<description><![CDATA[There was time when using my Mac was bliss form a DNS perspective, I never had to worry about my routing tables getting corrupted. I could always rely on hosts getting resolved, life was good! And then a combination of&#160;&#8230; <a href="http://codebetter.com/glennblock/2015/10/01/save-your-dns-and-your-sanity-when-using-vpn-on-a-mac/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>There was time when using my Mac was bliss form a DNS perspective, I never had to worry about my routing tables getting corrupted. I could always rely on hosts getting resolved, life was good! And then a combination of things happened and well those good old days are gone <img src="http://codebetter.com/glennblock/wp-includes/images/smilies/frownie.png" alt=":-(" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<ul>
<li>The networking stack on OSX went downhill.</li>
<li>I joined Splunk.</li>
<li>I started using a VPN on my Mac (We use Juniper SSL VPN).</li>
<li>I started having to deal with this now recurring nightmare of my DNS suddenly failing, generally after using the VPN.</li>
</ul>
<p>If you use a VPN on a Mac, I am sure you&#8217;ve seen it. Suddenly you type &#8220;https://github.com&#8221; in your browser, and you get a 404. &#8220;Is Github down?&#8221; you ask your co-workers? &#8220;Nope, works perfectly fine for me&#8221;. &#8220;Is hipchat down?&#8221;. &#8220;Nope, I am chatting away.&#8221;</p>
<p>Meanwhile. your browser looks something like this:</p>
<p><a href="http://codebetter.com/glennblock/files/2015/10/Screen-Shot-2015-10-01-at-7.08.31-AM.png"><img class="alignleft wp-image-958" src="http://codebetter.com/glennblock/files/2015/10/Screen-Shot-2015-10-01-at-7.08.31-AM.png" alt="Screen Shot 2015-10-01 at 7.08.31 AM" width="326" height="241" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1><strong>AAARGH!</strong></h1>
<p><img class="alignleft" src="http://i.imgur.com/isfx3OT.gif" alt="" width="250" height="210" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>So you reboot, and then you find out that Github was up all along, the problem was your routing tables got screwed somehow related to the VPN, either that or the DNS demons have taken over your machine!</p>
<p><a href="http://codebetter.com/glennblock/files/2015/10/demons-1.jpg"><img class="alignleft wp-image-978" src="http://codebetter.com/glennblock/files/2015/10/demons-1.jpg" alt="demons-1" width="320" height="200" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>After dealing with this constantly, you start to seriously lose your sanity! It will of course always happen at the most inopportune time, like when you are about to present to your execs or walk on stage!</p>
<p>But my friends, there is hope, I have a cure! This is a cure I learned from the wise ninjas at my office (Thank you Danielle and Itay!), it is a little bash alias, and it will save you AND your DNS. Drop it in your .bash_profile and open a new terminal.</p>
<p><code>alias fixvpn="sudo route -n flush &amp;&amp; sudo networksetup -setv4off Wi-Fi &amp;&amp; sudo networksetup -setdhcp Wi-Fi"</code></p>
<p>Next time the DNS demons come to get you, run this baby from the shell. It will excommunicate those demons and quick.</p>
<p><a href="http://codebetter.com/glennblock/files/2015/10/Screen-Shot-2015-10-01-at-7.09.48-AM.png"><img class="alignleft size-full wp-image-964" src="http://codebetter.com/glennblock/files/2015/10/Screen-Shot-2015-10-01-at-7.09.48-AM.png" alt="Screen Shot 2015-10-01 at 7.09.48 AM" width="704" height="242" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Wait a few seconds, and bring up that webpage again.</p>
<p><a href="http://codebetter.com/glennblock/files/2015/10/Screen-Shot-2015-10-01-at-7.09.57-AM.png"><img class="alignleft wp-image-965" src="http://codebetter.com/glennblock/files/2015/10/Screen-Shot-2015-10-01-at-7.09.57-AM.png" alt="Screen Shot 2015-10-01 at 7.09.57 AM" width="326" height="241" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>You DNS and Sanity are restored!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=J8PpJwZbXIQ:vX-5ULr4wP4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/glennblock/2015/10/01/save-your-dns-and-your-sanity-when-using-vpn-on-a-mac/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/d372d9c0ab35dbe84c6d0a6902ae0594?s=96&amp;d=&amp;r=G" medium="image">
            <media:title type="html">Glenn Block</media:title>
        </media:content>
    		</item>
	<item>
		<title>Windows Server Containers are coming whether you like it or not</title>
		<link>http://codebetter.com/kylebaley/2015/09/01/windows-server-containers-are-coming-whether-you-like-it-or-not/</link>
		<comments>http://codebetter.com/kylebaley/2015/09/01/windows-server-containers-are-coming-whether-you-like-it-or-not/#comments</comments>
		<pubDate>Tue, 01 Sep 2015 18:10:08 +0000</pubDate>
		<dc:creator>Kyle Baley</dc:creator>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Measure]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/kylebaley/?p=311]]></guid>
		<description><![CDATA[After posting giddily on Docker in the Windows world recently, Microsoft released Windows Server 2016 Technical Preview 3 with container support. I’ve had a chance to play with it a little so let’s see where this goes… It’s a preview&#160;&#8230; <a href="http://codebetter.com/kylebaley/2015/09/01/windows-server-containers-are-coming-whether-you-like-it-or-not/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>After posting giddily on <a href="http://www.westerndevs.com/docker-is-coming-whether-you-like-it-or-not/">Docker in the Windows world</a> recently, Microsoft released Windows Server 2016 Technical Preview 3 with container support. I’ve had a chance to play with it a little so let’s see where this goes…</p>
<h2 id="its-a-preview">It’s a preview</h2>
<p>Like movie previews, this is equal parts exciting and frustrating. Exciting because you get a teaser of things to come. Frustrating because you just want it to work <em>now</em>. And extra frustration points for various technical issues I’ve run into that, I hope, are due to the “technical preview” label.</p>
<p>For example, <a href="https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/inplace_setup">installing container support</a> into an existing VM is mind-numbingly slow. Kudos to the team for making it easy to install but at the point where you run ContainerSetup.ps1, be prepared to wait for, by my watch, at least 45 minutes without any visual indication that something is happening. The only reason I knew something <em>was</em> happening is because I saw the size of the VM go up (slowly) on my host hard drive. This is on a 70Mbps internet connection so I don’t think this can be attributed to “island problems” either.</p>
<p>I’ve heard tell of issues setting up container support in a <a href="https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/container_setup">Hyper-V VM</a> as well. That’s second-hand info as I’m using Fusion on a Mac rather than Hyper-V. If you run into problems setting it up on Hyper-V, consider switching to the instructions for <a href="https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/inplace_setup">setting up containers on non-Hyper-V VMs</a> instead.</p>
<p>There’s also the Azure option. Microsoft was gracious enough to provide an Azure image for Windows Server 2016 pre-configured with container support. This works well if you’re on Azure and I was able to run the <a href="https://msdn.microsoft.com/virtualization/windowscontainers/quick_start/manage_docker">nginx tutorial</a> on it with no issues. I had less success with the <a href="https://github.com/Microsoft/Virtualization-Documentation/tree/master/windows-server-container-samples/iis-10.0">IIS 10 tutorial</a> even locally. I could get it running but was not able to create a new image based on the container I had.</p>
<h2 id="its-also-a-start">It’s also a start</h2>
<p>Technical issues aside, I haven’t been this excited about technology in Windows since…ASP.NET MVC, I guess, if my tag cloud is to be believed. And since this is a technical preview designed to garner feedback, here’s what I want to see in the Windows container world</p>
<h3 id="docker-client-and-powershell-support">Docker client <em>and</em> PowerShell support</h3>
<p>I love that I can use the Docker client to work with Windows containers. I can leverage what I’ve already learned with Docker in Linux. But I also love that I can spin up containers with PowerShell so I don’t need to mix technologies in a continuous integration/continuous deployment environment if I already have PowerShell scripts set up for other aspects of my process.</p>
<h3 id="support-for-legacy-net-applications">Support for legacy .NET applications</h3>
<p>I can’t take credit for this. I’ve been talking with <a href="https://lostechies.com/gabrielschenker/">Gabriel Schenker</a> about containers a lot lately and it was he who suggested they need to have support for .NET 4, .NET 3.5, and even .NET 2.0. It makes sense though. There are a lot of .NET apps out there and it would be a shame if they couldn’t take advantage of containers.</p>
<h3 id="smooth-local-development">Smooth local development</h3>
<p>Docker Machine is great for getting up and running fast on a local Windows VM. To fully take advantage of containers, devs need to be able to work with them locally with no friction, whether that means a Windows Container version of Docker Machine or the ability to work with containers natively in Windows 10.</p>
<h3 id="arm-support">ARM support</h3>
<p>At Western Devs, we have a <a href="http://www.westerndevs.com/using-azure-arm-to-deploy-a-docker-container/">PowerShell script</a> that will spin up a new Azure Linux virtual machine, install docker, create a container, and run our website on it. It goes without saying (even though I’m saying it) that I’d like to do the same with Windows containers.</p>
<h3 id="lots-of-images-out-of-the-gate">Lots of images out of the gate</h3>
<p>I’d like to wean myself off VMs a little. I picture a world where I have one base VM and I use various containers for the different pieces of the app I’m working on. E.g. A SQL Server container, an IIS container, an ElasticSearch container, possibly even a Visual Studio container. I pick and choose which containers I need to build up my dev environment and use just one (or a small handful) of VMs.</p>
<hr />
<p>In the meantime, I’m excited enough about Windows containers that I hope to incorporate a small demo with them in my talk at <a href="http://measureup.io/">MeasureUP</a> in a few scant weeks so if you’re in the Austin area, come on by to see it.</p>
<p>It is a glorious world ahead in this space and it puts a smile on this hillbilly’s face to see it unfold.</p>
<p>Kyle the Barely Contained</p>
<div style="font-size: 9pt">Originally posted to: <a href="http://www.westerndevs.com/windows-server-containers-are-coming-whether-you-like-it-or-not/">http://www.westerndevs.com/windows-server-containers-are-coming-whether-you-like-it-or-not/</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=yWBIF_RH4Dg:Nv6J6iATQ4c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/kylebaley/2015/09/01/windows-server-containers-are-coming-whether-you-like-it-or-not/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/12012c3732bd1a70449093d07fba76d0?s=96&amp;d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&amp;r=G" medium="image">
            <media:title type="html">Kyle Baley</media:title>
        </media:content>
    		</item>
	<item>
		<title>Docker on Western Devs</title>
		<link>http://codebetter.com/kylebaley/2015/08/23/docker-on-western-devs/</link>
		<comments>http://codebetter.com/kylebaley/2015/08/23/docker-on-western-devs/#comments</comments>
		<pubDate>Sun, 23 Aug 2015 18:07:27 +0000</pubDate>
		<dc:creator>Kyle Baley</dc:creator>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Western Devs]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/kylebaley/?p=308]]></guid>
		<description><![CDATA[In a month, I’ll be attempting to hound my share of glory at MeasureUP with a talk on using Docker for people who may not think it impacts them. In it, I’ll demonstrate some uses of Docker today in a&#160;&#8230; <a href="http://codebetter.com/kylebaley/2015/08/23/docker-on-western-devs/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>In a month, I’ll be attempting to hound my share of glory at MeasureUP with a talk on using Docker for people who may not think it impacts them. In it, I’ll demonstrate some uses of Docker today in a .NET application. As I prepare for this talk, there’s one thing we <a href="http://www.westerndevs.com/">Western Devs</a> have forgotten to talk about. Namely, some of us are already using Docker regularly just to post on the site.</p>
<p>Western Devs uses Jekyll. Someone suggested it, I tried it, it worked well, decision was done. Except that it doesn’t work well on Windows. It’s not officially supported on the platform and while there’s a <a href="http://jekyll-windows.juthilo.com/">good guide</a> on getting it running, we haven’t been able to do so ourselves. Some issue with a gem we’re using and Nokogiri and lib2xml and some such nonsense.</p>
<p>So in an effort to streamline things, <a href="http://www.westerndevs.com/bios/amir_barylko/">Amir Barylko</a> create a <a href="https://github.com/westerndevs/western-devs-website/blob/source/Dockerfile">Docker image</a>. It’s based on the Ruby base image (version 2.2). After grabbing the base image, it will:</p>
<ul>
<li>Install some packages for building Ruby</li>
<li>Install the bundler gem</li>
<li>Clone the source code into the /root/jekyll folder</li>
<li>Run <code>bundle install</code></li>
<li>Expose port 4000, the default port for running Jekyll</li>
</ul>
<p>With this in place, Windows users can run the website locally without having to install Ruby, Python, or Jekyll. The command to launch the container is:</p>
<p><code>docker run -t -p 4000:4000 -v //c/path/to/code:/root/jekyll abarylko/western-devs:v1 sh -c 'bundle install &amp;&amp; rake serve'</code></p>
<p>This will:</p>
<ul>
<li>create a container based on the <code>abarylko/western-devs:v1</code> image</li>
<li>export port 4000 to the host VM</li>
<li>map the path to the source code on your machine to /root/jekyll in the container</li>
<li>run <code>bundle install &amp;&amp; rake serve</code> to update gems and launch Jekyll in the container</li>
</ul>
<p>To make this work 100%, you also need to expose port 4000 in VirtualBox so that it’s visible from the VM to the host. Also, I’ve had trouble getting a container working with my local source located anywhere except C:\Users\<em>mysuername</em>. There’s a permission issue somewhere in there where the container appears to successfully map the drive but can’t actually see the contents of the folder. This manifests itself in an error message that says <code>Gemfile not found</code>.</p>
<p>Now, Windows users can navigate to localhost:4000 and see the site running locally. Furthermore, they can add and make changes to their posts, save them, and the changes will get reflected in the browser. Eventually, that is. I’ve noticed a 10-15 second delay between the time you press Save to the time when the changes actually get reflected. Haven’t determined a root cause for this yet. Maybe we just need to soup up the VM.</p>
<p>So far, this has been working reasonably well for us. To the point, where fellow Western Dev, <a href="http://www.westerndevs.com/bios/dylan_smith/">Dylan Smith</a> has automated the deployment of the image to Azure via <a href="https://github.com/westerndevs/western-devs-website/tree/source/_azure">a Powershell script</a>. That will be the subject of a separate post. Which will give me time to figure out how the thing works.</p>
<div style="font-size: 9pt">Originally posted to: <a href="http://www.westerndevs.com/docker-and-western-devs/">http://www.westerndevs.com/docker-and-western-devs/</a></div>
<p>&nbsp;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=myFPWPl6g-0:4xaESoGHaAk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/kylebaley/2015/08/23/docker-on-western-devs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/12012c3732bd1a70449093d07fba76d0?s=96&amp;d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&amp;r=G" medium="image">
            <media:title type="html">Kyle Baley</media:title>
        </media:content>
    		</item>
	<item>
		<title>Docker is coming whether you like it or not</title>
		<link>http://codebetter.com/kylebaley/2015/08/04/docker-is-coming-whether-you-like-it-or-not/</link>
		<comments>http://codebetter.com/kylebaley/2015/08/04/docker-is-coming-whether-you-like-it-or-not/#comments</comments>
		<pubDate>Tue, 04 Aug 2015 08:23:23 +0000</pubDate>
		<dc:creator>Kyle Baley</dc:creator>
				<category><![CDATA[Clear Measure]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Presenting]]></category>
		<category><![CDATA[TeamCity]]></category>
		<category><![CDATA[UI Testing]]></category>
		<category><![CDATA[Western Devs]]></category>
        
		<guid isPermaLink="false"><![CDATA[http://codebetter.com/kylebaley/?p=305]]></guid>
		<description><![CDATA[I’m excited about Docker. Unnaturally excited, one might say. So much so that I’ll be talking about it at MeasureUp this September. In the meantime, I have to temper my enthusiasm for the time being because Docker is still a&#160;&#8230; <a href="http://codebetter.com/kylebaley/2015/08/04/docker-is-coming-whether-you-like-it-or-not/">Continue&#160;reading&#160;<span class="meta-nav">&#8594;</span></a>]]></description>
		<content:encoded><![CDATA[<p>I’m excited about Docker. Unnaturally excited, one might say. So much so that I’ll be talking about it at <a href="http://measureup.io/">MeasureUp</a> this September.</p>
<p>In the meantime, I have to temper my enthusiasm for the time being because Docker is still a Linux-only concern. Yes, you can run Docker containers on Windows but only Linux-based ones. So no SQL Server and no IIS.</p>
<p>But you can’t stop a hillbilly from dreaming of a world of containers. So with a grand assumption that you know what Docker is roughly all about, here’s what this coder of the earth meditates on, Docker-wise, before going to sleep.</p>
<h3 id="microservices">Microservices</h3>
<p>Microservices are a hot topic these days. We’ve <a href="http://www.westerndevs.com/podcasts/podcast-microservices/">talked about them</a> at Western Devs already and Donald Belcham has a good and active <a href="https://github.com/dbelcham/microservice-material">list of resources</a>. Docker is an eerily natural fit for microservices so much so that one might think it was created specifically to facilitate the architecture. You can package your entire service into a container and deploy it as a single package to your production server.</p>
<p>I don’t think you can understate the importance of a technology like Docker when it comes to microservices. Containers are so lightweight and portable, you just naturally gravitate to the pattern through normal use of containers. I can see a time in the near future where it’s almost negligent <strong>not</strong> to use microservices with Docker. At least in the Windows world. This might already be the case in Linux.</p>
<h3 id="works-on-my-machine">Works On My Machine</h3>
<p>Ah, the crutch of the developer and the bane of DevOps. You set it up so nicely on your machine, with all your undocumented config entries and custom permissions and the fladnoogles and the whaztrubbets and everything else required to get everything perfectly balanced. Then you get your first bug from QA: can’t log in.</p>
<p>But what if you could test your deployment on the <em>exact same image</em> that you deployed to? Furthermore, what if, when a bug came in that you can’t reproduce locally, you could download the <em>exact container</em> where it was occurring? NO MORE EXCUSES, THAT’S WHAT!</p>
<h3 id="continuous-integration-build-agents">Continuous Integration Build Agents</h3>
<p>On one project, we had a suite of <a href="http://www.westerndevs.com/on-ui-testing/">UI tests</a> which took nigh-on eight hours in TeamCity. We optimized as much as we could and got it down to just over hours. Parallelizing them would have been a lot of effort to set up the appropriate shared resources and configurations. Eventually, we set up multiple virtual machines so that the entire parallel test run could finish in about an hour and a half. But the total test time of all those runs sequentially is now almost ten hours and my working theory is that it’s due to the overhead of the VMs on the host machine.</p>
<h3 id="offloading-services">Offloading services</h3>
<p>What I mean here is kind of like microservices applied to the various components of your application. You have an application that needs a database, a queue, a search components, and a cache. You could spin up a VM and install all those pieces. Or you could run a Postgres container, a RabbitMQ container, an ElasticSearch container, and a Redis container and leave your machine solely for the code.</p>
<p>When it comes right down to it, Docker containers are basically practical virtual machines. I’ve used VMs for many years. When I first started out, it was VMWare WorkStation on Windows. People that are smarter than me (including those that would notice that I should have said, “smarter than <em>I</em>”) told me to use them. “One VM per client” they would say. To the point that their host was limited to checking email and Twitter clients.</p>
<p>I tried that and didn’t like it. I didn’t like waiting for the boot process on both the host <em>and</em> each client and I didn’t like not taking full advantage of my host’s hardware on the specific client I happened to be working on at that moment.</p>
<p>But containers are lightweight. Purposefully so. <em>Delightfully</em> so. As I speak, the overworked USB drive that houses my VMs is down to 20 GB of free space. I cringe at the idea of having to spin up another one. But the idea of a dozen containers I can pick and choose from, all under a GB? That’s a development environment I can get behind.</p>
<hr />
<p>Alas, this is mostly a future world I’m discussing. Docker is Linux only and I’m in the .NET space. So I have to wait until either: a) ASP.NET is ported over to Linux, or b) Docker supports Windows-based containers. And it’s a big part of my excitement that <strong>BOTH</strong> of those conditions will likely be met within a year.</p>
<p>In the meantime, who’s waiting? Earlier, I mentioned Postgres, Redis, ElasticSearch, and RabbitMQ. Those all work with Windows regardless of where they’re actually running. Furthermore, Azure already has pre-built containers with all of these.</p>
<p>Much of this will be the basis of my talk at the upcoming <a href="http://measureup.io/">MeasureUP</a> conference next month. So…uhhh….don’t read this until after that.</p>
<div style="font-size: 9pt">Originally posted to: <a href="http://www.westerndevs.com/docker-is-coming-whether-you-like-it-or-not/">http://www.westerndevs.com/docker-is-coming-whether-you-like-it-or-not/</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/CodeBetter?a=4mX3vwwwQw8:zT5z7nKz9qM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CodeBetter?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
		<wfw:commentRss>http://codebetter.com/kylebaley/2015/08/04/docker-is-coming-whether-you-like-it-or-not/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
            <media:content url="http://www.gravatar.com/avatar/12012c3732bd1a70449093d07fba76d0?s=96&amp;d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&amp;r=G" medium="image">
            <media:title type="html">Kyle Baley</media:title>
        </media:content>
    		</item>
</channel>
</rss><!-- 161 queries 0.792 seconds. -->
