<?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>Forem: Brian Nipper</title>
    <description>The latest articles on Forem by Brian Nipper (@briannipper).</description>
    <link>https://forem.com/briannipper</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%2F97781%2F41d5b26f-7327-4e5c-a614-39712fc44823.jpeg</url>
      <title>Forem: Brian Nipper</title>
      <link>https://forem.com/briannipper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/briannipper"/>
    <language>en</language>
    <item>
      <title>.NET MSTest and DeploymentItem Attribute</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 18 Oct 2018 14:30:00 +0000</pubDate>
      <link>https://forem.com/briannipper/net-mstest-and-deploymentitem-attribute-1nbe</link>
      <guid>https://forem.com/briannipper/net-mstest-and-deploymentitem-attribute-1nbe</guid>
      <description>

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-yUScwKt9f9U/W8fwKMIkjpI/AAAAAAAAHM8/XOOQefRICNkqfBvzhV0FQxt9DdxoZu3WACKgBGAs/s1600/CA5FCC3D-1D3E-4C3B-BA16-72809A47E0BA.jpeg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VdwYc7yZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://1.bp.blogspot.com/-yUScwKt9f9U/W8fwKMIkjpI/AAAAAAAAHM8/XOOQefRICNkqfBvzhV0FQxt9DdxoZu3WACKgBGAs/s320/CA5FCC3D-1D3E-4C3B-BA16-72809A47E0BA.jpeg" alt=""&gt;&lt;/a&gt;&lt;br&gt;
I was recently reminded that order of operation can byte you when trying to troubleshoot intermittent unit test failures.&lt;/p&gt;

&lt;p&gt;First, I’ll be the first to admit that if you want to avoid problems with unit testing it’s best to avoid any dependency outside of your actual code base, things like databases, API and even the file system are best avoided in execution of your unit tests. That last one, the file system, in some applications is really hard to avoid.&lt;/p&gt;

&lt;p&gt;If you happen to be using MSTest, a helpful attribute for your test is DeploymentItem. This particular attribute allows you to define a file within your unit test project assuming it’s marked as “Copy Always”. With this attribute in place you can then combine this with TestContext.DeploymentDirectory to find this sample file and then do what you need to do.&lt;/p&gt;

&lt;p&gt;In my particular case I was having an issue with the unit tests failing on the build machine but not locally. After stumbling around for a bit I finally feel back to the old debugging standard of printing out the entire directory of files to the console. It was at this point that I realized I was able to create files in the expected location so why could I not find the DeploymentItem? The answer, side effects.&lt;/p&gt;

&lt;p&gt;In one test I “moved” the resource item, and it had just been a situation where locally the tests “happen” to execute in an order such that the move operation was happening at the end of the test cycle, thus masking the problem. When I switch the test in question to “copy” the file, which was still a valid test mind you my problems went away.&lt;/p&gt;

&lt;p&gt;As an alternative approach to solving this problem you could make the file an embedded resource and then, in the arrange part of the test, write out the file to disk and then perform the test to ensure that the file always exists at the start.&lt;/p&gt;

&lt;p&gt;I hope this information helps others avoid wasting time with these type of silly order of operation problems.&lt;/p&gt;


</description>
      <category>net</category>
      <category>development</category>
      <category>problemsolving</category>
      <category>programming</category>
    </item>
    <item>
      <title>Keep Calm and Get the Facts</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 11 Oct 2018 14:30:00 +0000</pubDate>
      <link>https://forem.com/briannipper/keep-calm-and-get-the-facts-4mch</link>
      <guid>https://forem.com/briannipper/keep-calm-and-get-the-facts-4mch</guid>
      <description>

&lt;p&gt;It often amazes me at how often I find myself apologizing to others for rashly commenting on a problem before I have all the facts. In fact, after so many years as a professional in the IT space and dealing with countless critical situation/severity one problems (a.k.a. Sev1, crit-sit) I would be able to react in a more appropriate and beneficial manner. The sad truth is that, as I write this... to &lt;a href="https://www.briannipper.com/2018/10/keep-calm-and-get-facts.html"&gt;read more&lt;/a&gt;&lt;/p&gt;


</description>
      <category>communication</category>
      <category>problemsolving</category>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Compose a message through some else’s eyes</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 04 Oct 2018 14:30:00 +0000</pubDate>
      <link>https://forem.com/briannipper/compose-a-message-through-some-elses-eyes-24kk</link>
      <guid>https://forem.com/briannipper/compose-a-message-through-some-elses-eyes-24kk</guid>
      <description>

&lt;p&gt;Twilight Zone: The Eye of the BeholderI've always enjoyed science fiction work that intended to make the onlooker reflect on their world view, you know, really make you think about yourself. A wonderful example of that is the classic Twilight Zone: The Eye of the Beholder.Although I don't think it's needed at this point I will mention there are spoilers about this particular episode... &lt;a href="https://www.briannipper.com/2018/10/compose-message-through-some-elses-eyes.html"&gt;full article&lt;/a&gt;&lt;/p&gt;


