<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jeremy Abbott</title>
    <description>The latest articles on DEV Community by Jeremy Abbott (@jeremyabbott).</description>
    <link>https://dev.to/jeremyabbott</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F6192%2F991806.jpeg</url>
      <title>DEV Community: Jeremy Abbott</title>
      <link>https://dev.to/jeremyabbott</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jeremyabbott"/>
    <language>en</language>
    <item>
      <title>How I Setup My New Mac</title>
      <dc:creator>Jeremy Abbott</dc:creator>
      <pubDate>Sun, 01 Dec 2019 15:55:09 +0000</pubDate>
      <link>https://dev.to/jeremyabbott/how-i-setup-my-new-mac-16gi</link>
      <guid>https://dev.to/jeremyabbott/how-i-setup-my-new-mac-16gi</guid>
      <description>&lt;p&gt;&lt;em&gt;This is copied from a &lt;a href="https://github.com/jeremyabbott/new-mac-setup"&gt;github repo&lt;/a&gt; I made for myself for future reference. It is also in part inspired by John Papa's &lt;a href="https://dev.to/azure/the-first-10-macos-apps-i-install-in-2019-2bba"&gt;The First 10 macOS Apps I Install in 2019 &lt;/a&gt;. I wanted to emphasize what it feels like setting up developer tooling on macOS 10.15, and what my experience was like using zsh for the first time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Scripts and notes regarding tools/apps I install when I get a new laptop. In general, I want to be able to build/run a &lt;a href="https://safe-stack.github.io/"&gt;SAFE Stack Application&lt;/a&gt; when setup is finished. To accomplish this I'll need&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;.NET Core&lt;/li&gt;
