<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Floyd Hilton</title>
    <description></description>
    <link>http://floydhilton.com/</link>
    <atom:link href="http://floydhilton.com/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Tue, 14 Aug 2018 16:05:45 +0000</pubDate>
    <lastBuildDate>Tue, 14 Aug 2018 16:05:45 +0000</lastBuildDate>
    <generator>Jekyll v3.7.3</generator>
    
      <item>
        <title>Intro to Application Monitoring</title>
        <description>&lt;p&gt;Which of these situations do you identify with more?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A customer reports an issue and your team starts trying to reproduce it.  Eventually it’s found that an error has been happening for a while, causing bad data, and it’s going to take a great deal to clean up. The customer is frustrated and other customers need to be notified, if you had only known sooner.&lt;/li&gt;
  &lt;li&gt;You receive an alert from your synthetic (live) testing that a new error is happening.  A new feature was turned on recently and logging suggests that the error stems from this new feature.  Custom metrics show that only the test user has used the new feature. You turn off the feature and clean the test data, crises averted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chances are you live somewhere in between the two extremes above.  If so read on, perhaps some of the following will be useful.&lt;/p&gt;

&lt;!--more--&gt;

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

&lt;p&gt;While at Mingle Analytics I helped put together an application monitoring system which helped us improve system performance, find unreported issues, and greatly speed up troubleshooting. The system also proactively tested the production system to help us quickly find issues before users encountered them.&lt;/p&gt;