</description>
      <category>communication</category>
      <category>criticalthinking</category>
      <category>productivity</category>
    </item>
    <item>
      <title>HTTP BIN - Developer Tools</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 27 Sep 2018 14:30:00 +0000</pubDate>
      <link>https://forem.com/briannipper/http-bin---developer-tools-22eh</link>
      <guid>https://forem.com/briannipper/http-bin---developer-tools-22eh</guid>
      <description>&lt;p&gt;&lt;a href="https://3.bp.blogspot.com/-qdMd20WyI1c/W6mR3wXF1SI/AAAAAAAAHK8/5S2MHzcD9iEBGubIUv1jNKLAkrt8gKqMgCLcBGAs/s1600/10_in_1_screwdriver.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F3.bp.blogspot.com%2F-qdMd20WyI1c%2FW6mR3wXF1SI%2FAAAAAAAAHK8%2F5S2MHzcD9iEBGubIUv1jNKLAkrt8gKqMgCLcBGAs%2Fs320%2F10_in_1_screwdriver.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of my favorite tools in my 10 in 1 screwdriver. The appeal is that in a single tool, just by flipping some pieces around you have just what you are looking for. In many minor jobs around the house I can do everything needed just with this single tool.&lt;/p&gt;

&lt;p&gt;When writing software you can find similar valuable tools and one such valuable tool is &lt;a href="http://httpbin.org/" rel="noopener noreferrer"&gt;http://httpbin.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like with most tools, the simplicity can be deceptive because how hard could it be to have an API that just echo's back what you sent. But then that is what is so great about httpbin, it's done and it's very robust.  &lt;/p&gt;

&lt;p&gt;By way of example, when building a front-end you may find that the API isn't complete and thus you want to "stub out" the calls. With httpbin you can send a call such that it echo's back what you want and thus you are wiring up to an actual HTTP call.  &lt;/p&gt;

&lt;p&gt;On the server side you might have the same need to wire up to a service that isn't something you are allowed to call from your local machine, but with httpbin you have the means of mocking with an actual HTTP call.&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>development</category>
      <category>network</category>
      <category>software</category>
    </item>
    <item>
      <title>Using telnet to troubleshoot connectivity.... and watch Star Wars</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 20 Sep 2018 14:30:00 +0000</pubDate>
      <link>https://forem.com/briannipper/using-telnet-to-troubleshoot-connectivity-and-watch-star-wars-5haf</link>
      <guid>https://forem.com/briannipper/using-telnet-to-troubleshoot-connectivity-and-watch-star-wars-5haf</guid>
      <description>&lt;p&gt;So the teaser I'll lead off with is, at the end of this post you'll know how to watch Star Wars A New Hope in ASCII art form (i.e. text based graphics)... So let's begin.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-ignzeE25inc/W6MB7SE3k9I/AAAAAAAAHKw/Ntk-y1vkga0gUbqebNS0c8GyXsSmyIcwQCLcBGAs/s1600/watching-star-wars-cmd-4telnet.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj9fwnb54ay3mq041kh4.jpg" width="400" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently I found myself working on a legacy application such that I had to redeploy the multi-node application into in Infrastructure running in Azure. Two of the models communicate via a WCF binding over net.tcp. While I was operating under the impression that the firewall had been opened up to allow the communication I was a bit stuck on how to validate that the communication was working. So I wandered up to the networking area to chat with our Network Architect. As I often find, chatting with those who have an expertise different than your own requires patience and effort in the area of translation. Even though we both work in the IT field we each have our jargon to deal with, but the price of admission is well worth it.&lt;/p&gt;

&lt;p&gt;In just a few minutes of explaining my challenge I had been provided with an excellent means of confirming that, from a networking perspective, communication was possible. Enter telnet. &lt;a href="https://en.wikipedia.org/wiki/Telnet" rel="noopener noreferrer"&gt;Telnet&lt;/a&gt;, if you may not know is a protocol that has come and gone in terms of it's heyday. Also to be clear, telnet is NOT secure and should NOT be left running, but in our case it's helpful as a tool for a short period of time.&lt;/p&gt;

&lt;p&gt;As originally stated I need to confirm communication via net.tcp between two nodes in a network was working, so how can one accomplish this "easily", well what we want to do is emulate the communication, so you can use telnet on the same port as the net.tcp listener and if you get a blank screen you've got connectivity. When a telnet client calls out to the target server over a port that is listening for traffic, say for an HTTP or NET.TCP request the response will come back and the telnet client won't know what to do other than show a blank screen. BUT it proves that the communication is working on that port. So the primary question is answered.&lt;/p&gt;

&lt;p&gt;So to the example of how this work and on to watching Star Wars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable Telnet Client&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;BE SURE TO DISABLE TELNET WHEN YOU ARE DONE WHICH I'LL MENTION AT THE END.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open a PowerShell command as Admin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the command&lt;br&gt;&lt;br&gt;
Enable-WindowsOptionalFeature -Online -FeatureName "TelnetClient"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Close PowerShell&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open command prompt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the command replacing your info as needed&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Telnet [IP or DNS] [Port for net.tcp listener]&lt;/p&gt;

&lt;p&gt;Example: Telnet google.com 443&lt;/p&gt;

&lt;p&gt;If you get a blank screen then an application is listening on the target port and communication is possible via NET.TCP (or HTTPS, etc).&lt;/p&gt;