&lt;li&gt;Node (we're going to use nvm for this)&lt;/li&gt;
&lt;li&gt;(Optional) Yarn&lt;/li&gt;
&lt;li&gt;(Optional) Docker (this could also be the first step if you only need/want to work in a .devcontainer)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before we get into installing our developer tools though, we'll need to do some housekeeping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install OS Updates
&lt;/h2&gt;

&lt;p&gt;This is especially worthwhile with macOS Catalina being so new and lamentably buggy. It's especially important if you (like me 💪🏼) treated yourself to the new 16" MacBook Pro because you'll want to make sure you have the latest driver and firmware updates. It's also just a good idea in case there are any security fixes (🤞🏽).&lt;/p&gt;

&lt;h2&gt;
  
  
  Remove Crap from the Dock
&lt;/h2&gt;

&lt;p&gt;On a clean macOS install there's going to be a bunch of stuff on the dock that you probably don't want. Get rid of it 😉!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TgKNufZk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/jeremyabbott/new-mac-setup/raw/master/images/removefromdock.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TgKNufZk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/jeremyabbott/new-mac-setup/raw/master/images/removefromdock.png" alt="Alt text" title="Remove crap from dock" width="680" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Password Manager
&lt;/h2&gt;

&lt;p&gt;Get your password manager installed. &lt;a href="https://apps.apple.com/us/app/1password-7-password-manager/id1333542190?mt=12"&gt;I use 1Password, and I installed it from the App Store&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content Blockers
&lt;/h2&gt;

&lt;p&gt;I generally use &lt;a href="https://www.mozilla.org/en-US/firefox/developer/"&gt;Firefox Developer Edition&lt;/a&gt; for standard browsing. However, when I'm shopping online I use Safari if the site I'm using supports Apple Pay. I use &lt;a href="https://apps.apple.com/us/app/better-blocker/id1121192229?mt=12"&gt;Better Blocker&lt;/a&gt; in that case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Homebrew
&lt;/h2&gt;

&lt;p&gt;Install &lt;a href="https://brew.sh/"&gt;homebrew&lt;/a&gt;. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open up your terminal &lt;/li&gt;
&lt;li&gt;Run this: &lt;code&gt;/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After getting homebrew installed I installed the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install mkcert
brew cask install docker
brew cask install visual-studio-code
brew cask install dropbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After you install VS Code you're going to have to do some permission tweaking.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Homebrew or App Store?
&lt;/h3&gt;

&lt;p&gt;At least 1Password can be installed via Homebrew as well as available in the App Store. Which way should you do it? My best guess is honestly personal preference. For things that I just need to work no matter what (like password access), I think something from the App Store has a better change of working correctly after a major OS upgrade. I don't have any evidence this to back this up though, so let's go with personal preference. 🤷🏽‍♂️&lt;/p&gt;

&lt;p&gt;Other apps I installed via the App Store&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apps.apple.com/us/app/microsoft-onenote/id784801555?mt=12"&gt;One Note&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apps.apple.com/us/app/slack/id803453959?mt=12"&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Antigen
&lt;/h2&gt;

&lt;p&gt;With macOS Catalina, macOS uses zsh as the default terminal instead of bash. From the little bit I've interacted with it, I haven't noticed a difference. I came across Antigen while looking for the best way to install &lt;a href="https://github.com/nvm-sh"&gt;&lt;code&gt;nvm&lt;/code&gt;&lt;/a&gt;. While perusing the readme I came across this&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Homebrew installation is not supported. If you have issues with homebrew-installed nvm, please brew uninstall it, and install it using the instructions below, before filing an issue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well 💩.&lt;/p&gt;

&lt;p&gt;However, I also saw this tidbit&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you're using zsh you can easily install nvm as a zsh plugin. Install &lt;a href="https://github.com/lukechilds/zsh-nvm"&gt;zsh-nvm&lt;/a&gt; and run nvm upgrade to upgrade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cool... Looking at the &lt;a href="https://github.com/lukechilds/zsh-nvm#installation"&gt;&lt;code&gt;zsh-nvm&lt;/code&gt;&lt;/a&gt; installation instructions, it lists &lt;a href="https://github.com/zsh-users/antigen"&gt;Antigen&lt;/a&gt; first. Well that doesn't sound scary at all.&lt;/p&gt;

&lt;p&gt;Antigen manages plugins for zsh. Before this little adventure I didn't even know there were plugins for zsh. As it turns out we can install antigen via homebrew&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;antigen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After antigen is installed do the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;
&lt;span class="nb"&gt;touch&lt;/span&gt; .zshrc &lt;span class="c"&gt;#creates the file if it doesn't exist&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add this to your .zshrc&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source /usr/local/share/antigen/antigen.zsh

antigen bundle lukechilds/zsh-nvm

antigen apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plot twist: you can also install antigen before Homebrew, and then setup Homebrew as an Antigen bundle. I'm not sure which step is better.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;nvm&lt;/code&gt; finally installed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nvm install --lts
nvm use --lts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing .NET Core
&lt;/h2&gt;

&lt;p&gt;Unfortunately, we don't (yet) have a cool tool like &lt;code&gt;nvm&lt;/code&gt; for managing .NET Core SDK installations. You &lt;em&gt;could&lt;/em&gt; install .NET Core via homebrew, but that's only going to get you one version. That might be enough for you. Reality is never that simple though. As I'm writing this .NET Core 2.1 is LTS, .NET Core 2.2 and 3.0 are supported, and 3.1 preview 3 is supported in production by Microsoft with 3.1 releasing next week (2019/12/2). 3.1 will be an LTS release. So you will probably want the latest 2.1 SDK, in addition to a 2.2 and 3.0 SDK. You &lt;em&gt;could&lt;/em&gt; manually intall the &lt;code&gt;pkg&lt;/code&gt;s from the .NET site. I'd like to be able to install from the command line though. Enter &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script"&gt;&lt;code&gt;dotnet-install.sh&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dot.net/v1/dotnet-install.sh"&gt;Download the script&lt;/a&gt;. I did it through the documentation link since I was already there. You'll probably want to move it to wherever you keep your scripts (&lt;code&gt;$HOME/code&lt;/code&gt; for me).&lt;/p&gt;

&lt;p&gt;Then run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod u+x dotnet-install.sh
./dotnet-install.sh -c Current # 3.0
./dotnet-install.sh -c LTS # 2.1
./dotnet-install.sh -c 2.2 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unless you specify an install directory, the &lt;code&gt;dotnet&lt;/code&gt; executable is going to get intalled to &lt;code&gt;$HOME/.dotnet&lt;/code&gt;, which you'll need to add to your path by adding the following to &lt;code&gt;.zshrc&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if [ -d "$HOME/.dotnet" ] ; then
    export PATH="$PATH:$HOME/.dotnet" # Add the directory where the dotnet executable lives
fi

if [ -d "$HOME/.dotnet/tools" ] ; then
    export PATH="$PATH:$HOME/.dotnet/tools" # Add the directory where dotnet global tools are going to be saved
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install my Favorite .NET Core Templates
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet new -i "MiniScaffold::*" # MiniScaffold is the bomb https://github.com/TheAngryByrd/MiniScaffold
dotnet new -i SAFE.Template # you should be using the safe stack https://safe-stack.github.io/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I literally went through all that work (above) to get &lt;code&gt;nvm&lt;/code&gt; installed so that I could build &lt;code&gt;SAFE Stack&lt;/code&gt; apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;A copy of my current &lt;code&gt;.zshrc&lt;/code&gt; can be found &lt;a href="https://github.com/jeremyabbott/new-mac-setup/blob/master/.zshrc"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One thing I haven't done yet is installed a zsh theme. Do you have any you like? Do you have a more automated way of getting your developer setup just right?&lt;/p&gt;

&lt;h2&gt;
  
  
  Update 2019-12-12
&lt;/h2&gt;

&lt;p&gt;Go install the super cute Touchbar Pet app&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sOwBh_vw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/ext_tw_video_thumb/1196280154206564352/pu/img/hdDTTAaeB46oECY7.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--CSOw3nQL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/777691844687851520/B4hODIXe_normal.jpg" alt="Grace profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Grace
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @gracecondition
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      twitter did someone want a touchbar tamagotchi? 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      04:13 AM - 18 Nov 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1196280265821151232" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1196280265821151232" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1196280265821151232" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;
&lt;br&gt;
&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--CSOw3nQL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/777691844687851520/B4hODIXe_normal.jpg" alt="Grace profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Grace
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @gracecondition
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      download: &lt;a href="https://t.co/HEp4ksblzz"&gt;graceavery.com/touchbar-pet/&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      21:43 PM - 19 Nov 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1196906786579611648" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1196906786579611648" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1196906786579611648" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


</description>
      <category>macos</category>
      <category>dotnet</category>
      <category>fsharp</category>
    </item>
    <item>
      <title>Happy Pride: Your IDE is Already Political</title>
      <dc:creator>Jeremy Abbott</dc:creator>
      <pubDate>Sun, 02 Jun 2019 01:32:42 +0000</pubDate>
      <link>https://dev.to/jeremyabbott/happy-pride-your-ide-is-already-political-50h5</link>
      <guid>https://dev.to/jeremyabbott/happy-pride-your-ide-is-already-political-50h5</guid>
      <description>&lt;p&gt;June is &lt;a href="https://en.wikipedia.org/wiki/Gay_pride" rel="noopener noreferrer"&gt;LGBT Pride&lt;/a&gt; month. As acceptance of LGBT people has slowly improved, businesses have capitalized on this acceptance by giving their products pride themes. As a .NET developer (F# for life!), I was cautiously excited when I saw this:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1134591127883882496-11" src="https://platform.twitter.com/embed/Tweet.html?id=1134591127883882496"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1134591127883882496-11');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1134591127883882496&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Excited because I use VS Code everyday. Excited because I really enjoy working with Microsoft tech like .NET Core, F# and Azure. Excited because I have friends/acquaintances that I admire that work at Microsoft. Excited because in the rare moments when I don't feel like an imposter I tell myself that someday I'll be smart/good/qualified enough to work there. &lt;/p&gt;

&lt;p&gt;If you follow the VS Code retweet to the Microsoft &lt;a href="https://blogs.microsoft.com/blog/2019/05/30/microsoft-celebrates-pride-takes-action-for-equity-and-visibility/" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; you'll find this (emphasis mine): &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Actions speak louder than words!&lt;br&gt;
&lt;strong&gt;We’re donating $100,000&lt;/strong&gt; to the following nonprofits in Australia, Canada, United Kingdom, and the United States to celebrate and support their work on LGBTQI+ equity:&lt;br&gt;
Established in 1985, ACON is Australia’s largest health promotion organization specializing in HIV prevention, HIV support and LGBTQ health.&lt;br&gt;
Egale works to improve the lives of LGBTQI2S people in Canada and to enhance the global response to LGBTQI2S issues. They do this by informing public policy, inspiring cultural change, and promoting human rights and inclusion.&lt;br&gt;
Mermaids is the only U.K.-wide charity working to support transgender or gender non-conforming children, young people, and their families. Their goal is to create a world where gender-diverse children and young people can be themselves and thrive. Mermaids promotes education and awareness, and offers information, support, friendship and shared experiences to those in need.&lt;br&gt;
 The Trevor Project is the world’s largest suicide prevention and crisis intervention organization for lesbian, gay, bisexual, transgender, queer and questioning young people under 25.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The blog post also talks about the Microsoft Store awarding a grant to &lt;a href="https://destinationtomorrow.org/about/" rel="noopener noreferrer"&gt;Destination Tomorrow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These are all exceptionally important organization, and I'm really grateful that they're supporting them. Thank you Microsoft.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Read The Replies...
&lt;/h2&gt;

&lt;p&gt;The replies to VS Code's Twitter avi and retweet were pretty divided when I checked. On the negative side were a lot of "uninstall" replies, or "I'm switching to Atom." That last one is funny because Atom came out of GitHub, which is owned by Microsoft.&lt;/p&gt;

&lt;p&gt;One reply caught my attention though. "Keep politics out of my IDE." &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/d2Z32wTIuPl6iHuw/200w_d.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/d2Z32wTIuPl6iHuw/200w_d.gif" alt="Gif Audrey Hepburn smoking and lowering her glasses in surprise"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Earning a living is a political act. Being "out" at work is a political act. Going to the doctor is a political act. Unfortunately healthcare in the U.S. is tied to employment in most cases, but I digress. If you're able to say "keep politics out of x" you are privileged. Politics affect the life of LGBT people everyday.&lt;/p&gt;

&lt;p&gt;When you say "keep politics of out my IDE" you are saying "I work with LGBT people who face discrimination on a regular basis and I don't care, or I'm actively doing it." FULL. STOP. LGBT people contribute to the languages you like, the IDEs you use, &lt;a href="https://en.wikipedia.org/wiki/Alan_Turing" rel="noopener noreferrer"&gt;literally the science that makes your job possible&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;There are no federal protections to prevent LGBT people from being fired, being denied healthcare, being evicted from their home, being denied access to public accommodations, for simply existing. The &lt;a href="https://www.congress.gov/bill/116th-congress/house-bill/5/text" rel="noopener noreferrer"&gt;Equality Act&lt;/a&gt; passed by the United States House of representatives would make discriminating on the basis of sex, gender identity, and sexual orientation. It's currently being blocked by Senate Majority Leader Mitch McConnell, a Republican. &lt;/p&gt;

&lt;p&gt;Many of the IDEs that we all use are developed and/or sponsored by companies that donate their own and/or their employees money to politicians through Political Action Committees (PACs).&lt;/p&gt;

&lt;h2&gt;
  
  
  Pinkwashing
&lt;/h2&gt;

&lt;p&gt;Sometimes businesses create pride campaigns in good faith: they take the proceeds and donate them to non-profits that advocate for LGBT equality as Microsoft has done this year. It's great that Microsoft recognizes that their (in their own words) "actions speak louder than words," but...&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1055319245213573122-895" src="https://platform.twitter.com/embed/Tweet.html?id=1055319245213573122"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1055319245213573122-895');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1055319245213573122&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1134581433320824832-979" src="https://platform.twitter.com/embed/Tweet.html?id=1134581433320824832"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1134581433320824832-979');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1134581433320824832&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Microsoft is not unique in this, or even necessarily the worst offender. I guess because I really like Microsoft, I hope that they'd do better than this. I'm not mad, I'm just disappointed.&lt;/p&gt;

&lt;p&gt;As is pointed out in &lt;a href="https://twitter.com/pinboard" rel="noopener noreferrer"&gt;Pinboard&lt;/a&gt;'s thread, it's not "corporate" money. Okay... but Microsoft set up the program so that employees could contribute, and the money came from that program. &lt;/p&gt;

&lt;p&gt;Detractors will point out that I contribute to this in some way too, and they're not wrong: I have an Office 365 subscription, I've paid out of pocket for Azure things that didn't belong on my employer paid MSDN account, I earn my living working with Microsoft technologies, and that's probably not going to change any time soon.&lt;/p&gt;

&lt;p&gt;The reality of course is that you'd be hard pressed to find a cloud provider or "productivity suite" that isn't culpable in some way. Office is ubiquitous in business, education, healthcare (Google Docs is an option if you don't mind the constant spying). Try telling my accountant boyfriend that he and his team have to stop using Excel. &lt;/p&gt;

&lt;p&gt;The Pinboard thread is especially worth paying attention to because our trans friends, family, neighbors, and colleagues are especially under attack right now by the Trump administration. You can find an exhaustive 861 item list of the anti-LGBT actions taken by the Trump administration &lt;a href="https://www.glaad.org/tap/donald-trump" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Since Trump's 2016 presidential campaign and election violence towards people of color, immigrants, religious minorities, LGBT people, especially black trans people, has increased significantly. You should also consider following Parker Molloy on Twitter who tweeted that link from Glaad:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1134549075003695105-447" src="https://platform.twitter.com/embed/Tweet.html?id=1134549075003695105"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1134549075003695105-447');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1134549075003695105&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I'm not sure if it's worth noting, but Apple does not have a PAC. That doesn't mean Apple isn't problematic in other ways, but that's a story for another time.&lt;/p&gt;

&lt;p&gt;How does this get fixed? Getting money out of politics would help. Given where we're at though just stop donating to bigoted candidates/policies. It's easy. I've never donated to one. Microsoft has very smart employees they can figure this out. If you must have a PAC, have it be managed by the underrepresented groups harmed by bigoted public policy. &lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Shout out to the folks that put in the work on Microsoft's pride campaign. I'm sure you worked hard on it, and didn't make the decisions that have lead to these political contributions. Shout out to Microsoft for donating $100k (just this year) to such worthwhile non-profits. Now please stop donating money to politicians that want to harm LGBT people. How do you think you're own LGBT employees feel knowing that their employer is giving money to people that want to deny them basic human rights?&lt;/p&gt;

&lt;p&gt;Finally, I really do want my VS Code icon to be rainbow colored all the time pretty please. But if I can't have that at least stop donating to bigoted politicians. &lt;/p&gt;

</description>
      <category>pride</category>
      <category>lgbt</category>
      <category>inclusion</category>
    </item>
    <item>
      <title>FAKE 5 Migration Cheat Sheet</title>
      <dc:creator>Jeremy Abbott</dc:creator>
      <pubDate>Sun, 23 Dec 2018 20:10:38 +0000</pubDate>
      <link>https://dev.to/jeremyabbott/fake-5-migration-cheat-sheet-2ak1</link>
      <guid>https://dev.to/jeremyabbott/fake-5-migration-cheat-sheet-2ak1</guid>
      <description>&lt;h1&gt;
  
  
  FAKE 5 Migration Cheat Sheet
&lt;/h1&gt;

&lt;p&gt;Happy holidays everyone!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkxv8wyiqsopwpt72n876.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkxv8wyiqsopwpt72n876.png" title="Happy holidays from Pikachu" alt="Pikachu in a Santa hat"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you start migrating from FAKE 4 and FAKE 5, you'll find that a simply opening the &lt;code&gt;FAKE&lt;/code&gt; namespace isn't enough. Also, if like me, deprecation warnings drive you mad, you'll want to get rid of them as quickly as possible. I made the following cheat sheet to expedite your FAKE migration (and to help me update the other scripts I still need to update.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Function/Module changes
&lt;/h2&gt;

&lt;p&gt;Below are the functions I've had to update more than once. Most of them at least require referencing a nuget package and/or opening a module that you didn't have to open before.&lt;/p&gt;

&lt;p&gt;Each of the following headers is the name of a FAKE 4 function. The snippet that follows shows how it is used in FAKE 4 followed by how to accomplish the same task in FAKE 5.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Target&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="nc"&gt;Target&lt;/span&gt; &lt;span class="s2"&gt;"Foo"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;_&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; 
    &lt;span class="n"&gt;printfn&lt;/span&gt; &lt;span class="s2"&gt;"Foo to the Bar"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Core&lt;/span&gt; &lt;span class="c1"&gt;// From the Fake.Core.Target nuget package&lt;/span&gt;

&lt;span class="nn"&gt;Target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="s2"&gt;"Foo"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;_&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;printfn&lt;/span&gt; &lt;span class="s2"&gt;"Foo to the Bar"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Target Operators
&lt;/h4&gt;

&lt;p&gt;All of the FAKE custom operators are in their own modules now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nn"&gt;Core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TargetOperators&lt;/span&gt; &lt;span class="c1"&gt;// From the Fake.Core.Target nuget package&lt;/span&gt;
&lt;span class="s2"&gt;"Clean"&lt;/span&gt;
    &lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Restore"&lt;/span&gt;
    &lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Build"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: FAKE 4 Target operators (from FakeLib) do not work with FAKE 5 targets (and vice versa). That means converting Targets to FAKE 5 means using the operators from FAKE 5.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;FullName&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./foo"&lt;/span&gt; &lt;span class="p"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;FullName&lt;/span&gt; &lt;span class="c1"&gt;// Auto-opened from Fake.FileSystemHelper&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IO&lt;/span&gt; 

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./foo"&lt;/span&gt; &lt;span class="p"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFullName&lt;/span&gt; &lt;span class="c1"&gt;// From the Fake.IO.FileSystem the nuget package &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;getBuildParam&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="c1"&gt;// In FAKE 4 getBuildParam implicitly called getBuildParamOrDefault with empty string as the default&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;userName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getBuildParam&lt;/span&gt; &lt;span class="s2"&gt;"userName"&lt;/span&gt; &lt;span class="c1"&gt;// Auto-opened from Fake.EnvironmentHelper&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Core&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;userName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="c1"&gt;// From nuget package Fake.Core.Environment&lt;/span&gt;
    &lt;span class="nn"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environVarOrDefault&lt;/span&gt; &lt;span class="s2"&gt;"UserName"&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Some Extra Notes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Passing arguments to your FAKE script is a little different in FAKE 5. In FAKE 4 you may have had something like&lt;/p&gt;

&lt;p&gt;&lt;code&gt;./build.sh &amp;lt;targetName&amp;gt; &amp;lt;buildParam&amp;gt;=foo&lt;/code&gt;, you now have a couple of different options, depending on your use case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# create an environment variable that's scoped to the current shell session.&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;myKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"my value"&lt;/span&gt;
./build.sh build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;myKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environVarOrDefault&lt;/span&gt; &lt;span class="s2"&gt;"myKey"&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to pass arguments on the command line, you have to pass them with the following syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# using the FAKE dotnet CLI tool&lt;/span&gt;
fake run build.fsx &lt;span class="nt"&gt;-t&lt;/span&gt; build &lt;span class="nt"&gt;--arg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then in build.fsx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="nn"&gt;Target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="s2"&gt;"Foo"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;printfn&lt;/span&gt; &lt;span class="s2"&gt;"args: %A"&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nn"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Arguments&lt;/span&gt;

    &lt;span class="n"&gt;printfn&lt;/span&gt; &lt;span class="s2"&gt;"%A "&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nn"&gt;Target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;runOrDefaultWithArguments&lt;/span&gt; &lt;span class="s2"&gt;"Foo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need to use &lt;code&gt;Target.runOrDefaultWithArguments&lt;/code&gt; instead of &lt;code&gt;Target.runOrDefault&lt;/code&gt; to access arguments this way. Additionally, the target function signature is now &lt;code&gt;string -&amp;gt; TargetParameter -&amp;gt; unit -&amp;gt; unit&lt;/code&gt;. You have to use the &lt;code&gt;TargetParameter&lt;/code&gt; (&lt;code&gt;p&lt;/code&gt; in the example above) to get access to it. &lt;code&gt;Context.Arguments&lt;/code&gt; is a &lt;code&gt;string list&lt;/code&gt;. You can use the module &lt;a href="https://fake.build/core-commandlineparsing.html" rel="noopener noreferrer"&gt;&lt;code&gt;Fake.Core.CommandLineParsing&lt;/code&gt;&lt;/a&gt; to parse the target arguments. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;parseAllReleaseNotes&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ReleaseNotesHelper&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;releaseNotes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ReadAllLines&lt;/span&gt; &lt;span class="s2"&gt;"RELEASE_NOTES.md"&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;releaseNotesData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
     &lt;span class="n"&gt;releaseNotes&lt;/span&gt;
     &lt;span class="p"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;parseAllReleaseNotes&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;List&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="n"&gt;releaseNotesData&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Core&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="c1"&gt;// From Fake.Core.ReleaseNotes nuget package&lt;/span&gt;
    &lt;span class="nn"&gt;ReleaseNotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt; &lt;span class="s2"&gt;"RELEASE_NOTES.md"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;SemVerHelper.parse&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;packageVersion&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;SemVerHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NugetVersion&lt;/span&gt; &lt;span class="c1"&gt;// From Fake.SemVerHelper&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Core&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;semVer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="c1"&gt;// From Fake.Core.SemVer nuget package&lt;/span&gt;
    &lt;span class="nn"&gt;SemVer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NugetVersion&lt;/span&gt;
&lt;span class="n"&gt;printfn&lt;/span&gt; &lt;span class="s2"&gt;"semver.Parse: %s"&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;|&lt;/span&gt; &lt;span class="n"&gt;semVer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ToString&lt;/span&gt;&lt;span class="bp"&gt;()&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;isUnix&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pathSep&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;isUnix&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"""&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"" else "&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s2"&gt;" // From Fake.EnvironmentHelper

// =======================================
// After
// =======================================
open Fake.Core

let pathSep = 
    // From the nuget package Fake.Core.Environment
    if Environment.isUnix then """&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;""" else "&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;ProcessHelper.tryFindFileOnPath&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;fooExe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;ProcessHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tryFindFileOnPath&lt;/span&gt; &lt;span class="s2"&gt;"foo"&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Core&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;fooExe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="c1"&gt;// From the nuget package Fake.Core.Process&lt;/span&gt;
    &lt;span class="nn"&gt;ProcessUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tryFindFileOnPath&lt;/span&gt; &lt;span class="s2"&gt;"foo"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;DotNetCli.GetDotNetSDKVersionFromGlobalJson()&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;dotnetcliVersion&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DotNetCli&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GetDotNetSDKVersionFromGlobalJson&lt;/span&gt;&lt;span class="bp"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DotNet&lt;/span&gt;

&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// From the nuget package Fake.DotNet.Cli&lt;/span&gt;
&lt;span class="c1"&gt;// In the namespace Fake.DotNet and module DotNet&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;dotnetcliVersion&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nn"&gt;CliVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GlobalJson&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;CleanDirs&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="c1"&gt;// Auto-opened from Fake.FileHelper&lt;/span&gt;
&lt;span class="nc"&gt;CleanDirs&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;exampleDir&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IO&lt;/span&gt;

&lt;span class="c1"&gt;//From the nuget package Fake.IO.FileSystem&lt;/span&gt;
&lt;span class="nn"&gt;Shell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cleanDirs&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;deployDir&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;ExecProcess&lt;/code&gt; / &lt;code&gt;Shell.Exec&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Shell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"--version"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;failwith&lt;/span&gt; &lt;span class="s2"&gt;"boom"&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Core&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="c1"&gt;// From the NuGet Package Fake.Core.Process&lt;/span&gt;
    &lt;span class="nn"&gt;CreateProcess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromRawCommand&lt;/span&gt; &lt;span class="s2"&gt;"dotnet"&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"--info"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ExitCode&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="n"&gt;failwith&lt;/span&gt; &lt;span class="s2"&gt;"boom"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;build&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight fsharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nc"&gt;Fake&lt;/span&gt;

&lt;span class="nc"&gt;Target&lt;/span&gt; &lt;span class="s2"&gt;"MSBuild"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;_&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;setMsBuildParams&lt;/span&gt; &lt;span class="n"&gt;defaultParams&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;defaultParams&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;
            &lt;span class="nc"&gt;Targets&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;&lt;span class="s2"&gt;"Build"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="nc"&gt;Properties&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Configuration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Debug"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Auto-opened from Fake.MSBuildHelper&lt;/span&gt;
    &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;setMsBuildParams&lt;/span&gt; &lt;span class="s2"&gt;"Foo.sln"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// =======================================&lt;/span&gt;
&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="c1"&gt;// =======================================&lt;/span&gt;

&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="nn"&gt;Fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DotNet&lt;/span&gt;

&lt;span class="nn"&gt;Target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="s2"&gt;"MSBuild"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;_&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;setMsBuildParams&lt;/span&gt; &lt;span class="n"&gt;defaultParams&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;defaultParams&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;
            &lt;span class="nc"&gt;Targets&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;&lt;span class="s2"&gt;"Build"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="nc"&gt;Properties&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Configuration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Debug"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nn"&gt;MSBuild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;setMsBuildParams&lt;/span&gt; &lt;span class="s2"&gt;"Foo.sln"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>f</category>
      <category>fake</category>
    </item>
    <item>
      <title>Hi, I'm Jeremy Abbott</title>
      <dc:creator>Jeremy Abbott</dc:creator>
      <pubDate>Sat, 06 May 2017 16:47:44 +0000</pubDate>
      <link>https://dev.to/jeremyabbott/hi-im-jeremy-abbott</link>
      <guid>https://dev.to/jeremyabbott/hi-im-jeremy-abbott</guid>
      <description>&lt;p&gt;I have been coding for 10 years.&lt;/p&gt;

&lt;p&gt;You can find me on GitHub as &lt;a href="https://github.com/jeremyabbott" rel="noopener noreferrer"&gt;jeremyabbott&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I live in Portland Oregon.&lt;/p&gt;

&lt;p&gt;I work for Incomm, Digital Solutions.&lt;/p&gt;

&lt;p&gt;I mostly program in these languages: F#, C#, JavaScript (TypeScript), SQL.&lt;/p&gt;

&lt;p&gt;I am currently learning more about Elixir, Postgres, Docker, Kubernetes, Azure.&lt;/p&gt;

&lt;p&gt;Nice to meet you.&lt;/p&gt;

</description>
      <category>introduction</category>
    </item>
  </channel>
</rss>