&lt;!-- APM (combined with [RUM](#real-user-monitoring-rum) below) helped us find the source of some tricky issues.  One issue was a memory leak caused by a 3rd party component. Another issue was a front end bug that was intermittently sending thousands of requests, which in turn caused slow performance for all users.  The holistic view of server monitoring, stack traces, web requests and user info allowed us to quickly diagnose and fix the above issues. --&gt;

&lt;!-- In this post I'll go over the different parts of the system and give some details about each. --&gt;

&lt;p&gt;&lt;img src=&quot;/images/2018/07/MonitorLayers.png&quot; alt=&quot;Application Monitoring Layers&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The image above shows the different types of monitoring and the tools that were used.&lt;/p&gt;

&lt;p&gt;Lets take a look at each of the layers above and why you would use them.  &lt;br /&gt;
I’ll be starting at bottom with the most common type and work my way to the top.&lt;/p&gt;

&lt;p&gt;Here are some quick links if you want to skip to a section:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#overview&quot;&gt;Overview&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#server-monitoring---cpu-memory-disk&quot;&gt;Server Monitoring - CPU, Memory, Disk&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#application-level-logging&quot;&gt;Application Level Logging&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#log-aggregation&quot;&gt;Log Aggregation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#application-performance-monitoring-apm&quot;&gt;Application Performance Monitoring (APM)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#real-user-monitoring-rum&quot;&gt;Real User Monitoring (RUM)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#custom-metrics&quot;&gt;Custom Metrics&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#synthetic-live-testing&quot;&gt;Synthetic (Live) Testing&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#alerting&quot;&gt;Alerting&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#want-to-learn-more&quot;&gt;Want to learn more?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;server-monitoring---cpu-memory-disk&quot;&gt;Server Monitoring - CPU, Memory, Disk&lt;/h1&gt;

&lt;p&gt;Server monitoring is just what it sounds like: keeping an eye on your servers to make sure they are healthy. Is the CPU spiking?  Do we have a memory leak, a bad disk?  These are the types of questions you answer with server monitoring.&lt;/p&gt;

&lt;p&gt;Server monitoring is typically run by the IT/Operations side.  However, thanks to the DevOps movement, developers are becoming more aware of this type of monitoring.&lt;/p&gt;

&lt;p&gt;At Mingle the IT group put &lt;a href=&quot;https://www.logicmonitor.com&quot;&gt;LogicMonitor&lt;/a&gt; in place to do the server level monitoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some Server Monitoring Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.logicmonitor.com&quot;&gt;LogicMonitor&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/retrace/&quot;&gt;Stackify Retrace&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.datadoghq.com&quot;&gt;Datadog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.nagios.org/&quot;&gt;Nagios&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/monitoring-and-diagnostics/monitoring-overview&quot;&gt;Azure monitoring&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://collectd.org/&quot;&gt;collectd&lt;/a&gt; with &lt;a href=&quot;https://collectd.org/wiki/index.php/Table_of_Plugins&quot;&gt;plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Art-Monitoring-James-Turnbull-ebook/dp/B01GU387MS&quot;&gt;The Art of Monitoring Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;application-level-logging&quot;&gt;Application Level Logging&lt;/h1&gt;

&lt;p&gt;Application level logging is the first step to seeing what’s happening inside your running application.&lt;/p&gt;

&lt;p&gt;Logging is accomplished by adding code to your application that will tell you what parts of the application are being used and if there are any errors.&lt;/p&gt;

&lt;p&gt;Logging can be as simple as writing the info text to a file, though using a logging framework such as &lt;a href=&quot;https://logging.apache.org/log4net/&quot;&gt;log4net&lt;/a&gt; or &lt;a href=&quot;http://nlog-project.org/&quot;&gt;NLog&lt;/a&gt; provides additional functionality out of the box.&lt;/p&gt;

&lt;p&gt;At Mingle we used log4net for application logging.  We used the rolling file appender and kept a log file for each day of the month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When Logging an Application:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Use log levels to control the amount of logging.&lt;/li&gt;
  &lt;li&gt;If running the app on multiple servers, include the server name in the log file to prevent file locking issues.&lt;/li&gt;
  &lt;li&gt;Consider &lt;a href=&quot;https://stackify.com/what-is-structured-logging-and-why-developers-need-it/&quot;&gt;structuring your logs&lt;/a&gt; using JSON to help with later parsing.&lt;/li&gt;
  &lt;li&gt;Make sure you log any handled as well as unhandled exceptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Some Application Logging Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://logging.apache.org/log4net/&quot;&gt;log4net&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://nlog-project.org/&quot;&gt;NLog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.thejoyofcode.com/Logging_Levels_and_how_to_use_them.aspx&quot;&gt;Logging Levels and how to use them&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/csharp-logging-best-practices/&quot;&gt;C# logging best practices&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/what-is-structured-logging-and-why-developers-need-it/&quot;&gt;Structured logging&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/log4net-guide-dotnet-logging/&quot;&gt;Using log4net&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/nlog-guide-dotnet-logging/&quot;&gt;Using nLog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Art-Monitoring-James-Turnbull-ebook/dp/B01GU387MS&quot;&gt;The Art of Monitoring Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;log-aggregation&quot;&gt;Log Aggregation&lt;/h1&gt;

&lt;p&gt;Log aggregation pulls together all of your log files into a central location. Many tools allow the searching and filtering of log data to help zero in on the info needed.&lt;/p&gt;

&lt;p&gt;At Mingle we used &lt;a href=&quot;https://stackify.com/retrace/&quot;&gt;Stackify Retrace&lt;/a&gt; for log aggregation.  We found it very easy to setup and immediately began to see some errors that we had missed in the log files.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2018/07/RetraceLog.png&quot; alt=&quot;Application Monitoring Layers&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Useful features of Retrace log aggregation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Select a window of time and see the logs and other monitoring data all within the window.&lt;/li&gt;
  &lt;li&gt;Receive alerts of errors and their frequency.&lt;/li&gt;
  &lt;li&gt;Receive alerts when a search term is found in the log file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Some Log Aggregation Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/retrace/&quot;&gt;Stackify Retrace&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.datadoghq.com&quot;&gt;Datadog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.elastic.co/products/logstash&quot;&gt;Logstash&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/monitoring-and-diagnostics/monitoring-overview&quot;&gt;Azure Monitoring&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.splunk.com/&quot;&gt;Splunk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/log-aggregation-101/&quot;&gt;Log Aggregation 101&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;application-performance-monitoring-apm&quot;&gt;Application Performance Monitoring (APM)&lt;/h1&gt;

&lt;p&gt;APM tools typically help you see a breakdown of how each part of your application is performing.&lt;/p&gt;

&lt;p&gt;At Mingle we used &lt;a href=&quot;https://stackify.com/retrace/&quot;&gt;Stackify Retrace&lt;/a&gt; for APM.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2018/07/RetraceAPM.png&quot; alt=&quot;Application Monitoring Layers&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We were really impressed with the amount of information we received after installing Retrace:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Graphs showing
    &lt;ul&gt;
      &lt;li&gt;Number of requests&lt;/li&gt;
      &lt;li&gt;Average timing of web requests&lt;/li&gt;
      &lt;li&gt;A breakdown of where web requested time is spent (App code, database, Redis, etc)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Performance by
    &lt;ul&gt;
      &lt;li&gt;Request&lt;/li&gt;
      &lt;li&gt;SQL query&lt;/li&gt;
      &lt;li&gt;Web Service&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Code traces for slow or erroring code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of the above areas can be monitored and alerts can be sent when a threshold is breached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some APM Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/retrace/&quot;&gt;Stackify Retrace&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.datadoghq.com&quot;&gt;Datadog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://raygun.com/platform/apm&quot;&gt;Raygun APM&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/monitoring-and-diagnostics/monitoring-overview&quot;&gt;Azure Monitoring&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;real-user-monitoring-rum&quot;&gt;Real User Monitoring (RUM)&lt;/h1&gt;

&lt;p&gt;RUM shows how a web application is performing from a users point of view:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Who is logged in&lt;/li&gt;
  &lt;li&gt;Number of users&lt;/li&gt;
  &lt;li&gt;Location of users&lt;/li&gt;
  &lt;li&gt;Page load performance&lt;/li&gt;
  &lt;li&gt;Errors and crashes&lt;/li&gt;
  &lt;li&gt;Feature usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While APM is focused from the webserver down, RUM is focused on the web browser.&lt;br /&gt;
RUM is particularly important for applications that use the Single Page Application (SPA) model. In SPA applications most of the code runs in the web browser.  It’s quite possible for the SPA to be completely down and have the back APM reporting nothing but a lack of traffic.&lt;/p&gt;

&lt;p&gt;One of our main apps at Mingle was a SPA written in AngularJs. We decided to use &lt;a href=&quot;https://raygun.com&quot;&gt;Raygun&lt;/a&gt; to monitor our SPA application.&lt;/p&gt;

&lt;p&gt;Raygun proved useful for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Seeing the page load times by page or by user&lt;/li&gt;
  &lt;li&gt;Seeing performance issues from the user point of view&lt;/li&gt;
  &lt;li&gt;Knowing the number of active users&lt;/li&gt;
  &lt;li&gt;Identifying specific users that were having performance issues&lt;/li&gt;
  &lt;li&gt;Catching front end errors&lt;/li&gt;
  &lt;li&gt;Tracking user info such as browser type and location&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We created a custom plugin for Raygun that would push errors and performance information to &lt;a href=&quot;https://stackify.com/retrace/&quot;&gt;Stackify Retrace&lt;/a&gt; via a back-end API.  This allowed us to have all of our error logging and alerting in one place.&lt;/p&gt;

&lt;p&gt;Note that Raygun continues to evolve and now has many &lt;a href=&quot;https://raygun.com/docs/plugins/&quot;&gt;plugins&lt;/a&gt; to allow the export of alerts and data. Raygun is also starting to work in the &lt;a href=&quot;https://raygun.com/platform/apm&quot;&gt;APM space&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some RUM Tools&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://raygun.com&quot;&gt;Raygun&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://traceview.solarwinds.com/&quot;&gt;TraceView&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/what-is-real-user-monitoring/&quot;&gt;What is real user monitoring?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;custom-metrics&quot;&gt;Custom Metrics&lt;/h1&gt;

&lt;p&gt;While APM tools can give you quite a bit of metric information out of the box, it’s often necessary to complete the pictures using your own custom metrics.&lt;/p&gt;

&lt;p&gt;Custom metrics are used for insight into both the technical and business sides of the application.&lt;/p&gt;

&lt;p&gt;Typical metrics might be:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Business
    &lt;ul&gt;
      &lt;li&gt;Number of users per day&lt;/li&gt;
      &lt;li&gt;Number of new users&lt;/li&gt;
      &lt;li&gt;Number of sales&lt;/li&gt;
      &lt;li&gt;Sales amounts&lt;/li&gt;
      &lt;li&gt;Page views&lt;/li&gt;
      &lt;li&gt;Features used&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Technical
    &lt;ul&gt;
      &lt;li&gt;Errors&lt;/li&gt;
      &lt;li&gt;Failed logins&lt;/li&gt;
      &lt;li&gt;Performance of specific requests or actions&lt;/li&gt;
      &lt;li&gt;Latency and response time of requests&lt;/li&gt;
      &lt;li&gt;Volumes of data transferred&lt;/li&gt;
      &lt;li&gt;Requests and responses&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We used &lt;a href=&quot;https://docs.stackify.com/docs/custom-metrics-overview&quot;&gt;Retraces custom metrics&lt;/a&gt; to log page load times from Raygun as well as the number of logins and the performance of different parts of the system.&lt;/p&gt;

&lt;p&gt;Custom metrics in Retrace are good for basic items but we ran up against the following limitations:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;All metrics are by the minute, no custom time frame.&lt;/li&gt;
  &lt;li&gt;No support for using percentiles instead of average.&lt;/li&gt;
  &lt;li&gt;Limited access to the metric data to perform our own analysis.
    &lt;ul&gt;
      &lt;li&gt;There is a basic API for metric data but it allows you to access the same info as the dashboard, averaged by the minute.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Some tools with custom metrics support&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackify.com/retrace/&quot;&gt;Stackify Retrace&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.datadoghq.com&quot;&gt;Datadog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/monitoring-and-diagnostics/monitoring-overview&quot;&gt;Azure Monitoring&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/etsy/statsd&quot;&gt;StatsD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.dynatrace.com/news/blog/why-averages-suck-and-percentiles-are-great/&quot;&gt;Why Averages Suck and Percentiles are Great&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;synthetic-live-testing&quot;&gt;Synthetic (Live) Testing&lt;/h1&gt;

&lt;p&gt;Synthetic testing means running tests in production.&lt;/p&gt;

&lt;p&gt;We used custom metrics to monitor the performance of our synthetic tests and give us an early warning for any front end performance related issues.&lt;/p&gt;

&lt;p&gt;We setup &lt;a href=&quot;https://www.jetbrains.com/teamcity/&quot;&gt;TeamCity&lt;/a&gt; to run &lt;a href=&quot;https://www.seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt; tests which logged into the application as a test user and performed tasks.  We would then track and alert on metrics based on the test user ID.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2018/07/Synthetic.png&quot; alt=&quot;Application Monitoring Layers&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;alerting&quot;&gt;Alerting&lt;/h1&gt;

&lt;p&gt;Server level alerting was handled by &lt;a href=&quot;https://www.logicmonitor.com&quot;&gt;LogicMonitor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All other alerting was handled by &lt;a href=&quot;https://stackify.com/retrace/&quot;&gt;Stackify Retrace&lt;/a&gt; and routed to &lt;a href=&quot;https://slack.com/&quot;&gt;Slack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Slack we had a dedicated “Production Issues” channel that was highly guarded and set up to always alert subscribers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alterting tip&lt;/strong&gt;: Make sure alerts are real and infrequent. Too many alerts quickly turn into noise that is ignored.&lt;/p&gt;

&lt;h1 id=&quot;want-to-learn-more&quot;&gt;Want to learn more?&lt;/h1&gt;

&lt;p&gt;Please reach out to me on &lt;a href=&quot;https://twitter.com/fhilton&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/floydhilton/&quot;&gt;LinkedIn&lt;/a&gt; or contact me at &lt;a href=&quot;http://www.tacomasoftware.com#contact&quot;&gt;TacomaSoftware&lt;/a&gt; if you want more details about application monitoring.&lt;/p&gt;

&lt;!-- | Tool             | Server | Log   | Log Agg | APM   | RPM   | Metrics |
| :--------------- | :----: | :---: | :-----: | :---: | :---: | :-----: |
| Stackify Retrace | x      | x     | x       | x     | x     | x       |
| Stackify Retrace | x      | x     | x       | x     | x     | x       | --&gt;

</description>
        <pubDate>Fri, 13 Jul 2018 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/devops/2018/07/13/Intro-to-Application-Monitoring.html</link>
        <guid isPermaLink="true">http://floydhilton.com/devops/2018/07/13/Intro-to-Application-Monitoring.html</guid>
        
        <category>Monitoring</category>
        
        <category>Stackify</category>
        
        <category>Azure</category>
        
        <category>.NET</category>
        
        <category>Web</category>
        
        
        <category>DevOps</category>
        
      </item>
    
      <item>
        <title>Azure Bootcamp Prerequisites - Docker on Azure</title>
        <description>&lt;p&gt;Below are the prerequisites for the &lt;a href=&quot;https://www.meetup.com/CascoBayNUG/events/236227762/&quot;&gt;Global Azure Bootcamp&lt;/a&gt; hands on lab “Docker on Azure”.&lt;br /&gt;
&lt;!--more--&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#exercise-files&quot;&gt;Exercise Files&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#putty&quot;&gt;PuTTY&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#docker-for-windows&quot;&gt;Docker for Windows&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#visual-studio-tools-for-docker&quot;&gt;Visual Studio Tools for Docker&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#docker-hub-account&quot;&gt;Docker Hub Account&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;exercise-files&quot;&gt;Exercise Files&lt;/h4&gt;

&lt;p&gt;The exercise files are located in &lt;a href=&quot;https://github.com/Microsoft/TechnicalCommunityContent/tree/master/Open%20Dev%20Framework/Docker/Session%203%20-%20Hands%20On&quot;&gt;this&lt;/a&gt; GitHub repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The GitHub repo is HUGE.  I create a smaller zip file of the Docker files for the lab &lt;a href=&quot;https://dl.dropboxusercontent.com/u/47903262/TechCommContent_Docker.zip&quot;&gt;here&lt;/a&gt; if you don’t want to clone the whole repository.&lt;/p&gt;

&lt;h4 id=&quot;putty&quot;&gt;PuTTY&lt;/h4&gt;
&lt;p&gt;Install PuTTY from here: &lt;a href=&quot;http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&quot;&gt;http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;docker-for-windows&quot;&gt;Docker for Windows&lt;/h4&gt;
&lt;p&gt;Install Docker for Windows from the Stable channel here:  &lt;a href=&quot;https://docs.docker.com/docker-for-windows/install/&quot;&gt;https://docs.docker.com/docker-for-windows/install/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker for Windows installs the Docker Client and Docker Daemon which allows you to run both Linux and Windows based containers.&lt;/p&gt;

&lt;h4 id=&quot;visual-studio-tools-for-docker&quot;&gt;Visual Studio Tools for Docker&lt;/h4&gt;
&lt;p&gt;Docker support needs to be installed as an extension in VS 2015, and a workload in VS 2017, the examples for each are described below.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;For Visual Studio 2015&lt;strong&gt;
&lt;/strong&gt;&lt;/strong&gt;    &lt;ul&gt;
      &lt;li&gt;Install &lt;a href=&quot;https://www.microsoft.com/net/core#windowscmd&quot;&gt;.NET Core 1.0.1 VS 2015 Tooling Preview 2SDK&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;You need this specific version or the extension will not install&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Tools for Docker Extension
        &lt;ul&gt;
          &lt;li&gt;In Visual Studio 2015, go to Tools-&amp;gt;Extensions and Updates&lt;/li&gt;
          &lt;li&gt;Search for docker tools and click download&lt;br /&gt;
&lt;img src=&quot;/images/2017/04/VS2015Ext.png&quot; alt=&quot;Install Extension&quot; /&gt;&lt;/li&gt;
          &lt;li&gt;Open the downloaded file to install&lt;/li&gt;
          &lt;li&gt;Create a new .NET Core application, right click on the project, select Add and verify that “Docker Support” is listed.&lt;br /&gt;
&lt;img src=&quot;/images/2017/04/AddDockerSupport.png&quot; alt=&quot;Docker Support&quot; /&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;For Visual Studio 2017&lt;strong&gt;
&lt;/strong&gt;&lt;/strong&gt;    &lt;ul&gt;
      &lt;li&gt;Go to Start-&amp;gt;Visual Studio Installer&lt;/li&gt;
      &lt;li&gt;Click Modify&lt;/li&gt;
      &lt;li&gt;Select the “Azure Development” Workload&lt;br /&gt;
&lt;img src=&quot;/images/2017/04/AzureWorkload.png&quot; alt=&quot;Azure Workload&quot; /&gt;&lt;/li&gt;
      &lt;li&gt;Select the “.NET Core cross-platform development” Workload&lt;br /&gt;
&lt;img src=&quot;/images/2017/04/NetCoreCrossPlatWorkload.png&quot; alt=&quot;NET Cross Plat Workload&quot; /&gt;&lt;/li&gt;
      &lt;li&gt;Click modify to install&lt;/li&gt;
      &lt;li&gt;Create a new .NET Core application, right click on the project, select Add and verify that “Docker Support” is listed.&lt;br /&gt;
&lt;img src=&quot;/images/2017/04/AddDockerSupport.png&quot; alt=&quot;Docker Support&quot; /&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;docker-hub-account&quot;&gt;Docker Hub Account&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/&quot;&gt;Sign up for a Docker Hub account&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker Hub is a repository for both Linux and Windows Docker images.&lt;br /&gt;
We will use Docker Hub to host an image that will then be deployed to Azure.&lt;/p&gt;

</description>
        <pubDate>Wed, 12 Apr 2017 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/docker/2017/04/12/Azure-Bootcamp-Prerequisites.html</link>
        <guid isPermaLink="true">http://floydhilton.com/docker/2017/04/12/Azure-Bootcamp-Prerequisites.html</guid>
        
        <category>Blog</category>
        
        <category>Docker</category>
        
        <category>Azure</category>
        
        <category>.NET</category>
        
        
        <category>Docker</category>
        
      </item>
    
      <item>
        <title>Viewing .NET Framework Source Code - Open Source or Closed with ILSpy and Visual Studio</title>
        <description>&lt;p&gt;Ever want (or need) to know how the .NET Framework is working under the covers?&lt;/p&gt;

&lt;p&gt;Thanks to the new “Open Source” Microsoft, viewing the framework code is easier than ever.&lt;/p&gt;

&lt;p&gt;But what if you are not using an open source version of .NET? Use a decompiler such as &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.ILSpy&quot;&gt;ILSpy&lt;/a&gt; or &lt;a href=&quot;https://www.jetbrains.com/decompiler/&quot;&gt;dotPeek&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;

&lt;!--#### TL;DR - To the point--&gt;

&lt;p&gt;&lt;strong&gt;Some useful Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/Microsoft/dotnet&quot;&gt;Landing point for .NET code on GitHub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;.NET Core&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dotnet&quot;&gt;Source code shepherded by the .NET Foundation - Including .NET Core&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dotnet/core&quot;&gt;.NET Core&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/aspnet/&quot;&gt;ASP.NET Core&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dotnet/roslyn&quot;&gt;Roslyn Compiler&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/aspnet/EntityFramework&quot;&gt;Entity Framework Core&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;.NET Framework&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/referencesource&quot;&gt;.NET Framework (non-core) Reference (Subset of the full framework)&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://referencesource.microsoft.com/&quot;&gt;Browse and search the .NET Framework (non-core) reference&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://aspnetidentity.codeplex.com/&quot;&gt;Identity 2.0 (Until CodePlex shuts down)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Decompile using ILSpy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you can’t find the source code above, or just want to quickly look at the version you are using:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Install the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.ILSpy&quot;&gt;ILSpy extension for Visual Studio (2012-2017)&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;/images/2017/04/2017-04-06_11_38_34-Extensions and Updates.png&quot; alt=&quot;Install ILSpy Extension in Visual Studio&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Right click on an assembly and click “Open in ILSpy”&lt;br /&gt;
&lt;img src=&quot;/images/2017/04/2017-04-06_11_39_27-OLA - Microsoft Visual Studio.png&quot; alt=&quot;Right click to view decompiled source&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Thu, 06 Apr 2017 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/docker/2017/04/06/NET-Framework-Open-Source-ILSpy.html</link>
        <guid isPermaLink="true">http://floydhilton.com/docker/2017/04/06/NET-Framework-Open-Source-ILSpy.html</guid>
        
        <category>Blog</category>
        
        <category>ALM</category>
        
        <category>Open Source</category>
        
        <category>.NET</category>
        
        
        <category>Docker</category>
        
      </item>
    
      <item>
        <title>Understanding Docker &quot;Container Host&quot; vs. &quot;Container OS&quot; for Linux and Windows Containers</title>
        <description>&lt;p&gt;Lets explore the relationship between the “Container Host” and the “Container OS” and how they differ between Linux and Windows containers.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h4 id=&quot;some-definitions&quot;&gt;Some Definitions:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Container Host:&lt;/strong&gt; Also called the &lt;strong&gt;Host OS&lt;/strong&gt;. The Host OS is the operating system on which the Docker client and Docker daemon run.  In the case of Linux and non-Hyper-V containers, the Host OS shares its kernel with running Docker containers. For Hyper-V each container has its own Hyper-V kernel.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Container OS:&lt;/strong&gt; Also called the &lt;strong&gt;Base OS&lt;/strong&gt;. The base OS refers to an image that contains an operating system such as Ubuntu, CentOS, or windowsservercore. Typically, you would build your own image on top of a Base OS image so that you can take utilize parts of the OS. Note that windows containers require a Base OS, while Linux containers do not.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Operating System Kernel:&lt;/strong&gt; The Kernel manages lower level functions such as memory management, file system, network and process scheduling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;now-for-some-pictures&quot;&gt;Now for some pictures:&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/images/2017/03/2017-03-31_14_50_13-Radom Learnings, Online Whiteboard for Visual Collaboration.png&quot; alt=&quot;Linux Containers&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the above example&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The Host OS is Ubuntu.&lt;/li&gt;
  &lt;li&gt;The Docker Client and the Docker Daemon (together called the Docker Engine) are running on the Host OS.&lt;/li&gt;
  &lt;li&gt;Each container shares the Host OS kernel.&lt;/li&gt;
  &lt;li&gt;CentOS and BusyBox are Linux Base OS images.&lt;/li&gt;
  &lt;li&gt;The “No OS” container demonstrates that you do not NEED a base OS to run a container in Linux.  You can create a Docker file that has a base image of &lt;a href=&quot;https://hub.docker.com/_/scratch/&quot;&gt;scratch&lt;/a&gt; and then runs a binary that uses the kernel directly.&lt;/li&gt;
  &lt;li&gt;Check out &lt;a href=&quot;https://www.brianchristner.io/docker-image-base-os-size-comparison/&quot;&gt;this&lt;/a&gt; article for a comparison of Base OS sizes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/2017/03/2017-03-31_15_04_03-Radom Learnings, Online Whiteboard for Visual Collaboration.png&quot; alt=&quot;Windows Containers - Non Hyper-V&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the above example&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The Host OS is Windows 10 or Windows Server.&lt;/li&gt;
  &lt;li&gt;Each container shares the Host OS kernel.&lt;/li&gt;
  &lt;li&gt;All windows containers require a Base OS of either &lt;a href=&quot;https://hub.docker.com/r/microsoft/nanoserver/&quot;&gt;nanoserver&lt;/a&gt; or &lt;a href=&quot;https://hub.docker.com/r/microsoft/windowsservercore/&quot;&gt;windowsservercore&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/2017/03/2017-03-31_15_41_31-Radom Learnings, Online Whiteboard for Visual Collaboration.png&quot; alt=&quot;Windows Containers - Hyper-V&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the above example&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The Host OS is Windows 10 or Windows Server.&lt;/li&gt;
  &lt;li&gt;Each container is hosted in its own light weight Hyper-V VM.&lt;/li&gt;
  &lt;li&gt;Each container uses the kernel inside the Hyper-V VM which provides an extra layer of separation between containers.&lt;/li&gt;
  &lt;li&gt;All windows containers require a Base OS of either &lt;a href=&quot;https://hub.docker.com/r/microsoft/nanoserver/&quot;&gt;nanoserver&lt;/a&gt; or &lt;a href=&quot;https://hub.docker.com/r/microsoft/windowsservercore/&quot;&gt;windowsservercore&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A couple of good links:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/&quot;&gt;About windows containers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.xebia.com/deep-dive-into-windows-server-containers-and-docker-part-2-underlying-implementation-of-windows-server-containers/&quot;&gt;Deep dive into the implementation Windows Containers including multiple User Modes and “copy-on-write” to save resources&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/#the-copy-on-write-strategy&quot;&gt;How Linux containers save resources by using “copy-on-write”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 31 Mar 2017 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/docker/2017/03/31/Docker-ContainerHost-vs-ContainerOS-Linux-Windows.html</link>
        <guid isPermaLink="true">http://floydhilton.com/docker/2017/03/31/Docker-ContainerHost-vs-ContainerOS-Linux-Windows.html</guid>
        
        <category>Blog</category>
        
        <category>Docker</category>
        
        <category>Windows Container</category>
        
        <category>Microsoft</category>
        
        <category>Linux</category>
        
        
        <category>Docker</category>
        
      </item>
    
      <item>
        <title>Running Docker Containers in Microsoft Azure</title>
        <description>&lt;p&gt;There are multiple options for running Docker containers in Microsoft Azure. Below the options are broken out by the need to run an app in a single container or an app composed of multiple containers.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3 id=&quot;monolithic-single-container-apps&quot;&gt;Monolithic (Single Container) Apps&lt;/h3&gt;
&lt;p&gt;An application does not need to be built out of microservices to benefit from the advantages of containers.&lt;br /&gt;
Developing a monolithic application in a container gives the advantages of dependency management, portability and ease of deployment.&lt;/p&gt;

&lt;p&gt;Options for running single containers in Azure:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://azure.microsoft.com/en-us/services/app-service/web/&quot;&gt;Azure App Service&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Azure App Service now supports running Docker containers using Linux.  You can configure containers to be run using the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/app-service-web/app-service-linux-using-custom-docker-image&quot;&gt;Azure Portal&lt;/a&gt; or &lt;a href=&quot;https://blogs.msdn.microsoft.com/webdev/2016/11/16/new-docker-tools-for-visual-studio/&quot;&gt;create a containerized application and deploy the container directly to App Service using Visual Studio&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;You can setup a continuous delivery pipeline for your App Service in Visual Studio Team Services using the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=VSIDEDevOpsMSFT.ContinuousDeliveryToolsforVisualStudio&quot;&gt;Continuous Delivery Tools for Visual Studio&lt;/a&gt; extension.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Azure VM - IAAS using ARM Templates&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;You can create your own VM using &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-overview&quot;&gt;Azure Resource Manager (ARM)&lt;/a&gt; Templates and install Docker.  From there you can use &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-overview&quot;&gt;Azure VM Scale Sets&lt;/a&gt; to scale your service as needed.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that “Visual Studio Tools for Docker” is part of Visual Studio 2017 and available as an &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MicrosoftCloudExplorer.VisualStudioToolsforDocker-Preview&quot;&gt;extension&lt;/a&gt; for Visual Studio 2015.&lt;/p&gt;

&lt;h3 id=&quot;service-oriented-multiple-container-apps&quot;&gt;Service-oriented (Multiple Container) Apps&lt;/h3&gt;
&lt;p&gt;Containers really shine when it comes to building Service-oriented architectures.  Using services gives the ability to scale only the required parts of the application and allows developers to improve a single part of the system at a time.&lt;/p&gt;

&lt;p&gt;While the above sounds great, the hard part is keeping track of all the containers.&lt;br /&gt;
Tools that help manage the provisioning, scheduling and monitoring of containers are called &lt;strong&gt;orchestrators&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can use just about any orchestrator with Azure because you can manually create VMs and install whatever you like on them.  &lt;br /&gt;
Installing and configuring orchestrators is a complicated process.  Microsoft has gone to great lengths to make configuring Orchestrators easier with the  &lt;a href=&quot;https://azure.microsoft.com/en-us/services/container-service/&quot;&gt;Azure Container Service (ACS)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Options for orchestrating containers in Azure:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://azure.microsoft.com/en-us/services/container-service/&quot;&gt;Azure Container Service (ACS)&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Azure Container Service makes it easier to setup orchestration by pre-configuring the hosting environment and deploying the orchestrator for you.  Select the orchestrator, the size and number of VMs and ACS takes care of the rest.&lt;/p&gt;

    &lt;p&gt;ACS currently supports (as of March 2017):&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Docker Swarm (not to be confused with the new Docker Swarm Mode)&lt;/li&gt;
      &lt;li&gt;Kubernetes&lt;/li&gt;
      &lt;li&gt;DC/OS&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;There are some great tutorials in the &lt;a href=&quot;https://github.com/Microsoft/TechnicalCommunityContent/tree/master/Open%20Dev%20Framework/Docker&quot;&gt;Technical Community Content&lt;/a&gt; repository on GitHub if you want to try out ACS.&lt;/p&gt;

    &lt;p&gt;You can setup a continuous delivery pipeline for your Azure Container Service in Visual Studio Team Services using the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=VSIDEDevOpsMSFT.ContinuousDeliveryToolsforVisualStudio&quot;&gt;Continuous Delivery Tools for Visual Studio&lt;/a&gt; extension.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://azure.microsoft.com/en-us/services/service-fabric/&quot;&gt;Azure Service Fabric&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Azure Service Fabric is Microsoft’s orchestrator that was originally used internally for services such as Azure DocumentDB, Azure SQL Databases and Skype for Business.  Service Fabric can be installed on premises or in a cloud provider such as Azure or AWS.  Service Fabric can run Linux and Windows containers.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Azure VM - IAAS using ARM Templates&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;As with the monolithic containers above, you can provision your own VMs and install your own orchestrator.&lt;/p&gt;

    &lt;p&gt;There is a great example &lt;a href=&quot;https://github.com/tripdubroot/ContainerCamp/blob/master/labfour/deploy-docker-swarm.md&quot;&gt;here&lt;/a&gt; on how to use the &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/get-started-with-azure-cli&quot;&gt;Azure CLI&lt;/a&gt; to setup and run &lt;a href=&quot;https://docs.docker.com/engine/swarm/&quot;&gt;Docker Swarm Mode&lt;/a&gt; in Azure.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A couple more good links:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blogs.msdn.microsoft.com/cesardelatorre/2016/11/16/free-ebook-on-containerized-docker-application-lifecycle-with-microsoft-tools-and-platform/&quot;&gt;Microsoft e-book on Docker Containers and Azure&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.dotnetrocks.com/?show=1419&quot;&gt;Discussion of Container Strategies with Michele Bustamante on .NET Rocks&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://msdevshow.com/2017/03/web-apps-with-nick-walker/&quot;&gt;Using Docker with App Service with Nick Walker on the MSDevShow&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dotnet/eshoponcontainers&quot;&gt;Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers&lt;/a&gt; - Thanks &lt;a href=&quot;https://twitter.com/mrbpman&quot;&gt;Bill Pratt&lt;/a&gt; for the link.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 24 Mar 2017 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/docker/2017/03/24/Running-Docker-Containers-Azure.html</link>
        <guid isPermaLink="true">http://floydhilton.com/docker/2017/03/24/Running-Docker-Containers-Azure.html</guid>
        
        <category>Blog</category>
        
        <category>Docker</category>
        
        <category>Azure</category>
        
        <category>Microsoft</category>
        
        
        <category>Docker</category>
        
      </item>
    
      <item>
        <title>The Mastermind Group, worth more than the sum of its parts.</title>
        <description>&lt;p&gt;Back in 2013, &lt;a href=&quot;http://www.jamessturtevant.com/&quot;&gt;James Sturtevant&lt;/a&gt; and I started a &lt;a href=&quot;https://www.google.com/search?q=mastermind+group&quot;&gt;Mastermind Group&lt;/a&gt; that met every week for approximatly two years and grew to a total of 4 people.&lt;br /&gt;
During those two years we both experienced explosive growth in our careers and more balanced personal lives.&lt;/p&gt;

&lt;p&gt;I’ve had a few people ask for more details about our group so I thought a blog post would be a good place to share the information.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h1 id=&quot;what-is-a-mastermind-group&quot;&gt;What is a Mastermind Group?&lt;/h1&gt;
&lt;p&gt;My definition of a Mastermind Group is a group of people helping eachother accomplish a common goal.&lt;/p&gt;

&lt;p&gt;Examples of common goals are to succeed in business or to finish a graduate thesis. &lt;br /&gt;
 In our case the common goals were to:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Live a balanced life.&lt;/li&gt;
  &lt;li&gt;Continue to improve ourselves in our careers and personal lives.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1 id=&quot;key-benefits&quot;&gt;Key Benefits&lt;/h1&gt;
&lt;p&gt;I believe the key benefits of a Mastermind are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Keep each other accountable for the goals we are setting.&lt;/li&gt;
  &lt;li&gt;Provide a sounding board for difficult decisions.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1 id=&quot;mastermind-agenda&quot;&gt;Mastermind Agenda&lt;/h1&gt;
&lt;p&gt;Each of our meetings had the following agenda:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Meet and greet.&lt;/li&gt;
  &lt;li&gt;Discuss difficult issues (if any)&lt;/li&gt;
  &lt;li&gt;Discuss the book we are reading.&lt;/li&gt;
  &lt;li&gt;Review completed goals and set goals for the next week.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If at any time one of us need help with something, we would susspend the agenda and spend the hour focusing on what the member needed.&lt;/p&gt;

&lt;p&gt;The key to a succcessful mastermind group is committement.  Everyone needs to meet EVERY week.  The whole group is based on the trust that members will show up and be dedicated.&lt;/p&gt;

&lt;h1 id=&quot;setting-individual-goals&quot;&gt;Setting Individual Goals&lt;/h1&gt;
&lt;p&gt;None of us wanted to work really hard climbing a ladder only to find that the ladder is leaning against the wrong wall.&lt;/p&gt;

&lt;p&gt;To make sure we were heading in the right direction, we developed a goal setting process that starts with brainstorming 101 goals and ends with actionable quarterly goals to which we would then keep eachother accountable.&lt;/p&gt;

&lt;h1 id=&quot;want-more-information&quot;&gt;Want more Information?&lt;/h1&gt;
&lt;p&gt;If people would find it usefel, I’d like to put together some more information about the process and tools we use for setting and accomplshing our goals and some other information about the Mastermind Group.&lt;/p&gt;

&lt;p&gt;If you would like to know more, please enter your email address here and I’ll let you know when more information is available.&lt;/p&gt;

&lt;!-- Begin MailChimp Signup Form --&gt;
&lt;link href=&quot;//cdn-images.mailchimp.com/embedcode/slim-10_7.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;

&lt;!--&lt;style type=&quot;text/css&quot;&gt;
	#mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; }
	/* Add your own MailChimp form style overrides in your site stylesheet or in this style block.
	   We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */
&lt;/style&gt;--&gt;
&lt;div id=&quot;mc_embed_signup&quot;&gt;
&lt;form action=&quot;//floydhilton.us7.list-manage.com/subscribe/post?u=8f961ccaae4182b21d387dde0&amp;amp;id=eeb1354ede&quot; method=&quot;post&quot; id=&quot;mc-embedded-subscribe-form&quot; name=&quot;mc-embedded-subscribe-form&quot; class=&quot;validate&quot; target=&quot;_blank&quot; novalidate=&quot;&quot;&gt;
    &lt;div id=&quot;mc_embed_signup_scroll&quot;&gt;
	&lt;label for=&quot;mce-EMAIL&quot;&gt;&lt;/label&gt;
	&lt;input type=&quot;email&quot; value=&quot;&quot; name=&quot;EMAIL&quot; class=&quot;email&quot; id=&quot;mce-EMAIL&quot; placeholder=&quot;email address&quot; required=&quot;&quot; /&gt;
    &lt;!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups--&gt;
    &lt;div style=&quot;position: absolute; left: -5000px;&quot; aria-hidden=&quot;true&quot;&gt;&lt;input type=&quot;text&quot; name=&quot;b_8f961ccaae4182b21d387dde0_eeb1354ede&quot; tabindex=&quot;-1&quot; value=&quot;&quot; /&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;input type=&quot;submit&quot; value=&quot;Send me more info&quot; name=&quot;subscribe&quot; id=&quot;mc-embedded-subscribe&quot; class=&quot;button&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/form&gt;
&lt;/div&gt;

&lt;!--End mc_embed_signup--&gt;
</description>
        <pubDate>Tue, 03 Jan 2017 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/productivity/2017/01/03/Mastermind.html</link>
        <guid isPermaLink="true">http://floydhilton.com/productivity/2017/01/03/Mastermind.html</guid>
        
        <category>Blog</category>
        
        <category>Productivity</category>
        
        <category>Mastermind</category>
        
        <category>Goals</category>
        
        
        <category>Productivity</category>
        
      </item>
    
      <item>
        <title>Running Jekyll GitHub Pages on Windows using Docker</title>
        <description>&lt;p&gt;When I first started this blog, I went through the process of setting up  &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; locally on my Mac so that I could preview posts.&lt;/p&gt;

&lt;p&gt;Recently I’ve been doing more work in Windows and wanted to be able to work on my blog without booting up my Mac.&lt;/p&gt;

&lt;p&gt;My friend James pointed out on his blog &lt;a href=&quot;http://www.jamessturtevant.com/posts/Running-Jekyll-in-Windows-using-Docker/&quot;&gt;jamessturtevant.com&lt;/a&gt; that it’s really easy to get Jekyll running on Windows using Docker so I thought I’d give it a try.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Here are the steps I took based on James advice:&lt;/p&gt;

&lt;h1 id=&quot;install-docker-for-windows&quot;&gt;Install Docker for Windows&lt;/h1&gt;
&lt;p&gt;See instructions here:&lt;br /&gt;
&lt;a href=&quot;https://www.docker.com/products/docker#/windows&quot;&gt;Docker for Windows&lt;/a&gt;&lt;/p&gt;

&lt;h1 id=&quot;checkout-blog-source&quot;&gt;Checkout Blog Source&lt;/h1&gt;
&lt;p&gt;Check out the blog source code to C:\Code&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;PS C:\&amp;gt; git clone https://github.com/fhilton/fhilton.github.io.git C:\Code\&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;run-jekyll&quot;&gt;Run Jekyll&lt;/h1&gt;
&lt;p&gt;Run the following command&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;PS C:\&amp;gt; docker run -it -p 4000:4000 -v C:/Code/fhilton.github.io:/site itzg/jekyll-github-pages&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which produces the following output&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Configuration file: /site/_config.yml&lt;br /&gt;
             Source: /site&lt;br /&gt;
         Destination: /site/_site&lt;br /&gt;
        Generating…&lt;br /&gt;
                       done.&lt;br /&gt;
 Auto-regeneration: disabled. Use –watch&lt;br /&gt;
Configuration file: /site/_config.yml&lt;br /&gt;
      Server address: http://0.0.0.0:4000/&lt;br /&gt;
    Server running… press ctrl-c to stop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The above command tells docker to&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;run the &lt;a href=&quot;https://hub.docker.com/r/itzg/jekyll-github-pages/&quot;&gt;itzg/jekyll-github-pages&lt;/a&gt; image&lt;/li&gt;
  &lt;li&gt;bind /site in the image to C:\Code\fhilton.github.io&lt;/li&gt;
  &lt;li&gt;bind port 4000 of our docker host to port 4000 of the container&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;browse-away&quot;&gt;Browse Away!&lt;/h1&gt;
&lt;p&gt;Next browse to http://localhost:4000 and the blog is served!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2016/12/BlogIsServed.png&quot; alt=&quot;Blog is Served&quot; /&gt;&lt;/p&gt;

</description>
        <pubDate>Wed, 14 Dec 2016 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/tools/2016/12/14/Running-Jekyll-GitHub-Pages-Windows.html</link>
        <guid isPermaLink="true">http://floydhilton.com/tools/2016/12/14/Running-Jekyll-GitHub-Pages-Windows.html</guid>
        
        <category>Blog</category>
        
        <category>Docker</category>
        
        <category>Windows</category>
        
        
        <category>Tools</category>
        
      </item>
    
      <item>
        <title>Using Mac Keyboard Shortcuts for Home/End in Visual Studio</title>
        <description>&lt;h3 id=&quot;overview&quot;&gt;Overview&lt;/h3&gt;

&lt;p&gt;Using Visual Studio (in Parallels) on my Mac works pretty well, except when I try to use &lt;strong&gt;Command+Arrow&lt;/strong&gt; to move to the beginning or end of a line. When you press &lt;strong&gt;Command+Arrow&lt;/strong&gt; in Visual Studio on a Mac, the window moves around the screen, which is quite surprising and not at all helpful.&lt;/p&gt;

&lt;!--more--&gt;
&lt;p&gt;I did some research and found some useful information about mapping Mac Keyboard Shortcuts to Visual Studio (and Windows) in the following areas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://hiltmon.com/blog/2013/10/10/using-mac-navigation-keys-in-visual-studio/&quot;&gt;http://hiltmon.com/blog/2013/10/10/using-mac-navigation-keys-in-visual-studio/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Comments from the post in #1 above&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://autohotkey.com/board/topic/60675-osx-style-command-keys-in-windows/&quot;&gt;https://autohotkey.com/board/topic/60675-osx-style-command-keys-in-windows/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The information above basically involves using &lt;a href=&quot;https://www.autohotkey.com/&quot;&gt;AutoHotKey&lt;/a&gt; to remap the keys and then modifying the keyboard shortcuts in Visual Studio to get the desired result.&lt;br /&gt;
Below is a summary of the steps required to use Mac keyboard shortcuts such as &lt;strong&gt;Command+Left Arrow&lt;/strong&gt; from within a Parallels or similar Windows VM and Visual Studio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; this tutorial is for Windows 10 and Visual Studio 2015.&lt;/p&gt;

&lt;h1 id=&quot;steps&quot;&gt;Steps&lt;/h1&gt;

&lt;ol&gt;
  &lt;li&gt;Install &lt;a href=&quot;https://www.autohotkey.com/&quot;&gt;AutoHotKey&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Download the &lt;a href=&quot;https://github.com/fhilton/autohotkey-windows-mac-keyboard&quot;&gt;MacKeyboard.ahk&lt;/a&gt; file (note this modifies more than just Visual Studio keys and incorporates changes from the links above.The file is a fork from &lt;a href=&quot;https://github.com/stroebjo/autohotkey-windows-mac-keyboard&quot;&gt;here&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;Setup the .ahk file to run at startup
    &lt;ol&gt;
      &lt;li&gt;Type Command+R to open the run window, then type shell:startup&lt;br /&gt;
&lt;img src=&quot;/images/2016/03/RunWindow.png&quot; alt=&quot;  Open Startup Folder&quot; /&gt;&lt;/li&gt;
      &lt;li&gt;Copy the MacKeyboard.ahk file into the startup folder.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Open Visual Studio&lt;/li&gt;
  &lt;li&gt;Press Ctrl+Q and type Keyboard to open keyboard settings.&lt;br /&gt;
&lt;img src=&quot;/images/2016/03/OpenKeyboardSettings.png&quot; alt=&quot;Open Keyboard Settings&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Type “Edit.LineStart” in “Show commands containing” to select the LineStart command&lt;/li&gt;
  &lt;li&gt;Select “Text Editor” in the “Use new shortcut in:” box&lt;/li&gt;
  &lt;li&gt;Type Shift+Control+Option+Left Arrow into “Press shortcut keys:” and click Assign&lt;br /&gt;
&lt;img src=&quot;/images/2016/03/VSKeyboardSettings.png&quot; alt=&quot;Open Keyboard Settings&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Click OK to close the Options window.&lt;/li&gt;
  &lt;li&gt;Double click on the MacKeyboard.ahk script to run it.&lt;/li&gt;
  &lt;li&gt;Open a project in Visual Studio and Command+Left Arrow should bring your cursor to the home position. Alt+Left Arrow should move a word at a time.&lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Sat, 26 Mar 2016 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/tools/2016/03/26/Mapping-Home-End-VisualStudio-Mac.html</link>
        <guid isPermaLink="true">http://floydhilton.com/tools/2016/03/26/Mapping-Home-End-VisualStudio-Mac.html</guid>
        
        <category>Software</category>
        
        <category>Tools</category>
        
        <category>VisualStudio</category>
        
        <category>Mac</category>
        
        
        <category>Tools</category>
        
      </item>
    
      <item>
        <title>Programming Arduino with Atom</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/2015/10/ArduinoWithAtom.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Working with Arduino’s is a lot of fun. Getting started is super easy thanks to the provided IDE and lots of great example code:&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;/images/2015/10/ArduinoExamples.png&quot; alt=&quot;Arduino IDE with Examples&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After getting past the “Hello World” phase I started to miss the editor experience that other editors give me, simple things like the ability to copy a line without highlighting or the way files are managed.&lt;/p&gt;

&lt;p&gt;I found a &lt;a href=&quot;http://playground.arduino.cc/Main/DevelopmentTools&quot;&gt;whole list&lt;/a&gt; of development tools on the Arduino website.  Two that stood out to me are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;a href=&quot;http://doc.viperize.it/&quot;&gt;Viper IDE&lt;/a&gt; - Allows you to program the Arduino in Python on a web based IDE, neat!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.visualmicro.com/&quot;&gt;Visual Studio Arduino Plugin&lt;/a&gt; - This looks really cool and thanks to &lt;a href=&quot;https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx&quot;&gt;Visual Studio Community&lt;/a&gt; is free to get started with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since for now I want to stick with C++ and the kids I’m teaching use &lt;a href=&quot;http://floydhilton.com/software/linux/chromebook/2015/08/31/Kids-Code-Chromebook-Linux.html&quot;&gt;Linux laptops&lt;/a&gt;, both of the above tools I found were not going to work.&lt;/p&gt;

&lt;p&gt;We were already successfully programming Python and Javascript with Atom on the Linux laptops, so I decided to look for a way to program the Arduino with Atom.&lt;br /&gt;
The most promising extension I came across for Atom is &lt;a href=&quot;https://atom.io/packages/platomformio&quot;&gt;platformio&lt;/a&gt;. &lt;a href=&quot;https://viget.com/extend/arduino-development-in-atom-editor&quot;&gt;Here&lt;/a&gt; is a blog post from the creator that explains what platformio is. See &lt;a href=&quot;http://floydhilton.com/resources/atom-extensions.html&quot;&gt;here&lt;/a&gt; for a list of the other Atom Extensions I use. &lt;br /&gt;
Platformio has a nice some pretty easy setup instructions:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2015/10/SetupInstructions.png&quot; alt=&quot;platformio setup instructions&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I only ran into two issues trying to install the extension on my Mac.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;I got an error “option –single-version-externally-managed not recognized” when trying to install Platformio.&lt;br /&gt;
There is an issue report &lt;a href=&quot;https://github.com/platformio/platformio/issues/279&quot;&gt;here&lt;/a&gt; with a ton of info.&lt;br /&gt;
I fixed the issue by adding “–egg” to the install command (which someone in the above issue report said was a bad idea, but it worked for me…)&lt;br /&gt;
&lt;img src=&quot;/images/2015/10/pipinstall3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I use &lt;a href=&quot;https://virtualenvwrapper.readthedocs.org/en/latest/&quot;&gt;virtualenv&lt;/a&gt; to isolate all of my Python environments. When I tried to build from Atom I got an error about not being able to find Platformio because I installed Platformio in a virtualenv.&lt;br /&gt;
Luckily the platformio extension allows you to enter a custom path in the settings.&lt;br /&gt;
To fix the issue I did the following:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Open a terminal and enter your virtualenv using workon&lt;br /&gt;
&lt;img src=&quot;/images/2015/10/Workon2.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
      &lt;li&gt;Type Echo $PATH.&lt;/li&gt;
      &lt;li&gt;Copy the path string and paste into the settings of the platformio extension:&lt;br /&gt;
&lt;img src=&quot;/images/2015/10/platformioPath.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the above issues were completed I was able to build and then upload a sample program to my Arduino!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2015/10/BuildSuccess.png&quot; alt=&quot;Build Complete&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 10 Oct 2015 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/software/career/2015/10/10/Arduino_with_Atom.html</link>
        <guid isPermaLink="true">http://floydhilton.com/software/career/2015/10/10/Arduino_with_Atom.html</guid>
        
        <category>Software</category>
        
        <category>Mastermind</category>
        
        <category>Training</category>
        
        
        <category>Software</category>
        
        <category>Career</category>
        
      </item>
    
      <item>
        <title>7 Ways to Future Proof your Programming Career</title>
        <description>&lt;p&gt;The rate of change in the software development world is increasing every day.  If you don’t pay attention you may wake up one day and find your skills are no longer marketable.&lt;/p&gt;

&lt;p&gt;The good news is that by just doing one or two of the items below, you can move yourself into a position where instead of fearing what might be coming next you can be excited about the next opportunity that will be coming your way.&lt;br /&gt;
&lt;!--more--&gt;&lt;/p&gt;

&lt;h4&gt;Listen to Podcasts&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Learn from the best minds in the industry while you do the dishes&lt;/strong&gt;&lt;br /&gt;
 I’m surprised to hear how many people don’t listen to Podcasts.  The most common reason I hear is that time is not available, to which I respond, “Do you do the dishes?”. Many of life’s repetitive tasks can be made more enjoyable by turning on your iPod or your smart phone and having a listen to the latest &lt;a href=&quot;https://www.dotnetrocks.com/&quot;&gt;dotNetRocks&lt;/a&gt;, &lt;a href=&quot;http://wildermuth.com/hwpod&quot;&gt;Hello World&lt;/a&gt;, or &lt;a href=&quot;http://msdevshow.com/&quot;&gt;MS Dev Show&lt;/a&gt;.  See my &lt;a href=&quot;http://floydhilton.com/resources/podcasts.html&quot;&gt;podcasts list&lt;/a&gt; for some ideas of where to start.  Don’t knock it till you try it.&lt;/p&gt;

&lt;h4&gt;Attend a User Group&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;It’s not what you learn, but who you teach&lt;/strong&gt;&lt;br /&gt;
Many of us less-than-outgoing software types tend to try and learn all on our own.  With all the blogs, podcasts and videos out there, where is the need to go and learn at a user group?&lt;/p&gt;

&lt;p&gt;I’ve found that the best reason to go to a user group is not to learn, but to contribute and lift others up.  Once you experience the excitement of helping someone else grasp a concept or complete a project, you will see that it truly is better to give than receive. &lt;br /&gt;
What does this have to do with your career? Who would you want to hire: someone you have never heard of, or someone that’s known for teaching others about the type of work you need done?&lt;/p&gt;

&lt;h4&gt;Have a Side Project&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Don’t be limited by what you do at work&lt;/strong&gt;&lt;br /&gt;
One of the best ways to be motivated to improve your skills is to start a side project that interests you.  Pick a technology you are drawn to or a domain that you enjoy (or both) and build something. Even if you would never use the specific technology at work, chances are there will be transferable concepts that you can use to improve the way you solve problems.&lt;br /&gt;
Whatever you decide to do, make it achievable in a reasonable amount of time, and FINISH IT!  It is better to have one smaller finished project than 15 grand ideas that are 10% done. &lt;br /&gt;
As you work on your project commit the source code to GitHub, it helps others learn and helps build your “clout” as a software developer.&lt;/p&gt;

&lt;h4&gt;Pair Programming&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Two heads are better than one&lt;/strong&gt;&lt;br /&gt;
If you spend just 10 minutes watching another developer code you will undoubtably pick up something (an IDE trick, a command shortcut, or a concept) that you wouldn’t have come by on your own. &lt;br /&gt;
Pair programing doesn’t mean you have to be in the same room; in fact I think it is better for each to use your own computers and use some screen or editor sharing tools to facilitate the pair programming.&lt;/p&gt;

&lt;h4&gt;Attend a Conference&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Or better yet, speak at one&lt;/strong&gt;&lt;br /&gt;
I used to think conferences were expensive events held in places that required flights and hotels to attend. &lt;br /&gt;
A couple years ago my friend &lt;a href=&quot;http://www.jamessturtevant.com/&quot;&gt;James Sturtevant&lt;/a&gt; told me about “Code Camps”. A Code Camp is a free event that encourages anyone to submit a talk (&lt;a href=&quot;https://en.wikipedia.org/wiki/Code_Camp&quot;&gt;more information here&lt;/a&gt;). James encouraged me to submit a talk to the &lt;a href=&quot;https://www.bostoncodecamp.com/&quot;&gt;Boston Code Camp&lt;/a&gt; and the talk got selected.  I was pretty nervous but the whole experience turned out to be great.  I liked the experience so much that I gave another talk at the &lt;a href=&quot;http://vtcodecamp.org/&quot;&gt;Vermont Code Camp&lt;/a&gt; a few months later. I know of a person that landed a great new job because the employer attended one of their talks, it can happen.&lt;/p&gt;

&lt;h4&gt;Join a Mastermind Group&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Accountabiliy is key&lt;/strong&gt;&lt;br /&gt;
A Mastermind is simply a group of people that are all working toward a common goal. For some more info on Mastermind Groups see &lt;a href=&quot;http://www.smartpassiveincome.com/mastermind-groups-and-mentors/&quot;&gt;this post&lt;/a&gt; from &lt;a href=&quot;http://www.smartpassiveincome.com/&quot;&gt;SmartPassiveIncome.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A friend and I formed our Mastermind Group around the goals of Continuous Improvement and Life Balance. Our group has met weekly for over two years, during which time members have completed an impressive amount of direct goals and some unexpected side benefits such as new jobs, pay raises and promotions.&lt;/p&gt;

&lt;h4&gt;Start a Blog&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Share the solution&lt;/strong&gt;&lt;br /&gt;
There are many reasons to start a blog.  Since we are talking about career, the reasons that jump to mind are showing you are knowledgeable and showing you know how to communicate that knowledge.&lt;br /&gt;
My suggestions for getting started:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Don’t stress about the platform, just pick one and go.  It’s really easy to get bogged down by setting up your blog and never actually get to writing a post.&lt;/li&gt;
  &lt;li&gt;Every time you solve a tricky problem, write a post.  If Google (or Bing) didn’t know the answer for you, it won’t for others as well.  Document how you solved the problem, and at they very least when you have the problem again in 6 months you will know how to solve it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Do It!&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;You won’t move without taking the first step&lt;/strong&gt;&lt;br /&gt;
None of the above items will do you any good if you don’t give them a try. Pick one that sounds interesting and commit to trying it out.&lt;br /&gt;
For Example:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Listen to a podcast whenever you do the dishes&lt;/li&gt;
  &lt;li&gt;Find an interesting open source project and do a pull request&lt;/li&gt;
  &lt;li&gt;Find a Code Camp near you and sign up to attend the next event&lt;/li&gt;
  &lt;li&gt;Find another coder that wants to improve and meet twice a month to talk tech and encourage each-other&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know on &lt;a href=&quot;https://twitter.com/fhilton&quot;&gt;Twitter&lt;/a&gt; if do any of the above and find it helpful, I’d love to hear all about it.&lt;/p&gt;
</description>
        <pubDate>Wed, 30 Sep 2015 18:01:00 +0000</pubDate>
        <link>http://floydhilton.com/software/career/2015/09/30/Future-Proof-Programming-Career.html</link>
        <guid isPermaLink="true">http://floydhilton.com/software/career/2015/09/30/Future-Proof-Programming-Career.html</guid>
        
        <category>Software</category>
        
        <category>Mastermind</category>
        
        <category>Training</category>
        
        
        <category>Software</category>
        
        <category>Career</category>
        
      </item>
    
  </channel>
</rss>