&lt;p&gt;if you get the error "Could not open connection to the host, on port xxx: connect faild" then you might need to go back to the Firewall to see if something else is blocking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about Star Wars&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As promised, if you have enabled telnet and are done troubleshooting you can check out Star Wars via telnet by opening a telnet connection as follows.  &lt;/p&gt;

&lt;p&gt;telnet towel.blinkenlights.nl&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disable Telnet Client&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open a PowerShell command as Admin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the command&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disable-WindowsOptionalFeature -Online -FeatureName "TelnetClient"&lt;/p&gt;

</description>
      <category>network</category>
      <category>powershell</category>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Talk to the Rubber Duck</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 13 Sep 2018 14:30:00 +0000</pubDate>
      <link>https://forem.com/briannipper/talk-to-the-rubber-duck-2gmf</link>
      <guid>https://forem.com/briannipper/talk-to-the-rubber-duck-2gmf</guid>
      <description>&lt;p&gt;&lt;a href="https://3.bp.blogspot.com/-CkfYFe6C0w8/W5prSLrQo1I/AAAAAAAAHKk/fO3bcD_9Q1wzhIidxCxVk7bj9K6SIxaawCLcBGAs/s1600/640px-Rubber_duckies_So_many_ducks.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F3.bp.blogspot.com%2F-CkfYFe6C0w8%2FW5prSLrQo1I%2FAAAAAAAAHKk%2FfO3bcD_9Q1wzhIidxCxVk7bj9K6SIxaawCLcBGAs%2Fs320%2F640px-Rubber_duckies_So_many_ducks.jpg"&gt;&lt;/a&gt;&lt;br&gt;
| *See attribution of image at the bottom. |&lt;/p&gt;

&lt;p&gt;One of the greatest tricks I have had the pleasure of participating in is that of helping someone solve a problem simply by listening. I'm sure there is a more accurate description of this phenomenon, but in the world of programming it's called &lt;a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging" rel="noopener noreferrer"&gt;Rubber Duck Debugging&lt;/a&gt;. I was first introduced to this idea from listening to &lt;a href="https://en.wikipedia.org/wiki/Jeff_Atwood" rel="noopener noreferrer"&gt;Jeff Atwood&lt;/a&gt; podcasts/interviews as well as reading his blog under &lt;a href="https://blog.codinghorror.com/" rel="noopener noreferrer"&gt;CodingHorror.com&lt;/a&gt; he wrote about the topic under the title &lt;a href="https://blog.codinghorror.com/rubber-duck-problem-solving/" rel="noopener noreferrer"&gt;Ruber Duck Problem Solving&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Why the term Rubber Duck? Really it has nothing to do with the rubber duck, the intent is to encourage someone to solve their own problems by working through the very difficult challenge of describing what the problem actually is. It is often surprising to people when they discover that simply the act of attempting to describe a problem helps them to find the answer they were looking for.  &lt;/p&gt;

&lt;p&gt;So my approach to assist others is by asking questions that I often ask myself to help them work through the Rubber Duck process. For example if a developer where to ask me to help them with a particular bug the questions I ask them are seemingly obvious, but surprisingly, their answering them can often lead to an answer.   &lt;/p&gt;

&lt;p&gt;So what type of questions should you ask? The most obvious is "what is the problem" this question alone can often help you find the root of the issue and resolve the problem. Let's demonstrate this by way of a contrived example.  &lt;/p&gt;

&lt;p&gt;A developer is having a problem with her application communicating with a third party API service. So that is the "obvious" problem, but now comes the next question, are you ready... "why is that problem occurring?"&lt;br&gt;&lt;br&gt;
So how can the developer answer this question? Debugging is a great place to start. A great place to start is by attempting to reproduce the issue locally. It's worth noting that in our example this doesn't result in re-producing the issue found on the sever. Now in some cases, such as when the developer isn't permitted to remotely access the server being impacted, there is still much that has been found. How so? We now know that the application is NOT the issue, nor is the API service broken. This points to an environmental issue. So even when you can't reproduce the bug locally you obtain more information. In our derived example the developer now has facts that he can presented to other IT engineers such as networking, security or even server admins to engage with in a meaningful conversation to solve the problem.  &lt;/p&gt;

&lt;p&gt;Another interesting side effect of engaging in this approach is that you will find you have a broader understanding of how systems connect and interact. Additionally your "Google Fu" is improved as well as you can key in on the specific phrases related to your problem. This is an excellent skill to develop and when you find yourself in the position of the rubber duck you can ask the right questions to help someone else solve their own problem.  &lt;/p&gt;

&lt;p&gt;So go be a rubber duck.  &lt;/p&gt;

&lt;p&gt;*By &lt;a href="https://www.flickr.com/photos/gaetanlee/" rel="noopener noreferrer"&gt;gaetanlee&lt;/a&gt; - &lt;a href="https://www.flickr.com/photos/gaetanlee/298160434/" rel="noopener noreferrer"&gt;https://www.flickr.com/photos/gaetanlee/298160434/&lt;/a&gt;, &lt;a href="https://creativecommons.org/licenses/by/2.0" rel="noopener noreferrer"&gt;CC BY 2.0&lt;/a&gt;, &lt;a href="https://commons.wikimedia.org/w/index.php?curid=1456754" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>communication</category>
      <category>criticalthinking</category>
      <category>development</category>
      <category>programming</category>
    </item>
    <item>
      <title>Example of using LazyInitializer.EnsureInitialized</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 06 Sep 2018 14:30:00 +0000</pubDate>
      <link>https://forem.com/briannipper/example-of-using-lazyinitializerensureinitialized-3e6g</link>
      <guid>https://forem.com/briannipper/example-of-using-lazyinitializerensureinitialized-3e6g</guid>
      <description>&lt;p&gt;&lt;a href="https://2.bp.blogspot.com/-I6pWygiwGZ8/W4xk7uMLyaI/AAAAAAAAHKU/n3QXOFMoZtk8ZiLqt59Hwgq8WEnC8TVTgCLcBGAs/s1600/LazyMeme.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F2.bp.blogspot.com%2F-I6pWygiwGZ8%2FW4xk7uMLyaI%2FAAAAAAAAHKU%2Fn3QXOFMoZtk8ZiLqt59Hwgq8WEnC8TVTgCLcBGAs%2Fs320%2FLazyMeme.jpg"&gt;&lt;/a&gt;&lt;br&gt;
When looking at making systems more efficient it's helpful to think about being lazy. A helpful tool in the .NET tool belt is the static class under the System.Threading namespace LazyInitializer. In particular this class contains a method &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/system.threading.lazyinitializer.ensureinitialized?view=netframework-4.7.1" rel="noopener noreferrer"&gt;EnsureInitialized&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;This method is very simple to use and provides a convenient way to ensure that an initialization is called only once based on the value of the target property already being populated.  &lt;/p&gt;

&lt;p&gt;For example, if you need to load a file as part of the setting of values in an application you can use the EnsureInitialized method.  &lt;/p&gt;

&lt;p&gt;The following is a derived example of using the class to illustrate the usage pattern.  &lt;/p&gt;

&lt;p&gt;using System; using System.Collections.Generic; namespace Example.EnsureInitialized { class Program { static void Main(string[] args) { var configurationService = new ConfigurationService(); var configInfo = configurationService.ConfigInfo(); foreach(var configItem in configInfo) { Console.WriteLine(configItem.Value); } Console.ReadKey(); } } class ConfigurationService { private Dictionary _simpleExample; public ConfigurationService() { System.Threading.LazyInitializer.EnsureInitialized(ref _simpleExample, Init); } private Dictionary Init() { // The following would be replaced with some expensive operation like reading a file from disk. return new Dictionary { {1, "Hello"}, {2, "World"} }; } public Dictionary ConfigInfo() { return _simpleExample; } } } &lt;/p&gt;

</description>
      <category>net</category>
      <category>programming</category>
    </item>
    <item>
      <title>Automate Work and Life with IFTTT and Office 365 Flow</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 30 Aug 2018 14:30:00 +0000</pubDate>
      <link>https://forem.com/briannipper/automate-work-and-life-with-ifttt-and-office-365-flow-4p9b</link>
      <guid>https://forem.com/briannipper/automate-work-and-life-with-ifttt-and-office-365-flow-4p9b</guid>
      <description>&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-RoHALqTeen8/W378ua2-moI/AAAAAAAAHKI/ageLX_igdNov4K0rL_Yel1UcGroTjGLkgCLcBGAs/s1600/Screen%2BShot%2B2018-08-23%2Bat%2B2.27.39%2BPM.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F1.bp.blogspot.com%2F-RoHALqTeen8%2FW378ua2-moI%2FAAAAAAAAHKI%2FageLX_igdNov4K0rL_Yel1UcGroTjGLkgCLcBGAs%2Fs320%2FScreen%252BShot%252B2018-08-23%252Bat%252B2.27.39%252BPM.png"&gt;&lt;/a&gt;&lt;br&gt;
I'm a huge fan of automation for situations where I find myself doing something mindlessly over and over again, like punching a clock. The way I approach these problems is to find a way to eliminate some portion of the task and iterate till it just happens on it's own.&lt;/p&gt;

&lt;p&gt;To avoid confusion, when I say punching a clock what I mean is knowing a rough approximation of how long I worked on a given day so that when I need to put in my "billable vs. non-billable" time at the end of the week I have a rough idea of how much time I spent on working each day. As such the way I "manually" accomplished this was putting the time I arrived at work and the time I left into a spread sheet.&lt;/p&gt;

&lt;p&gt;So, step one, avoid having to open excel to enter the information. This was easy using a feature of Office 365 called &lt;a href="https://us.flow.microsoft.com/en-us/" rel="noopener noreferrer"&gt;Flow&lt;/a&gt;. It's an application that smells very similar to the populate If This Then That site (a.k.a. &lt;a href="http://ifttt.com/" rel="noopener noreferrer"&gt;IFTTT.com&lt;/a&gt;). Flow makes it easy to setup operations that interact with other parts of Office 365, such as creating files in OneDrive based off of attachments in an e-mail, creating reminders in Outlook, even putting info into a spreadsheet.&lt;/p&gt;

&lt;p&gt;Quick aside, Microsoft is bad at naming things, like really bad. In the case of Flow it's both the application as well as an instance of an activity that you create. So going forward when I say I created a "Flow" I mean I created an activity within the application Flow... right, bad at naming things... but I digress.&lt;/p&gt;

&lt;p&gt;All flows are comprised of at least two parts. An event/trigger and an action. For example, I could create a flow which would be described as follows...&lt;/p&gt;

&lt;p&gt;Every time I receive an e-mail (i.e. trigger/event) take all attachments on the e-mail and place them in OneDrive under a folder with the same name as the "from" e-mail address (i.e. action taken).&lt;/p&gt;

&lt;p&gt;Pretty handy. &lt;/p&gt;

&lt;p&gt;So in my case, the action was pretty easy, put a row of data in a spread sheet. But what would be my trigger? After some digging I landed on an interesting feature of Flow the application. Along with the Web Site/App up in the Office 365 subscription there is a mobile application you can install on any mobile device. Along with that you can create a "button" which can act as a trigger, so right from your phone you just tap and the trigger is fired. It has the added bonus of providing GPS data, if you chose, which can also be embedded in the flow for use in the action. So now my flow could be described as..&lt;/p&gt;

&lt;p&gt;Every time I press a button in the mobile Flow App on my device (i.e. trigger/event) put a row of data in a spread sheet I specify that includes the time the flow started to represent when I start/end work along with the GPS of where I pressed the button (i.e. action taken)&lt;/p&gt;

&lt;p&gt;At first I thought this was great and wonderful and was impressed that I had done all of this in the course of a few hours. However, after the novelty wore off I found that often I would forgot to press the button, and per my original goal I was still mindlessly doing something, even if it was a much smaller process.&lt;/p&gt;

&lt;p&gt;Enter IFTTT. IFTTT is probably also something that an enterprise could use; however, I most often think of it as a consumer service. IFTTT has a much easier way to describe creating activities, which they refer to as recipes. These recipes have the same "ingredients" as a flow. A trigger followed by an action. I should mention that Flow seems to be easier to customize as well as to support more extensive chained activities, but I digress. IFTTT also has a mobile app and, unlike flow, it supports GEO-Fencing, or the idea of a trigger based on entering or exiting a set of geo coordinates.&lt;/p&gt;

&lt;p&gt;I had already been using IFTTT for my "personal" automation projects. As such I had already had been using IFTTT to trigger an SMS to my lovely wife when I arrived at work or when I was heading out. In hindsight I'm wondering why this didn't hit me right away, but simply forwarding the SMS I sent to my spouse as an e-mail to my work address could be the I needed for the FLOW.&lt;/p&gt;

&lt;p&gt;So by "coupling" IFTTT and FLOW I was able to get the best of all worlds. I just go about my business and my spread sheet is updated for me. I even left the button flow in place so that when I work remote I can still keeping things down to a single button press and move on.&lt;/p&gt;

&lt;p&gt;What type of activities would like to automate in your day to day routine?&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ifttt</category>
      <category>office365</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Fire in London helped preserve the city of Savannah GA through the modern age</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 23 Aug 2018 14:00:00 +0000</pubDate>
      <link>https://forem.com/briannipper/fire-in-london-helped-preserve-the-city-of-savannah-ga-through-the-modern-age-42em</link>
      <guid>https://forem.com/briannipper/fire-in-london-helped-preserve-the-city-of-savannah-ga-through-the-modern-age-42em</guid>
      <description>&lt;p&gt;| &lt;a href="https://upload.wikimedia.org/wikipedia/commons/4/41/A_view_of_Savannah_as_it_stood_the_29th_of_March_1734.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F4%2F41%2FA_view_of_Savannah_as_it_stood_the_29th_of_March_1734.jpg" title="A view of Savannah as it stood the 29th of March 1734" alt="A view of Savannah as it stood the 29th of March 1734" width="800" height="640"&gt;&lt;/a&gt; |&lt;br&gt;
| By Pierre Fourdrinier and James Oglethorpe&lt;br&gt;&lt;br&gt;
[Public domain or Public domain], via Wikimedia Commons |&lt;/p&gt;

&lt;p&gt;Once upon a time, before my wife and I had kids, we visited the city of Savannah, GA. We had the opportunity to take a carriage ride through some of the most oldest portions of the planned city. A detail of the tour that has stuck out in my mind was how much of the original street remained unchanged. The reason this stuck out was, as I had found in visiting a few other historic locations on the east cost of the US, many locations as old, if not older, had to be altered to accommodate motor vehicles. So why was that not the case for the planned city of Savannah GA? Because of fires in London. Huh?  &lt;/p&gt;

&lt;p&gt;The founder of Savannah was &lt;a href="https://en.wikipedia.org/wiki/James_Oglethorpe" rel="noopener noreferrer"&gt;James Oglethorpe&lt;/a&gt;. Born in England in 1696, he would have been familiar with the fires that ravaged that part of the world in 1666. The &lt;a href="https://en.wikipedia.org/wiki/Great_Fire_of_London" rel="noopener noreferrer"&gt;great fire of London&lt;/a&gt; burned through much of the city due to many factors, one of which was the way homes were built, basically right up against one another. Out of that fire a new approach to city building came into fashion that of having easements between homes to help avoid the spread of fire.  &lt;/p&gt;

&lt;p&gt;This fascinated me as it turned out that in attempting to address the concern of fire by spacing out plots of lands and having larger pathways between the homes it resulted in a design that allowed the original layout to survive, more or less, down to our modern age.  &lt;/p&gt;

&lt;p&gt;As time progressed and the advent of items such as cars came along Savannah found it self having plenty of room to allow cars to flow in both directions, for sidewalks to be put in, for construction of sewers and electricity to be distributed all without the need to tear down or reroute the flow of movement.  &lt;/p&gt;

&lt;p&gt;Understanding the chain of events that caused choices to be made can be one of the most rewarding results in study of history.  &lt;/p&gt;

&lt;p&gt;So dear reader, what historical tidbits have captured your interest?&lt;/p&gt;

</description>
      <category>history</category>
    </item>
    <item>
      <title>Creating a DSC module to install Oracle Client and disable enable UAC</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 16 Aug 2018 14:00:00 +0000</pubDate>
      <link>https://forem.com/briannipper/creating-a-dsc-module-to-install-oracle-client-and-disable-enable-uac-3358</link>
      <guid>https://forem.com/briannipper/creating-a-dsc-module-to-install-oracle-client-and-disable-enable-uac-3358</guid>
      <description>

&lt;p&gt;You ever get a task and think, how hard can this be? Then you begin down what turns into a seemingly never ending journey.  &lt;/p&gt;

&lt;p&gt;Welcome to mixing old and new technologies.  &lt;/p&gt;

&lt;p&gt;I found myself in the position of needing to install the Oracle Client on a Windows VM running in Azure using Desired State Configuration (a.k.a. DSC) and, well, let's just say it was an interesting journey.  &lt;/p&gt;

&lt;p&gt;Listed directly after this is the snippet of the DSC which I'm posting here in hopes that others who have a similar need may stumble across this and save themselves from headache.  &lt;/p&gt;

&lt;p&gt;I'll provide a break down of the major pieces. I have intentionally left the logging pieces in the script so that any who would be so bold as to cut and paste without reading over at least have a log to dig into.  &lt;/p&gt;

&lt;p&gt;A few important prerequisites to using this script.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You'll need a DSC module that downloads the Oracle Client Package, the one I used was for 11gR2 and includes an answer file for the client.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These items will be specific to your situation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;br&gt;
&lt;li&gt;&lt;p&gt;Your Local Configuration Manager (a.k.a. LCM) should be set to allow DSC to reboot.&lt;/p&gt;&lt;/li&gt;
&lt;br&gt;
&lt;li&gt;&lt;p&gt;This script WILL disable UAC and if for some odd reason after the reboot the script did NOT continue running UAC is LEFT in a disabled state...&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;!! WARNING !! UAC SHOULD NOT BE LEFT DISABLED&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Be sure you understand what this script is doing and how to diagnose the state of the VM once the script runs.&lt;/p&gt;

&lt;p&gt;Script InsallOracleWithAnswerFile {&lt;/p&gt;

&lt;p&gt;TestScript = {&lt;/p&gt;

&lt;p&gt;$oraclePathTest = Test-Path HKLM:\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1;&lt;/p&gt;

&lt;p&gt;$regVal = Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA;&lt;/p&gt;

&lt;p&gt;if (($oraclePathTest) -and ($regVal.EnableLUA -eq 1)) {&lt;/p&gt;

&lt;p&gt;return $True&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;return $False&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;SetScript = {&lt;/p&gt;

&lt;p&gt;$continueProcessing = $True;&lt;/p&gt;

&lt;p&gt;$logTimestamp = Get-Date -Format yyMMddHHmm;&lt;/p&gt;

&lt;p&gt;$logPath = "C:\MyFolder\OracleInstallStatus";&lt;/p&gt;

&lt;p&gt;$logFile = "$logPath\install-$logTimestamp.log";&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- Begin Overall Oracle Install With Awnser --";&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- Opening - Get Curernt UAC VALUE --";&lt;/p&gt;

&lt;p&gt;$regVal = Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA;&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "UAC Reg Key:";&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value $regVal;&lt;/p&gt;

&lt;p&gt;if ($regVal.EnableLUA -eq "1") {&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- Change UAC to disable (i.e. 0) --";&lt;/p&gt;

&lt;p&gt;Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA -Value 0;&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- Set Global Falg to trigger Reboot --";&lt;/p&gt;

&lt;p&gt;$global:DSCMachineStatus = 1;&lt;/p&gt;

&lt;p&gt;$continueProcessing = $False;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if ($continueProcessing) {&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- Begin Check for Oracle Install --";&lt;/p&gt;

&lt;p&gt;$oracleRegPath = "HKLM:\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1";&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "Oracle Reg Path:";&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value $oracleRegPath;&lt;/p&gt;

&lt;p&gt;$oraclePathTest = Test-Path $oracleRegPath;&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "Results of Testing Reg Path";&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value $oraclePathTest;&lt;/p&gt;

&lt;p&gt;if ($oraclePathTest -eq $False) {&lt;/p&gt;

&lt;p&gt;$params = "-silent -nowelcome -noconsole -waitforcompletion -noconfig -responseFile C:\MyFolder\OraclePackage\Oracle11gClientx86\11g\x86\client\response\client_030514.rsp";&lt;/p&gt;

&lt;p&gt;$oracleClientExe = "C:\MyFolder\OraclePackage\Oracle11gClientx86\11g\x86\client\setup.exe";&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "--- Starting Oracle Install ---";&lt;/p&gt;

&lt;p&gt;Start-Process -FilePath $oracleClientExe -ArgumentList $params -Wait -Passthru;&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "--- Finish Oracle Install ---";&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "Oracle Reg Key was found so NOT running install."&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- Secondary - Get Current UAC Value --";&lt;/p&gt;

&lt;p&gt;$regVal = Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA;&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "UAC Reg Key:";&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value $regVal;&lt;/p&gt;

&lt;p&gt;if ($regVal.EnableLUA -eq "0") {&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- Change UAC to enable (i.e. 1) --";&lt;/p&gt;

&lt;p&gt;Set-ItemProperty -Path registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA -Value 1;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- Set Global Falg to trigger Reboot --";&lt;/p&gt;

&lt;p&gt;$global:DSCMachineStatus = 1;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Add-Content -Path $logFile -Value "-- FINISH Overall Oracle Install with Answer --"&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;GetScript = {@{Result = "InsallOracleWithAnswerFile"}}&lt;/p&gt;

&lt;p&gt;DependsOn = "[Archive]OraclePackageExtract"&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h3&gt;Test Script&lt;/h3&gt;

&lt;p&gt;In short the test script is confirming two things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the Oracle Client installed based on the expected registry key being present.&lt;/li&gt;
&lt;li&gt;Is UAC in the ENABLED state, also checked by looking at the expected registry key value.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If either of these conditions are FALSE there is a need to run the set script.&lt;/p&gt;

&lt;h3&gt;Set Script&lt;/h3&gt;

&lt;p&gt;This is where it gets &lt;del&gt;hairy&lt;/del&gt; interesting.&lt;/p&gt;

&lt;p&gt;I'll skip commenting on the logging as it should be clear what the logs are doing, an interesting point about the way the logging is done is that it can indicate how many times this script is run since the log is written to a file with a date time stamp as the name which I found handy since I put myself into an infinite loop a few times.&lt;/p&gt;

&lt;p&gt;Since I'll have to essentially provide myself a circuit breaker I set a continue flag at the start that I can use later on.&lt;/p&gt;

&lt;p&gt;Due to the way the Oracle Installer works, even WITH the answer file you'll still get a UAC prompt before you can begin the install, thus the first part of this set script will obtain the value of the UAC via a registry call.&lt;/p&gt;

&lt;p&gt;Once I have the UAC value I check to see the state of the value, in the case where it is ON (i.e. 1) I want to disable it so I change the registry value, also setting my continue flag to false and set the environment variable to tell DSC to reboot after this script is completed. Namely...&lt;br&gt;&lt;br&gt;
$gobal:DSCMachineStatus = 1;&lt;/p&gt;

&lt;p&gt;At this point I'm checking my flag to ensure that I SKIP attempting to install the oracle client, this is because even thought we updated the registry it does go into effect until we reboot and thus no need to run the Oracle Installer.&lt;/p&gt;

&lt;p&gt;So we log that we can't install the oracle client and continue on.&lt;/p&gt;

&lt;p&gt;The next bit also results in NOT applying changes since the UAC value in the registry is technically STILL 1 because UAC isn't ACTUALLY persisted until reboot.&lt;/p&gt;

&lt;p&gt;I am being sloppy at the end and RESETTING the DSCMachineStatus. Meh.&lt;/p&gt;

&lt;p&gt;So now we reboot.&lt;/p&gt;

&lt;p&gt;Now running through the script a second time AFTER the reboot we will be left in a state where the UAC IS disabled but we DO NOT have the Oracle Client installed, so when we run through the set script the oracle install WILL occur.&lt;/p&gt;

&lt;p&gt;We finish out the second run by enabled UAC and another reboot.&lt;/p&gt;

&lt;p&gt;When the system comes up on the third time UAC is ENABLED and Oracle Client is installed.&lt;/p&gt;

&lt;p&gt;Do please let me know if you run into issues with this script in the comments.&lt;/p&gt;


</description>
      <category>devops</category>
      <category>dsc</category>
      <category>howto</category>
      <category>oracle</category>
    </item>
    <item>
      <title>Resilient Scripting is scripting that can be rerun... safely</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 09 Aug 2018 21:47:00 +0000</pubDate>
      <link>https://forem.com/briannipper/resilient-scripting-is-scripting-that-can-be-rerun-safely-3115</link>
      <guid>https://forem.com/briannipper/resilient-scripting-is-scripting-that-can-be-rerun-safely-3115</guid>
      <description>&lt;p&gt;&lt;a href="https://2.bp.blogspot.com/-OpAbl076Y8o/W2yvk-FhKOI/AAAAAAAAHJo/mVd1WFJj4E094cwBvBxUb2E4xt5vjGOqgCLcBGAs/s1600/saftey-first.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqxggq70eolyev0igteu.jpg" width="265" height="320"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Making a script that is resilient can mean many different things to different people, IMHO an important one is to be able to re-run a script "safely". By safely I mean to minimize side effects and to prevent negative consequences.  &lt;/p&gt;

&lt;p&gt;To illustrate let's say we have an install process and we need to log details about what happens when we run the install.  &lt;/p&gt;

&lt;p&gt;To keep this simple let's just focus on the logging requirement.  &lt;/p&gt;

&lt;p&gt;We want a log file that we can look at when an install happens. So a simple approach would be as follows.  &lt;/p&gt;

&lt;p&gt;Set-Content log.txt "Information about Install"  &lt;/p&gt;

&lt;p&gt;Nice and simple, we have satisfied the requirement. But let's see if we can make this one liner more resilient.  &lt;/p&gt;

&lt;p&gt;$logFileTime = Get-Date yyMMddhhmmss&lt;/p&gt;

&lt;p&gt;$logFileName = $logFileTime + "_log.txt"&lt;/p&gt;

&lt;p&gt;Set-Content $logFileName "Information About Install"&lt;/p&gt;

&lt;p&gt;Now even if we run this install multiple times we will have a script for each instance of the install even when it happens on the same day during the same minute. Further more an interesting side effect of making a script more resilient is that we know can see how many times this install is run because we have a file for each instal attempt. So the benefits of making it more resilient compound.  &lt;/p&gt;

&lt;p&gt;I hope this simple example helps you dear reader see how taking a second pass at making a script more resilient, even a one liner can benefit from a second pass.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>powershell</category>
      <category>scripting</category>
    </item>
    <item>
      <title>Dogfooding is important for business policies as well</title>
      <dc:creator>Brian Nipper</dc:creator>
      <pubDate>Thu, 02 Aug 2018 17:42:00 +0000</pubDate>
      <link>https://forem.com/briannipper/dogfooding-is-important-for-business-policies-as-well-4nkp</link>
      <guid>https://forem.com/briannipper/dogfooding-is-important-for-business-policies-as-well-4nkp</guid>
      <description>&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-9myCI3xPtGM/W2NCdg1tMMI/AAAAAAAAHJY/E4kSQxoBd1sDpR9VZYH7XTZLB6rVsZrzQCLcBGAs/s1600/DogDish.jpeg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6a6189g66sai9gtescw.jpeg" width="320" height="240"&gt;&lt;/a&gt;&lt;br&gt;
Perhaps you are unfamiliar with the term "dogfooding", in short it is the idea that a company or organization use its own Product or Service in addition to providing it to the others. A more complete definition can be found on Wikipedia under &lt;a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food" rel="noopener noreferrer"&gt;Eating your own dog food&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;The reasons a group might chose to dogfood are varied, but an important reason is to ensure that they are familiar with the challenges with using the good or service, or to put it in business jargon... they want to find opportunities to make, what they make, better.  &lt;/p&gt;

&lt;p&gt;For groups that are just starting to do this it can be EYE OPENING what their customers/patrons are dealing with to use their stuff. Often the overall impact is great and everybody wins. So why not do this for policies within, let's say an IT organization. How would one go about dogfooding a policy you may ask? Thanks for asking... let me tell ya what I think.  &lt;/p&gt;

&lt;p&gt;For any organization to be successful there needs to be consistency in the way it approaches work. This is especially true for IT groups. The term consistent and repeatable is often spoken when discussing how to approach various aspects of the IT assembly line. At times the way to achieve this goal is to  determine a policy that governs the way IT associates do their work. Examples of this could be found in policies about documenting changes, how to request access to a system. You can see this even outside of IT, such as when a communications department issues a corporate policy on how to setup your e-mail signatures.  &lt;/p&gt;

&lt;p&gt;So back to the point I was making, it can be of GREAT benefit if the ones making the policy are sure to follow their own policy to ensure they are not creating any undo burden on those that the policy is enforced on. This can best be illustrated with a concrete example. Let's look at having a source code repository based on the GIT system with a Pull Request policy...  &lt;/p&gt;

&lt;p&gt;Now, most GIT systems have the concept of a branch policy that permits the owner to require a Pull Request to merge changes along with some level of approvers and perhaps even all comments to be resolved and a CI build to complete successful. If the corporate policy is to have this as the branch policy it stands to reason that even repos for the said owners should also have this policy. So why wouldn't they?  &lt;/p&gt;

&lt;p&gt;This is why a slippery slope mindset can occur and what can wind up causing groups to NOT dogfood their own policy. Further along our example, the policy maker has a repo which only he uses, so no reason to have a PR model, right I mean who is going to approve it if he's the only one working on the repo? This is where the real benefit of dogfooding the policy comes into play. Right off the bat it will require the policy maker to grasp the need of doing one of two things.  &lt;/p&gt;

&lt;p&gt;The first option would be to create an addendum to the policy which lifts the branch policy in terms of self review or having any reviews at all, but perhaps they still need to create a CI build which would again be ideal and help ensure the intent of the policy stick, i.e. that the intent of the policy is to have repos which are of high quality and the CI build on the PR prevents the master branch from being in a "unbuildable" state.  &lt;/p&gt;

&lt;p&gt;The second option, and the one I personally prefer, the policy owner would need to invite someone into the repo to do reviews thus further ensuring that policy is more fully adopted.  &lt;/p&gt;

&lt;p&gt;So if you find yourself in a position of setting policy it is helpful for all involved, including you dear policy maker, to adhere to the policy yourself.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
