<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>hennevogel.de</title>
    <description>Personal blog of Henne Vogelsang</description>
    <link>https://hennevogel.de/</link>
    <atom:link href="https://hennevogel.de/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 20 Nov 2024 14:47:20 +0000</pubDate>
    <lastBuildDate>Wed, 20 Nov 2024 14:47:20 +0000</lastBuildDate>
    <generator>Jekyll v3.9.3</generator>
    
      <item>
        <title>Let's build Software Libre APM together</title>
        <description>&lt;p&gt;
  Alright, you learned about &lt;code&gt;ActiveSupport::Notifications&lt;/code&gt;, InfluxDB, Grafana and influxdb-rails
  in the two previous posts. Let's dive a bit deeper and look how we built the dashboards for you. So we can
  study, change and improve them together.
&lt;/p&gt;

&lt;blockquote&gt;
  “Individually we are one drop; but together we are an ocean.” – Ryunosoke Satoro
&lt;/blockquote&gt;

&lt;p&gt;
  Welcome to your Ruby on Rails Application Monitoring 101.
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;div class=&quot;alert alert-warning&quot;&gt;
  This post is the last part of a three part series about monitoring your Ruby on Rails app with influxdb-rails.
  Make sure to check them all out!
  &lt;ul&gt;
    &lt;li&gt;
      &lt;a href=&quot;/blog/activesupport.html&quot;&gt;ActiveSupport::Notifications is rad! 💘&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href=&quot;/blog/influxdb-rails.html&quot;&gt;Measure twice, cut once: App Performance Monitoring with influxdb-rails&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      Let's build Software Libre APM together (this post)
    &lt;/li&gt;
  &lt;/ul&gt;
 &lt;/div&gt;

&lt;h2&gt;The Ying and Yang of measurements&lt;/h2&gt;
&lt;p&gt;
  Basically there are two types of measurements we do. How often something happened and how long something took.
  Both types are most often complementary, interconnected and interdependent.
  On the performance dashboard we count for instance how many requests your application is serving.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Grafana Panel plotting requests per minute&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-requests_per_minute-3b72125df3ce68e06a3af4352755603bc42deccb2460492cbdb8ee093eeca7b7.png&quot;&gt;
&lt;/div&gt;

&lt;p&gt;
  We also look at the time your application spends on doing that.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Grafana Panel plotting requests per minute&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-request_performance-8aa0f228d75fb2601ec4547b588d4c1b777bf83fb3b2984766473afdec728142.png&quot;&gt;
&lt;/div&gt;

&lt;p&gt;
  At some point the number of requests will have an influence on the time spend (oversaturation). If one of your actions
  is using too many resources it will have influence on the number of requests you are able to serve (overutilization).
  Ying and Yang.
&lt;/p&gt;

&lt;h2&gt;The minions of measurements&lt;/h2&gt;
&lt;p&gt;
  Looking at the graphs above you see some helpers at work you should know about.
&lt;/p&gt;

&lt;h3&gt;Time&lt;/h3&gt;
&lt;p&gt;
  First and foremost: Time Windows. The requests are counted &lt;em&gt;per minute&lt;/em&gt; and we look at measurements in the &lt;em&gt;last hour&lt;/em&gt;. Time windows help to
  lower information density and make your measurements a bit more digestible. Look at the same measurements &lt;em&gt;per second&lt;/em&gt;
  for the last &lt;em&gt;12 hours&lt;/em&gt;. 60 times 24 higher information density. Not so easy to interpret anymore...
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Grafana Panel plotting requests per second&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-requests_per_second-dc53c3914ac454dba74caa9115a5273ae3c04684da7c9f4d5da5cd7680a7da35.png&quot;&gt;
&lt;/div&gt;

&lt;h3&gt;Statistics&lt;/h3&gt;
&lt;p&gt;
  The same way time windows will make it easier for you to understand your data, some descriptive statistics will help you too.
  For instance calculating the maximum time 99% of requests in the last minute took. Like we did above.
  I won't bore you to death with the math behind this, if you're into this checkout &lt;a href=&quot;https://en.wikipedia.org/wiki/Descriptive_statistics&quot;&gt;wikipedia&lt;/a&gt;
  or something. Just remember, it makes data digestible for you. Look at the same performance data without applying statistics.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Grafana Panel plotting requests per second&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-request_performance_no_statistic-b07eaf595706000b2db53b3e795c00f298a8cbb433936f13f7db7f796919e875.png&quot;&gt;
&lt;/div&gt;

&lt;h3&gt;Grouping&lt;/h3&gt;
&lt;p&gt;
  The third helper that makes data understandable for you is grouping data. Like ActiveJobs per minute grouped by queue. That 
  grouping might make more clear to you why the number of jobs so high. Or grouping requests per minute by HTTP Status might
  reveal how much stuff goes wrong.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Grafana Panel plotting requests per second&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-request_grouping-42c28b401457353486969d5dd0106c6c3d3cfc3e804dcc8d9c57efa505764efc.png&quot;&gt;
&lt;/div&gt;

&lt;p&gt;
  A different form of grouping is to visualize all measurements connected to a specific event, like a single request. Or all the
  measurements a specific controller action has fired in the last hour.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Grafana Panel plotting requests per second&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-grouping_by_request-8b5864b513c62c569772cc633379876ffc8ac253652886b57b5e419ccb9b4718.png&quot;&gt;
&lt;/div&gt;

&lt;h3&gt;Rankings&lt;/h3&gt;
&lt;p&gt;
  Another thing we do on the dashboard is ranking (groups of) events by time, slow to fast. So you know where you might want to
  concentrate your efforts to improve performance.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Grafana Panel plotting requests per second&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-slowlog-ffa7f8e63c24fe0af94789ae862f14faeb4e834cf35591472372717e57b63b85.png&quot;&gt;
&lt;/div&gt;

&lt;h2&gt;Apply your knowledge, let's collaborate on Rails APM/AHM&lt;/h2&gt;
&lt;p&gt;
  Maybe I inspired some ideas for new features in the 101 above? I'm also sure there are many people out in the Rails community that
  have way more knowledge and ideas about statistics, measurements and all the tools involved than Chris and me. Let's
  work together, patches to the collection of dashboards (and the Ruby code) are more than welcome!
&lt;/p&gt;

&lt;h3&gt;Why build, not buy?&lt;/h3&gt;
&lt;p&gt;
  But Henne, you say, there is already Sentry, New Relic, Datadog, Skylight and tons of other services that do this.
  Why build another one? Why reinvent the wheel?
&lt;/p&gt;

&lt;p&gt;
   Because Software Libre is an deeply evolutionary process. Software Libre, just like Evolution, experiments all the time.
   Many experiments find their niche to exist. Some even go global.
&lt;/p&gt;
&lt;div class=&quot;img&quot;&gt;
 &lt;img alt=&quot;A tire graveyard&quot; class=&quot;img-responsive&quot; src=&quot;/assets/posts/corona-e53f60ee0da1a93daa899c8a3f5ef28fd6a4d8310c2594dd7c55235b706c4db4.jpg&quot;&gt;
 &lt;p class=&quot;img-license text-right&quot;&gt;
   Coronavirus: BW CG Illustration
   by &lt;a href=&quot;https://www.flickr.com/photos/yusamoilov/49678500083&quot;&gt;Yuri Samoilov&lt;/a&gt;
 &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;  
   Like Linux, the largest install base of ALL operating systems on this planet. Wordpress powering an unbelievable 30% of
   the top 10 million websites. Mediawiki running the 5th most popular site globally. But also, more than 98% of all projects
   on GitHub are not seeing any development beyond the first year they were created. Just like 99% of all species that ever
   lived on Earth are estimated to be extinct.
&lt;/p&gt;

&lt;p&gt;
  We need to experiment and collaborate together. Evolution is what we do baby! 🤓
  Can't run, copy, distribute, study, change and improve the software SaaS providers run. We can't scratch our itch,
  can't break it, learn how it works and make it better together, that's why. Let's do this!
&lt;/p&gt;
</description>
        <pubDate>Fri, 26 Mar 2021 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/apm-but-together.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/apm-but-together.html</guid>
        
        
      </item>
    
      <item>
        <title>Measure twice, cut once: App Performance Monitoring with influxdb-rails</title>
        <description>&lt;p&gt;
  Now that we learned how truly magnificent &lt;code&gt;ActiveSupport::Notifications&lt;/code&gt; is in the previous post,
  let's explore a RubyGem &lt;a href=&quot;https://bruckmayer.net/&quot;&gt;Chris&lt;/a&gt;, others and me have built around this: influxdb-rails.
  Together with even more awesome Software Libre, it will help you to deep dive into your Ruby on Rails application performance.
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;div class=&quot;alert alert-warning&quot;&gt;
  This post ist part two of a three part series about monitoring your Ruby on Rails app with influxdb-rails.
  Make sure to check them all out!
  &lt;ul&gt;
    &lt;li&gt;
      &lt;a href=&quot;/blog/activesupport.html&quot;&gt;ActiveSupport::Notifications is rad! 💘&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      Measure twice, cut once: App Performance Monitoring with influxdb-rails (this post)
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href=&quot;/blog/apm-but-together.html&quot;&gt;Let's build Software Libre APM together&lt;/a&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;h2&gt;Application Performance Monitoring (APM)&lt;/h2&gt;
&lt;p&gt;
  I'm not sure we have to discuss this at all anymore, but here is why I think I need application performance
  monitoring for my Ruby on Rail apps: I'm an expert in using the software I hack. Hence I always travel the happy
  path, cleverly and unconsciously avoid the pitfalls, use it with forethought of the underlying architecture.
  Because of that, I usually &lt;b&gt;think&lt;/b&gt; my app is fast: &lt;a href=&quot;https://blog.teamtreehouse.com/perceived-performance&quot;&gt;perceived performance&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
  &lt;blockquote&gt;
    It's not what you look at that matters, it's what you see.
    – Henry David Thoreau
  &lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
  That is why I need someone to correct that bias for me, in black and white.
&lt;/p&gt;

&lt;h2&gt;Free Software APM&lt;/h2&gt;

&lt;p&gt;
  The good folks at &lt;a href=&quot;https://contributors.rubyonrails.org/&quot;&gt;Rails&lt;/a&gt; bring the instrumentation framework.
  &lt;a href=&quot;https://www.influxdata.com/about/&quot;&gt;InfluxData&lt;/a&gt; deliver a time series database.
  &lt;a href=&quot;https://grafana.com/about/team/&quot;&gt;Grafana Labs&lt;/a&gt; make a dashboard builder. All we need to do, as so often,
  is to plug Software Libre together: SUCCE$$!
&lt;/p&gt;

&lt;h3&gt;InfluxDB + Grafana == &lt;span title='Da Bomb!'&gt;🧨&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;
  I assume your Rails development environment is already running on 127.0.0.0:300. Getting InfluxDB and Grafana is a matter
  of pulling containers these days. You can use this simple &lt;code&gt;docker-compose&lt;/code&gt; configuration for running them locally.
&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;3.7&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;influx&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;influxdb:1.7&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INFLUXDB_DB=rails&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INFLUXDB_USER=root&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INFLUXDB_USER_PASSWORD=root&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INFLUXDB_READ_USER=grafana&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INFLUXDB_READ_USER_PASSWORD=grafana&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;influxdata:/var/lib/influxdb&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8086:8086&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;grafana&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;grafana/grafana:7.4.5&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;4000:3000&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;influx&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;grafanadata:/var/lib/grafana&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;influxdata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;grafanadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;
  A courageous &lt;code&gt;docker-compose up&lt;/code&gt; will boot things and you can access Grafana at &lt;a href=&quot;http://127.0.0.1:4000&quot;&gt;http://127.0.0.1:4000&lt;/a&gt; (user: admin / password: admin).
  To read data from the InfluxDB container in Grafana, leave the &lt;a href=&quot;http://127.0.0.1:4000/datasources&quot;&gt;/datasources&lt;/a&gt;
  InfluxDB defaults alone and configure:
&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;URL: http://influx:8086
Database: rails
User: grafana
Password: grafana&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3&gt;influxdb-rails: &lt;span title='Tie'&gt;🪢&lt;/span&gt; things together&lt;/h3&gt;
&lt;p&gt;
  The &lt;code&gt;influxdb-rails&lt;/code&gt; RubyGem is the missing glue code for making your app report metrics into the InfluxDB.
  Plug it into your Rails app by adding it to your bundle.
&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;bundle add influxdb-rails
bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;rails generate influxdb&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;
  The next time you boot your Rails dev-env it will start to measure the performance of your app. Now comes the interesting
  part, interpreting this data with Grafana.
&lt;/p&gt;

&lt;h2&gt;Understanding Ruby on Rails Performance&lt;/h2&gt;
&lt;p&gt;
  Every time you use your dev-env, &lt;code&gt;influxdb-rails&lt;/code&gt; will write a plethora of performance data into InfluxDB.
  Let's look at one of the measurements so you get an idea of what's going on. You remember the &lt;code&gt;ActiveSupport::Notification&lt;/code&gt;
  called &lt;code&gt;process_action.action_controller&lt;/code&gt; from the previous post? Rails sends this message every time an action in
  your controller has finished. It includes performance data for this action.
&lt;/p&gt;
&lt;p&gt;
  You should know this from somewhere: development.log! It contains the same information.
&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;Started GET &lt;span class=&quot;s2&quot;&gt;&quot;/things&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;127.0.0.1 at 2021-03-25 15:20:14 +0100
...
Completed 200 OK &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;5ms &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Views: 4.1ms | ActiveRecord: 0.1ms | Allocations: 3514&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;
  &lt;code&gt;ThingsController#index&lt;/code&gt; took 5ms to finish overall, 4.1ms of those 5 in rendering, 0.1ms in querying the database.
  You find the same data for every request you make in your InfluxDB. Head over to &lt;a href=&quot;http://127.0.0.1:4000/explore&quot;&gt;http://127.0.0.1:4000/explore&lt;/a&gt;
  and let Grafana plot it for you.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Grafana Panel plot&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-process_action-4119854753aba0744574c6b72999e38bd7d5c7424bc1b22e1247762af6571829.png&quot;&gt;
&lt;/div&gt;

&lt;p&gt;
  Only want to see how your views are performing? Change the &lt;code&gt;field&lt;/code&gt; from &lt;code&gt;controller&lt;/code&gt; to &lt;code&gt;view&lt;/code&gt;.
  Magic 🪄 But this is only one out of many different ways to look at this measurement. All of the panels below use this one
  measurement and the data it brings to visualize controller actions.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;Many different Grafana panel plots&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/grafana-process_action-panels-0b39bd4e2e8ab7930613ef6ff65fecb52322122d0b03c91a38a25c7ac87039b0.jpg&quot;&gt;
&lt;/div&gt;

&lt;p&gt;And this is only one measurement, &lt;code&gt;influxdb-rails&lt;/code&gt; reports around a dozen.
  Now I could send you off your way to learn about
  &lt;a href=&quot;https://github.com/influxdata/influxdb-rails&quot;&gt;ALL.&lt;/a&gt;
  &lt;a href=&quot;https://docs.influxdata.com/influxdb/v1.7/&quot;&gt;THE.&lt;/a&gt;
  &lt;a href=&quot;https://grafana.com/docs/grafana/latest/getting-started/getting-started/&quot;&gt;SOFTWARE.&lt;/a&gt;
  involved, but that would be mean wouldn't it?
&lt;/p&gt;

&lt;h3&gt;Ruby on Rails Dashboards&lt;/h3&gt;
&lt;p&gt;
  We, the Free Software community, are in this together! We collaborate on Ruby on Rails. We work together to make
  InfluxDB better. We cooperate to improve Grafana. Why not do the same for the dashboards to visualize Rails performance data?
  Let's collaborate! That is why we have build a couple of dashboards you can &lt;a href=&quot;http://127.0.0.0:4000/dashboard/import&quot;&gt;import&lt;/a&gt;.
  Just copy and paste the URLs into your Grafana.
  &lt;ul&gt;
    &lt;li&gt;Ruby On Rails Performance Overview: &lt;a href=&quot;https://grafana.com/grafana/dashboards/10428/&quot; rel=&quot;nofollow&quot;&gt;Ruby On Rails Performance Overview&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Performance insights into individual requests: &lt;a href=&quot;https://grafana.com/grafana/dashboards/10429&quot; rel=&quot;nofollow&quot;&gt;Ruby On Rails Performance per Request&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Performance of individual actions: &lt;a href=&quot;https://grafana.com/grafana/dashboards/11031&quot; rel=&quot;nofollow&quot;&gt;Ruby On Rails Performance per Action&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;HTTP Request Health: &lt;a href=&quot;https://grafana.com/grafana/dashboards/14115&quot; rel=&quot;nofollow&quot;&gt;Ruby On Rails Health Overview&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;ActiveJob Insights: &lt;a href=&quot;https://grafana.com/grafana/dashboards/14116&quot; rel=&quot;nofollow&quot;&gt;Ruby on Rails ActiveJob Overview&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;A list of the slowest requests: &lt;a href=&quot;https://grafana.com/grafana/dashboards/14118&quot; rel=&quot;nofollow&quot;&gt;Ruby on Rails Slowlog by Request&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;A list of the slowest actions: &lt;a href=&quot;https://grafana.com/grafana/dashboards/14117&quot; rel=&quot;nofollow&quot;&gt;Ruby on Rails Slowlog by Action&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;A list of the slowest queries: &lt;a href=&quot;https://grafana.com/grafana/dashboards/14119&quot; rel=&quot;nofollow&quot;&gt;Ruby on Rails Slowlog by SQL&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
  Play a little, I will tell you about all the nitty gritty details in the last post of this series:
  &lt;a href=&quot;/blog/apm-but-together.html&quot;&gt;Let's build Software Libre APM together&lt;/a&gt;
&lt;/p&gt;
</description>
        <pubDate>Thu, 25 Mar 2021 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/influxdb-rails.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/influxdb-rails.html</guid>
        
        
      </item>
    
      <item>
        <title>ActiveSupport::Notifications is Rad!</title>
        <description>&lt;p&gt;
  One of the lesser known parts of Rails core is the ActiveSupport instrumentation framework.
  &lt;code&gt;ActiveSupport::Notifications&lt;/code&gt; includes all the things you need to implement pub-sub in Rails.
  Pub-Sub is a software architecture where you publish (send) a message without being specific about who should
  receive it. Fire and forget.
&lt;/p&gt;
&lt;p&gt;  
  Receiving a message, and doing something with it, &quot;just&quot; requires you to subscribe to it. Because the publisher doesn't
  need to know about the subscribers (as they are decoupled), this provides nice opportunities for organization and scale.
&lt;/p&gt;
&lt;p&gt;
  Let's explore the joyful shenanigans of this.
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;div class=&quot;alert alert-warning&quot;&gt;
  This post is the first part of a three part series about instrumenting your Ruby on Rails app with influxdb-rails.
  Make sure to check them all out!
  &lt;ul&gt;
    &lt;li&gt;
      ActiveSupport::Notifications is rad! (this post)
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href=&quot;/blog/influxdb-rails.html&quot;&gt;Measure twice, cut once: App Performance Monitoring with influxdb-rails&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href=&quot;/blog/apm-but-together.html&quot;&gt;Let's build Software Libre APM together&lt;/a&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;h2&gt;Publish &amp;amp; Subscribe&lt;/h2&gt;

&lt;p&gt;
  There is an instrumentation message emitted from &lt;code&gt;ActionController&lt;/code&gt; that includes interesting data
  about the things happening in your controller action. Let's explore this.
&lt;/p&gt;
&lt;p&gt;
  &lt;small&gt;
    If you don't have a Ruby on Rails app at hand, just setup a minimal one with &lt;code&gt;rails new --minimal&lt;/code&gt;
  &lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;
  Add this code into an initializer
&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# config/initializers/instrumentation_subscriber.rb&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# What happens in ActionController?&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ActionController&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;InstrumentationSubscriber&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveSupport&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Subscriber&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;attach_to&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:action_controller&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process_action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;no&quot;&gt;Rails&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Instrumentation &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; Received!&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;
  Boot the app (&lt;code&gt;rails server&lt;/code&gt;), visit &lt;a href=&quot;http://127.0.0.0:3000&quot;&gt;http://127.0.0.0:3000&lt;/a&gt; and you'll
  see the new log lines in your development.log. So what? What's the difference to calling &lt;code&gt;Rails.logger&lt;/code&gt; in
  an action or callback inside your controller? Why is &lt;code&gt;ActiveSupport::Notifications&lt;/code&gt; fabulous?
&lt;/p&gt;

&lt;h2&gt;ActiveSupport::Notifications Scales&lt;/h2&gt;
&lt;p&gt;
  First, as explained in the intro, the main advantage is that the publisher is decoupled from the subscriber. For instance,
  you can have more than one subscriber listening to &lt;code&gt;process_action.action_controller&lt;/code&gt;.
&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# config/initializers/slowlog_subscriber.rb&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ActionController&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SlowlogSubscriber&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveSupport&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Subscriber&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;attach_to&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:action_controller&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process_action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;duration&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;

      &lt;span class=&quot;n&quot;&gt;controller_location&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:controller&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]].&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# -&amp;gt; ThingsController#something&lt;/span&gt;
      &lt;span class=&quot;no&quot;&gt;Rails&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;controller_location&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; was slow (&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;ms)&quot;&lt;/span&gt; 
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;
  You are free to organize this however you want. Decouple publisher/subscriber in different files, chronological or
  even in different threads.
&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# config/initializers/poor_mans_background_job_subscriber.rb&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ActionController&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PMBGJSubscriber&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveSupport&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Subscriber&lt;/span&gt;
    &lt;span class=&quot;kp&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Concurrent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Async&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;attach_to&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:action_controller&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process_action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;background_job&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;background_job&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# ...do something expensive with the message in a thread&lt;/span&gt;
      &lt;span class=&quot;nb&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2&gt;Activesupport::Notifications Is Everywhere Today&lt;/h2&gt;
&lt;p&gt;
  Second, and you probably already guessed this from the example, what makes this most awesome are the ready made
  messages that are already published &lt;b&gt;today&lt;/b&gt;.
&lt;/p&gt;
&lt;p&gt;
  Rails for instance uses &lt;code&gt;ActiveSupport::Notifications&lt;/code&gt; to publish close to 50(!) different instrumentation events
  that include data about your application. Data ranging from the HTTP status code of your requests, over which partials
  were rendered, to more esoteric measurements like the byte range attempted to be read from your ActiveStorage service.
  Check the &lt;a href=&quot;https://guides.rubyonrails.org/active_support_instrumentation.html&quot;&gt;instrumentation guide&lt;/a&gt;
  for all the dirty secrets.
&lt;/p&gt;

&lt;h2&gt;ActiveSupport::Notifications Is Easily Extendible&lt;/h2&gt;
&lt;p&gt;
  Last but not least, you can not only listen to messages others publish, you can publish messages to yourself.
&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;ActiveSupport&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Notifications&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;instrument&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;cool_thing_happened.my_app&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;some: :data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;MyApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;do_cool_thing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;
  Okay, you're convinced I hope! Now what do people do with &lt;code&gt;ActiveSupport::Notifications&lt;/code&gt; out in the world?
&lt;/p&gt;

&lt;h2&gt;Application Health/Performance Monitoring&lt;/h2&gt;
&lt;p&gt;
  Ever wondered how your metrics get to Sentry, New Relic, Datadog or Skylight? You guessed it, via &lt;code&gt;ActiveSupport::Notifications&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
  Now if the main work, publishing tons of messages through a pub-sub architecture, is already done by Rails, surely there are
  non-SaaS (a.k.a. Software Libre) options to display this data, right? Turns out there are not. While evaluating options for some
  of my projects (especially Open Build Service) we came across this gap and started to fill it.
&lt;/p&gt;
&lt;p&gt;
  How, why and where? Read on in the next part of this series: 
  &lt;a href=&quot;/blog/influxdb-rails.html&quot;&gt;Measure twice, cut once: App Performance Monitoring with influxdb-rails&lt;/a&gt;
&lt;/p&gt;

</description>
        <pubDate>Wed, 24 Mar 2021 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/activesupport.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/activesupport.html</guid>
        
        
      </item>
    
      <item>
        <title>My Toolbelt</title>
        <description>&lt;p&gt;
  Here is my personal hardware &amp;amp; software stack. The things I use and enjoy on a daily basis
  since a long time. The software is pretty much the standard in Free Software development stack.
  Don't expect to find anything you don't know here. I write this because people keep asking me,
  especially in mentoring situations.
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;h2&gt;Operating System: &lt;a href=&quot;https://www.opensuse.org/&quot;&gt;openSUSE Tumbleweed&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  It's my Linux of choice. Why? Because it's the German Engineering version of Linux:
  Long heritage, a certain kind of stiffness and it's super tidy. The
  &lt;a href=&quot;https://en.wikipedia.org/wiki/Rolling_release&quot;&gt;rolling nature&lt;/a&gt;
  of Tumbleweed gives me the stability &lt;b&gt;and&lt;/b&gt; the velocity I need. It brings all the standard
  Linux tools through a kick ass package manager (&lt;a href=&quot;https://doc.opensuse.org/documentation/leap/reference/html/book.opensuse.reference/cha-sw-cl.html&quot;&gt;zypper&lt;/a&gt;).
  And it embodies what makes the Free Software eco system great: software diversity. openSUSE tries
  &lt;i&gt;very hard&lt;/i&gt; to treat all software as first class citizen of the distribution.
&lt;/p&gt;
&lt;p&gt;
  Okay I admit it, I have been involved in making this Linux distribution for decades. So take this as pure
  bragging on my part. What it also means for me is that it's super easy to &lt;i&gt;&quot;scratch my itch&quot;&lt;/i&gt; a.k.a.
  understand things, fix bugs, implement features and find the right people to poke. I can only recommend this
  to you, find a Linux home, help to maintain it and make it your own.
&lt;/p&gt;

&lt;h2&gt;Desktop Environment: &lt;a href=&quot;https://www.gnome.org/&quot;&gt;GNOME&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  The thing I like most about GNOME is that it get's out of my way. It's restraint, simplistic, straight forward.
  And yet, if I want to do a thing I have never done before, it'll have an opinion on how to do it.
  I also dig the esthetics, I think I actually switched to it because it's soo damn beautiful to look
  at.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;The GNOME Desktop&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/gnome3-f94d63639399c39fe1a7d2822f742c4030c55393b4a12159ea7ca50d3fe22eba.png&quot;&gt;
  &lt;p class=&quot;img-license text-right&quot;&gt;
    GNOME 3 Desktop by
    &lt;a href=&quot;https://gnome.org&quot;&gt;gnome.org&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;Shell: &lt;a href=&quot;https://www.zsh.org/&quot;&gt;zsh&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  Well, any shell. I couldn't live without all those glorious one-liners like
  &lt;code&gt;for i in *; do echo mv $i `echo $i |sed 's/.rb/_spec.rb/'`; done&lt;/code&gt; or
  &lt;code&gt;history | awk '{print $2}' | sort | uniq -c | sort -nr |head -n 20&lt;/code&gt;. Utilizing all those
  programs that do only &lt;b&gt;one&lt;/b&gt; thing, but one thing &lt;b&gt;well&lt;/b&gt;. cp, mv, echo, grep, cat, awk, sed, find,
  head, tail, curl, test, sleep and so on and so on. What a wonderful chest of lego bricks, ready for you to plug
  together your own world. Also, I literally grew up in bash. It was shell scripting that introduced
  me to software development. And I will forever be fascinated by it, despite all the sneeze from the more
  sophisticated languages. Shell scripting is messy, raw, dangerous. Shell scripting is beautifully punk!
&lt;/p&gt;

&lt;h2&gt;Browser: &lt;a href=&quot;https://www.mozilla.org/en-US/firefox/new/&quot;&gt;Mozilla Firefox&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  I think, not counting the Linux kernel, Firefox is the only piece of software I used all my life
  (if you think of netscape communicator as ancestor). It's because the single most important quality of Firefox is progress.
  Tabs, add-ons, session restore, firebug, sync, mobile version and now built in privacy. Mozilla has been steadily
  pushing it's flagship product forward. It might not always be the first to market, it might not always be perfect
  from the start but it is always moving forward relentlessly. That is a rare quality. We all should pray that Mozilla
  continues this despite the google browser monopoly. BTW how the flying f**k is that monopoly OK with 65% of you?
  Don't you remember any computing history? &amp;lt;/rant&amp;gt;
&lt;/p&gt;

&lt;h2&gt;Source Code Management: &lt;a href=&quot;https://git-scm.com/&quot;&gt;git&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  In the meanwhile all projects I contribute to use git. I like git for being the right amount of clever CLI.
  That opens the pager only in the right moment, corrects me if I typo or let's me extend it, just by nameing a
  command &lt;code&gt;git-diff-to-deploy&lt;/code&gt;. And I really dig the &lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Internals-Git-Objects&quot;&gt;file based approach&lt;/a&gt; which means that I can often recover my idiot mistakes by nervously mocking around in &lt;code&gt;.git&lt;/code&gt;. It shows that the people maintaining this are seriously dog-fooding their own product day in and day out.
&lt;/p&gt;
&lt;h2&gt;Source Code Collaboration: &lt;a href=&quot;https://github.com&quot;&gt;github&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  With github I have a love-hate relationship. I admire the idea, the product and many of the people who build it.
  I build a tool in the same space of the industry (developer tooling) using the same technology (Ruby on Rails) and
  github people set the gold standard in collaboration workflows since years. I only humbly follow their set out examples.
&lt;/p&gt;
&lt;p&gt;
  But I really don't like them riding and emphasizing
  &lt;a href=&quot;https://en.wikipedia.org/wiki/Network_effect&quot;&gt;the network effect&lt;/a&gt;. And I flat out &lt;b&gt;hate&lt;/b&gt; that
  such a large piece of software in my stack is closed source.
  Quite frankly I do not understand how anyone at Microsoft can justify to their mirror that github is not Free Software.
  It's not like anyone will ever be able to take any business away from github.com which value is the number of people
  using it. As you can see with me and my projects, that ship has sailed a long time ago. Why do you have to deny me
  my software freedoms if I can't use them to &lt;i&gt;hurt&lt;/i&gt; you in any way?
&lt;/p&gt;
&lt;p&gt;
  I am a Ruby on Rails developer, I know a thing or two about collaborating on software. I want to send a pull-requests
  fixing gripes or missing functionality I have with github itself. Why &lt;em&gt;the hell&lt;/em&gt; can't I do that? Why do people
  have to resort to write &lt;a href=&quot;https://github.com/sindresorhus/refined-github&quot;&gt;browser extensions&lt;/a&gt; to be able to
  collaborate on github functionality. This is insane! &amp;lt;/rant&amp;gt;
&lt;/p&gt;
&lt;h2&gt;Mailer: &lt;a href=&quot;https://www.thunderbird.net&quot;&gt;Mozilla Thunderbird&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  Thunderbird is the only piece of software in this list I'm not very passionate about. It helps me reading,
  finding and writing mail from my four imap accounts in one single interface. It does so better than any
  mail user agent, web mailer or mobile app I have tried so far. Yet I have the feeling there should be something
  better. Can't seem to find it though, despite really searching. Guess Churchill was right: Thunderbird is the
  worst MUA, except for all the others.
&lt;/p&gt;
&lt;h2&gt;Editor: &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt; and &lt;a href=&quot;https://www.vim.org/&quot;&gt;vim&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  I fire up vim when I need to do a quick script, jog down a note, edit configuration files or for a quick
  fix. Visual Studio Code is what I use for deep dive bug fixes or feature development. About vim I like most
  the raw power that comes with it. Doing something like &lt;code&gt;gqaw&lt;/code&gt; or &lt;code&gt;v&amp;lt;end&amp;gt;~&lt;/code&gt; is gold.
  But I have a problem with vim: I easily remember a small set of things for a long time, but I have not much capacity
  to remember 50 keyboad shortcuts forever ¯\_(ツ)_/¯ That's why I need a user interface that guides me and offers
  me a place to search visually for what I want to do. &lt;code&gt;CTRL+p+fold level+click&lt;/code&gt; is exactly that.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A screenshot of visual studio code&quot; class=&quot;img-responsive img-rounded img-center&quot; src=&quot;/assets/posts/visual-studio-code-49e71f1ce65359f6bc2015b4b7f85c8dae71039a4cb6683c1ad9cc56ac013d7b.png&quot;&gt;
  &lt;p class=&quot;img-license text-right&quot;&gt;
    Visual Studio Code by Henne Vogelsang licensed
    &lt;a href=&quot;http://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;Containers: &lt;a href=&quot;https://docs.docker.com&quot;&gt;docker &amp;amp; docker-compose&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  I'm hacking a bunch of different software projects on a daily basis. I need them compartmentalized so
  I can build, start/stop and destroy them at will. Without each of them compromising the other, or my system,
  with their gazillion dependencies, services and side cars.
&lt;/p&gt;
&lt;p&gt;
  Linux containers are the most efficient way to
  do this for me. As I'm not super interested in architectural intricacies of container runtimes and a frequent
  visitor of &lt;a href=&quot;https://doineedkubernetes.com/&quot;&gt;doineedkubernetes.com&lt;/a&gt;, I'm kind of habituated to
  docker and docker-compose. Investing a day or two into building a development environment that you can set up,
  run, suspend and tear down at will is hacker magic! Mounting your local file system into it, so your can
  shell around and use whatever editor you want is 🤯
&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Laptop: &lt;a href=&quot;https://www.dell.com/en-us/work/shop/dell-laptops-and-notebooks/new-xps-13-laptop/spd/xps-13-9300-laptop&quot;&gt;Dell XPS 13 (9380)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  I work from at least two different places during the day. My office, meeting room, home office etc.
  That's why I dig this powerful 13&quot; laptop you can swing around with ease. It also features a nice enough keyboard,
  can be charged via USB-C (&lt;a href=&quot;https://www.dell.com/en-in/shop/dell-hybrid-adapter-power-bank-usb-c-ph45w17-ca-45w-ac-adapter-notebook-power-bank-43wh/apd/492-bciv/pc-accessories&quot;&gt;power bank&lt;/a&gt; ready) and
  you can even be buy it with (the wrong) Linux preloaded! What more can you ask from hardware?
&lt;/p&gt;
&lt;h2&gt;Keyboard: &lt;a href=&quot;https://www.duckychannel.com.tw/en/Ducky-One2-Horizon-TKL&quot;&gt;Ducky One 2 Horizon TKL&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
  Guess if you're an old fart like me you just need something that feels a bit like a model M keyboard. But please without
  the nicotine stained look. This ducky quacks for me at the office where I plug in my laptop into a docking station.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A Keyboard&quot; class=&quot;img-responsive img-center&quot; src=&quot;/assets/posts/ducky-c8267021c4856391e3ce94b6a61cb75913b18f5866ff52c4130433931c27e342.png&quot;&gt;
  &lt;p class=&quot;img-license text-right&quot;&gt;
    Ducky One 2 Horizon TKL
    &lt;a href=&quot;https://duckychannel.com.tw&quot;&gt;duckychannel.com.tw&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;That's what I consistently make use of during the day, nothing spectacular right? Of course not, those things
  are about getting shit done! Not about impressing you, sport! 😜
&lt;/h2&gt;
</description>
        <pubDate>Mon, 02 Mar 2020 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/uses.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/uses.html</guid>
        
        
      </item>
    
      <item>
        <title>Fascinating! February 2020</title>
        <description>&lt;p&gt;
  The universe is full of captivating, compelling and exquisite things. The internet,
  the most complete representation of humanity, is no different in that regard. Both are vast,
  seemingly endless and full of places you should know about. Let me share content that has
  moved me, in some way, in the last month. February was mostly inter-personal stuff like
  ethics, hiring or collaborating remote. Enjoy.
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;h2&gt;
  &lt;span class='linea-cart'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://www.yubico.com/product/yubikey-5c-nano&quot;&gt;
    YubiKey 5C Nano
  &lt;/a&gt;
  a product by yubico
&lt;/h2&gt;
&lt;p&gt;
  Some collegue of mine mentioned &lt;a href=&quot;https://f-droid.org/en/packages/org.shadowice.flocke.andotp/&quot;&gt;andOTP&lt;/a&gt; and
  good Free Software citizen I am, moved all of my 2FA to it. Doing so made me think of checking support for hardware
  security modules on Linux again. Ordered this YubiKey, now I'm off 2FA with my phone and just touch my laptop when
  asked. Thanks &lt;a href=&quot;https://webauthn.guide/&quot;&gt;WebAuthn&lt;/a&gt;! One of those &quot;Why they heck did I not do this earlier?&quot; moments.
&lt;/p&gt;


&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://foundation.mozilla.org/en/initiatives/great-tech-great-responsibility/&quot;&gt;
    A student guide for navigating ethical issues in the tech industry
  &lt;/a&gt;
  by Mozilla
&lt;/h2&gt;
&lt;p&gt;
  I have no idea why Mozilla says this is for students? Clearly this is for everybody! Be it people considering going into
  the tech industry (like students), people already in it or even people who just want to know what it going on in this
  cesspool.
&lt;/p&gt;
&lt;p&gt;
  Especially if you are in this industry already: Read this, think about it, talk about it with your peers,
  dive deeper into this topic. Do this so you can help to save the environment you probably planed to work the rest of
  your life in. Ethics help them who help themselves!
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/&quot;&gt;
    git sparse-checkout
  &lt;/a&gt;
  a post by &lt;a href=&quot;https://stolee.dev/&quot;&gt;Derrick Stolee&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;
  An experimental git command that allows you to checkout one or more sub-directories of a repo. Primarily
  meant for monorepos with gazillion of projects in it. But I think this could also turn out to be usefull
  for other situations. Like skipping large infrequently used directories etc. Check it out!
&lt;/p&gt;


&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://lp.buffer.com/state-of-remote-work-2020&quot;&gt;
    The 2020 State of Remote Work
  &lt;/a&gt;
  a survey by Buffer.com
&lt;/h2&gt;
&lt;p&gt;
  No real shockers this year, the concept of distributed teams is humming along. One thing I find interesting
  about this is how much the top challenges are also the top challenges of (larger) Free Software communities.
  If you reach a certain size your community fractures because people start their own communication neighborhoods.
  Mailing lists, forums, IRC etc. Each group get's enough information about the community (mostly from wanderers
  between the neighborhoods) so they feel they don't miss out. Yet, some important things fall through the cracks.
  Frequent cries for unification of groups are either ignored or end up in &lt;a href=&quot;https://xkcd.com/927/&quot;&gt;XKCD#927&lt;/a&gt;.
  In the end, you just live with it and realize that you can't streamline a large amount of people to this degree.
&lt;/p&gt;
&lt;p&gt;
  And I think loneliness is also at the root of many of the problems that Free Software communities face. Especially
  I suspect this to be the top reason for contributor churn. You can't vent &lt;em&gt;at the time&lt;/em&gt; you're angry about
  something in the code base. You don't have anyone to share your joy with, &lt;em&gt;at the time&lt;/em&gt; you finally feel
  confident enough to open this super cool feature pull request. You have to context switch to something else
  because no one is around &lt;em&gt;at the time&lt;/em&gt; you need to know why this code behaves like it behaves. Those
  situations are just a little less fulfilling than they are if you're together with people. And this will bite
  at your willingness to continue, one at a time. And that's how you can eat an elephant.
&lt;/p&gt;
&lt;p&gt;
  Often I'd wish we would not have been such punks in the Free Software movement. That we instead collectively focused
  some of the time and energy we've spend on creating software on figuring out what happened to us and between us.
  We &lt;b&gt;made&lt;/b&gt; collaboration among free equals into a viable option to be creative. But we were to lazy to write
  the documentation how to organize people doing it...
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://www.jarednelsen.dev/posts/The-horrifically-dystopian-world-of-software-engineering-interviews&quot;&gt;
    The Horrifically Dystopian World of Software Engineering Interviews
  &lt;/a&gt;
  a post by Jared Nelsen
&lt;/h2&gt;
&lt;p&gt;
  One persons odyssey through many of the ridicolous hiring practices in play today. And the best analysis of why
  this is like it is I have read to today.
&lt;/p&gt;
&lt;blockquote&gt;
  We are being consumed by our own mythology.
  We all know algorithm challenges are a contrived game.
  Why are we measuring people and not learning about people?
&lt;/blockquote&gt;
&lt;p&gt;
  I start to feel bad for the nail, as much as this hits it on the head. Or as
  Chelsea puts it &lt;a href=&quot;https://chelseatroy.com/2017/07/21/smart-is-not-a-hiring-criterion/&quot;&gt;“Smart” is Not a Hiring Criterion&lt;/a&gt;.
&lt;/p&gt;


&lt;h2&gt;
  &lt;span class='linea-list'&gt;&lt;/span&gt;
  Tools I found interesting
&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/lupoDharkael/flameshot&quot;&gt;flameshot&lt;/a&gt; · A screenshot tool&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/boyter/scc&quot;&gt;scc&lt;/a&gt; · Fastest LOC counter possible&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.dev/native-lazy-loading/&quot;&gt;Browser Lazy Load&lt;/a&gt; · Coming to a browser near you &lt;code&gt;&amp;lt;img src=&quot;image.png&quot; loading=&quot;lazy&quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gitexplorer.com/&quot;&gt;Git Command Explorer&lt;/a&gt; · Interactive git documentation&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://explorabl.es/&quot;&gt;explorabl.es&lt;/a&gt; · A hub for learning through play! &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://hackertyper.net/&quot;&gt;hackertyper&lt;/a&gt; · A neat way to show non-nerds what you do for a living&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/polarblau/capycorder/&quot;&gt;capycorder&lt;/a&gt; · Generating capybara request specs by clicking in your browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  &lt;span class='linea-list'&gt;&lt;/span&gt;
  Talks I enjoyed
&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Ea8EiIPZvh0&quot;&gt;Compassionate—Yet Candid—Code Reviews&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/aprilwensel&quot;&gt;April Wensel&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=sN19aNmjBoU&quot;&gt;Salary Negotiation Workshop&lt;/a&gt; by &lt;a href=&quot;https://www.joshdoody.com/&quot;&gt;Josh Doody&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PJjmw9TRB7s&quot;&gt;Implementing a Strong Code-Review Culture&lt;/a&gt; by &lt;a href=&quot;https://www.prioritized.net/&quot;&gt;Derek Prior&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.video.uni-erlangen.de/clip/id/12498&quot;&gt;Single-Vendor Open Source Firms &lt;/a&gt; by &lt;a href=&quot;https://twitter.com/dirkriehle&quot;&gt;Prof. Dr. Dirk Riehle&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://media.ccc.de/v/36c3-10993-vom_ich_zum_wir&quot;&gt;Vom Ich zum Wir&lt;/a&gt; by maha and Kai Biermann&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neat stuff! Hope some of it makes you think/act in new ways, as it has me.&lt;/p&gt;
</description>
        <pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/fascinating-02-2020.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/fascinating-02-2020.html</guid>
        
        <category>fascinating</category>
        
        
      </item>
    
      <item>
        <title>Fascinating! January 2020</title>
        <description>&lt;p&gt;
  The universe is full of captivating, compelling and exquisite things. The internet,
  the most complete representation of humanity, is no different in that regard. Both are vast,
  seemingly endless and full of places you should know about. Let me share content that has
  moved me, in some way, in the last month. January is packed with sustainable open source,
  management stuff, too many tools and a bunch of awesome talks from 36c3. Go explore!
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://blog.tidelift.com/open-source-licenses-2019-year-in-review&quot;&gt;
    Open source licenses: 2019 year in review
  &lt;/a&gt;
  a post by &lt;a href=&quot;https://lu.is/&quot;&gt;Luis Villa&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;
  Luis, the co-founder of &lt;a href=&quot;https://tidelift.com/&quot;&gt;tidelift&lt;/a&gt;, wrote a nice rundown
  of all the Free Software license developments of the last 12 months. From pushing
  worker solidarity (&lt;a href=&quot;https://github.com/996icu/996.ICU&quot;&gt;996.ICU&lt;/a&gt;) over the
  &lt;a href=&quot;https://ethicalsource.dev/&quot;&gt;ethical source movement&lt;/a&gt; and &lt;a href=&quot;&quot;&gt;the hippocratic license&lt;/a&gt;
  to the rough time the OSI and the FSF have to respond to these new ideas. In 2019 the question that
  is currently dividing so many people on this planet has arrived (again) in Free Software. What is more important:
  Safety or Privilege?
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://xscode.com/&quot;&gt;
    XS:CODE
  &lt;/a&gt;
  a company.
&lt;/h2&gt;
&lt;p&gt;
  While we are on the topic of licensing. I came across XS:CODE, the third player (I know of) in the realm
  of &lt;i&gt;subscription based open source&lt;/i&gt;. Tidelift and &lt;a href=&quot;https://licensezero.com/&quot;&gt;Lizense Zero&lt;/a&gt;
  are the other two. This is still a bit too much gig-economy for me personally, but for sure 
  a nice alternative to producing Free Software as a byproduct of the next big closed source SAAS app.
  I keep wondering, if something like this would have existed in my (hacker) youth, what would I have done?
  Probably stayed away from hacking because of choice fatigue…
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://www.attack-gecko.net/2018/06/25/building-a-first-team-mindset/&quot;&gt;
    Building a First Team Mindset
  &lt;/a&gt;
  a post by &lt;a href=&quot;https://www.attack-gecko.net&quot;&gt;Jason Wong&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;
  This one hit close to home. As someone who grew out of the world of Free Software into the 
  world of people/project management I'm often amazed on how anti-collaboration this field is.
  Most managers care a great deal about the team they lead and give a &lt;b&gt;flying fuck&lt;/b&gt; about the
  managers they serve with. All this clan mentality, self-absorption and bickering about resources.
  Jason proposed to adopt a different approach to this.
&lt;/p&gt;
&lt;blockquote&gt;A First Team mindset is the idea that leaders prioritize supporting their fellow leaders over supporting their direct reports&lt;/blockquote&gt;
&lt;p&gt;
  Amen Jason!
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;http://www.hemingwayapp.com/&quot;&gt;
    Hemmingway
  &lt;/a&gt;
  an app by Adam &amp; Ben Long
&lt;/h2&gt;
&lt;p&gt;
  Adam and his brother Ben Long have created the Hemingway App to fight the awful prose on the internet.
  Kind of like... my prose. I have the dreadful habbit to write super long, riddled with subordinate clauses,
  and superfluous complicated sentences. There, you see? I've been using the app more and more, especially
  while writing for a broader audience. Like job descriptions, commit messages and blog posts. It's a form 
  of accessibility, the peepz from a list apart &lt;a href=&quot;https://alistapart.com/article/standards-for-writing-accessibly/&quot;&gt;agree&lt;/a&gt;
  and &lt;a href=&quot;https://www.24a11y.com/2019/automating-inclusive-documentation/&quot;&gt;24a11y&lt;/a&gt; agree.
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;http://www.facesofopensource.com/new-faces-added-in-2019/&quot;&gt;
    Face of Open Source: New Faces added in 2019
  &lt;/a&gt;
  portraits by &lt;a href=&quot;http://www.peteradamsphoto.com/&quot;&gt;Peter Adams&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;
  Free Software moves me most, if it mixes with other art forms. Be it
  &lt;a href=&quot;https://opensourcedesign.net/&quot;&gt;design&lt;/a&gt;, &lt;a href=&quot;https://freemusicarchive.org/music/Handmade_Moments/Paw_Paw_Tree/Faked_My_Own_Death_&quot;&gt;music&lt;/a&gt;,
  &lt;a href=&quot;http://xie-emily.com/projects.html&quot;&gt;performance&lt;/a&gt; or like in this case: photography.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;Portraits of Revolutionaries&quot; class=&quot;img-responsive img-rounded img-center&quot; src=&quot;/assets/posts/2019faces-1024x517-7b8cefe2995ffd774aa590d107aace1c27a5d3dadfc44029d9813d106accc5f0.jpg&quot;&gt;
  &lt;p class=&quot;img-license text-right&quot;&gt;
    Faces of Open Source / Peter Adams
    &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/4.0/&quot;&gt;CC BY-NC-SA 4.0&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
  Look at those beautiful people and check out their contributions.
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://jocelyngoldfein.com/culture-is-the-behavior-you-reward-and-punish-7e8e75c6543e&quot;&gt;
    Culture is the Behavior You Reward and Punish
  &lt;/a&gt;
  a post by Jocelyn Goldfein
&lt;/h2&gt;
&lt;p&gt;
  The story of how Jocelyn learned that culture needs to be defended. I really liked the 
  question: &quot;What makes people successful here?&quot; as a tool to understand the lived (not stated) values of
  an organization.
&lt;/p&gt;
&lt;p&gt;
  In the last couple of years lots of projects (especially events) in the software community
  have been working on defining and defending their cultural standards. Out if this emerged the
  &lt;a href=&quot;https://www.contributor-covenant.org/&quot;&gt;contributor covenant&lt;/a&gt; as defacto standard.
  It clearly emphasizes the need for enforcement.
&lt;/p&gt;
&lt;blockquote&gt;
A code of conduct that isn’t (or can’t be) enforced is worse than no code of conduct at all:
it sends the message that the values in the code of conduct aren’t actually important or respected
in your community.

— &lt;a href=&quot;https://adainitiative.org/&quot;&gt;Ada Initiative&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;
  At work we are undergoing a &lt;a href=&quot;https://www.suse.com/c/news/suse-completes-move-to-independence-reaffirms-commitment-to-customers-partners-and-open-source-communities-as-industrys-largest-independent-open-source-company/&quot;&gt;phase&lt;/a&gt;
  of similar culture turmoil right now. Not sure all people have understood yet what they got in to.
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://ourdataourselves.tacticaltech.org&quot;&gt;
    Our Data Our Selves
  &lt;/a&gt;
  a project by the &lt;a href=&quot;https://tacticaltech.org/&quot;&gt;tactical tech&lt;/a&gt; NGO.
&lt;/h2&gt;
&lt;p&gt;
  A very deep look at the increasing role data plays in our lives. As means to activism, force in politics
  and integral part of yourself. 
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://thoughtbot.com/blog/how-to-estimate-feature-development-time-maybe-don-t&quot;&gt;
    How to Estimate Feature Development Time: Maybe Don't 
  &lt;/a&gt;
  a post by Amanda Beiner of &lt;a href=&quot;https://thoughtbot.com&quot;&gt;thoughtbot&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;
  A very profound argument of the benefits but especially the consequences of (time) estimations in
  software development. At work we hopped the #noestimates train a long time ago, never really looked
  back. I personally also begin to dread the same consequences (explicit deadlines) for the sprint SCRUM event.
  I dream of trying to adopt our iteration cycle to the deliverable, not the other way around.
&lt;/p&gt;

&lt;h2&gt;
  &lt;span class='linea-list'&gt;&lt;/span&gt;
  Tools I found interesting
&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://remark.js.org/&quot;&gt;remark.js&lt;/a&gt; · A markdown linter&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.brow.sh/&quot;&gt;brow.sh&lt;/a&gt; · A modern text-based browser&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/imsnif/bandwhich&quot;&gt;bandwhich&lt;/a&gt; · A terminal bandwidth utilization tool&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://autocrypt.org/&quot;&gt;autocrypt&lt;/a&gt; · Convenient End-to-End Encryption for E-Mail&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://susi.ai/about&quot;&gt;suse.ai&lt;/a&gt; · An Open Source personal assistant / chat bot&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gitlab.com/timvisee/ffsend&quot;&gt;ffsend&lt;/a&gt; · A command line Firefox Send client&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/infostreams/db&quot;&gt;db&lt;/a&gt; · A database snapshot tool&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  &lt;span class='linea-list'&gt;&lt;/span&gt;
  Talks I enjoyed
&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://media.ccc.de/v/36c3-10795-ngi_zero_a_treasure_trove_of_it_innovation&quot;&gt;NGI Zero: A treasure trove of IT innovation&lt;/a&gt; by &lt;a href=&quot;https://nlnet.nl/people/leenaars.html&quot;&gt;Michiel Leenaars&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://media.ccc.de/v/36c3-11113-reducing_carbon_in_the_digital_realm#t=3688&quot;&gt;Reducing Carbon in the Digital Realm&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/mrchrisadams&quot;&gt;Chris Adams&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://media.ccc.de/v/36c3-10639-let_s_play_infokrieg&quot;&gt;Let’s play Infokrieg&lt;/a&gt; by &lt;a href=&quot;https://vogelgesang.internil.net/&quot;&gt;Arne Vogelgesang&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://media.ccc.de/v/36c3-oio-171-ubuntu-touch-co-gnu-linux-in-der-hosentasche&quot;&gt;Ubuntu Touch &amp; Co&lt;/a&gt; by &lt;a href=&quot;https://github.com/NeoTheThird&quot;&gt;Jan Sprinz&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-UVV8_560eE&quot;&gt;Digesting MRI by Studying Alternative Ruby Implementations &lt;/a&gt; by &lt;a href=&quot;https://bruckmayer.net/&quot;&gt;Christian Bruckmayer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;That was a lot of awesome stuff! Hope some of it makes you think/act as it has me.&lt;/h2&gt;
</description>
        <pubDate>Sat, 01 Feb 2020 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/fascinating-01-2020.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/fascinating-01-2020.html</guid>
        
        <category>fascinating</category>
        
        
      </item>
    
      <item>
        <title>Fascinating! September 2019</title>
        <description>&lt;p&gt;
  The universe is full of captivating, compelling and exquisite things. The internet,
  the most complete representation of humanity, is no different in that regard. Both are vast,
  seemingly endless and full of places you should know about. Let me share content that has
  moved me, in some way, in the last month. This time it's mostly think-pieces, an event and a
  couple of tools. Enjoy!
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;h2&gt;
  &lt;span class='linea-link'&gt;&lt;/span&gt;
  &lt;a href=&quot;https://ncase.me/trust/&quot;&gt;
    The Evolution of Trust
  &lt;/a&gt;
  by &lt;a href=&quot;https://ncase.me/&quot;&gt;Nicky Case&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;
  A lovely explanation of trust in game theory. It's an interactive &quot;game&quot; in which you can try out
  how the rules of the game and the strategy influence the distribution of archetypes of player. I
  don't think realy humans act anywhere near as rational and consistent as players in game theory,
  yet, some effects are incredible to whitness first hand.
&lt;/p&gt;

&lt;h2&gt;
    &lt;span class='linea-link'&gt;&lt;/span&gt;
    &lt;a href=&quot;https://medium.com/personal-growth/thinking-shallow-and-deep-9932f208470b&quot;&gt;
      Thinking, Shallow And Deep
    &lt;/a&gt;
    by &lt;a href=&quot;https://medium.com/@alltopstartups&quot;&gt;Thomas Oppong&lt;/a&gt;
  &lt;/h2&gt;
&lt;p&gt;
  My zodiac sign is sloth and easygoing is two cornerstones of my doctrine. So
  I'm not very fond of self-optimization, especially not in the startup context. But somehow
  this piece by Thomas hit it with me. In it he pulls together a couple of thoughts about the act of deep thinking.
  How that helps you to avoid confirmation bias, how that is a good thing in the information
  age of life long learning. But also how current society (unintentionally?) distracts you
  from it. A nice thread thought, asking powerful questions.
&lt;/p&gt;

&lt;h2&gt;
    &lt;span class='linea-link'&gt;&lt;/span&gt;
    &lt;a href=&quot;https://medium.com/@Hanna.Thomas/why-dont-we-just-call-agile-what-it-is-feminist-8bdd9193edba&quot;&gt;
      Why Don’t We Just Call Agile What It Is: Feminist
    &lt;/a&gt;
    by
    &lt;a href=&quot;https://twitter.com/hannathomas&quot;&gt;
      Hanna Thomas
    &lt;/a&gt;
  &lt;/h2&gt;
&lt;p&gt;
  There, she said it! Collaborative, supportive, non-hierarchical relationships that empower people and
  embrace change are at the core of many progressive feminist theories. And obviously they have been a
  big influence on agile. An Agile mindset is a progressive feminist mindset. I couldn't agree more.
&lt;/p&gt;

&lt;h2&gt;
    &lt;span class='linea-link'&gt;&lt;/span&gt;
    &lt;a href=&quot;https://www.incredibledoom.com/&quot;&gt;
      Incredible Doom (Season Finale)
    &lt;/a&gt;
    by &lt;a href=&quot;https://twitter.com/MatthewBogart&quot;&gt;Matthew Bogart&lt;/a&gt;
  &lt;/h2&gt;
&lt;p&gt;
  Ah the '90s! Everything was possible and doomed, at the same time. If you, like me, grew up
  during this decade then this is for you. A comic series about '90s kids making bad decisions over
  the early internet. If you grew up some other time, check it out to understand what this internet
  thing really meant in the beginning. Might explain why so many of us still won't let go of the
  quirky edges of it, despite all the surveilance capitalist bullshit on the frontpage now.
  Especially the &lt;a href=&quot;https://buyolympia.com/Artist/Matthew+Bogart&quot;&gt;printed issues&lt;/a&gt;
  make me drool. 
&lt;/p&gt;

&lt;h2&gt;
    &lt;span class='linea-link'&gt;&lt;/span&gt;
    &lt;a href=&quot;https://provided-as-is.dev/&quot;&gt;
      PROVIDED AS IS
    &lt;/a&gt;
    by the people at &lt;a href=&quot;https://formidable.com/&quot;&gt;Formidable&lt;/a&gt;
  &lt;/h2&gt;
&lt;p&gt;
  Another event targeted at free software/open source project maintainers with the expressed intent
  to explore the set of skills beyond “just coding”. At some point in time some of us are going to
  have to pull all of this shared knowledge about tactics out of conversations into a book or something.
&lt;/p&gt;


&lt;h2&gt;
    &lt;span class='linea-link'&gt;&lt;/span&gt;
    &lt;a href=&quot;https://github.com/senorprogrammer/indexter&quot;&gt;
      indexter
    &lt;/a&gt;
    by &lt;a href=&quot;https://github.com/senorprogrammer&quot;&gt;Chris Cummer&lt;/a&gt;
  &lt;/h2&gt;
&lt;p&gt;
  Ruby gem for checking Rails database tables for missing indexes on foreign keys.
  Happy hunting, hope you find at least one that has a nice performance impact on your app.
&lt;/p&gt;

&lt;h2&gt;
    &lt;span class='linea-link'&gt;&lt;/span&gt;
    &lt;a href=&quot;https://redash.io/&quot;&gt;
      Redash
    &lt;/a&gt;
    &amp;
    &lt;a href=&quot;https://www.metabase.com/&quot;&gt;
      Metabase
    &lt;/a&gt;
  &lt;/h2&gt;
&lt;p&gt;
  I'm on an ongoing quest for the perfect Free Software observability sidecar. I need oberservability.
  I dread every day I wake up to &lt;code&gt;Mysql2::Error::ConnectionError&lt;/code&gt; for some requests
  in my exception tracker without the ability to ask it about the status of the network or SQL cluster
  during that time. DIGAME! Both tools focus on sharing questions people come up with, as collaboration
  addict I very much like that. Both are Free Software with people making money from it, like that even
  more!
&lt;/p&gt;

&lt;h2&gt;That's it, hope you enjoy this stuff as much as I did.&lt;/h2&gt;</description>
        <pubDate>Mon, 30 Sep 2019 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/fascinating-09-2019.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/fascinating-09-2019.html</guid>
        
        <category>fascinating</category>
        
        
      </item>
    
      <item>
        <title>Free Software is funded by Free People</title>
        <description>&lt;p&gt;
  More and more security incidents in Free Software projects get publicized in a
  way that anyone &amp;amp; their grandma understand the impact. Some of these
  carefuly crafted &quot;&lt;a href=&quot;http://heartbleed.com/&quot;&gt;campaigns&lt;/a&gt;&quot; even make it
  to the main stream media. This trend, among other things, has sparked a
  discussion about funding Free Software to sustain the infrastructure everyone
  is building upon. A discussion which, in our venture capital driven tech
  world, mostly evolves around &lt;em&gt;financing&lt;/em&gt; as a means for getting
  resources. Who can/should pay whom, to develop Free Software and how. I would
  like to add another view at funding, one that in my opinion has way more to do
  with Free Software ecosystem than cold, hard cash: collaboration of free
  people.
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;h2&gt;Freedom and what you make of it&lt;/h2&gt;
&lt;p&gt;
  The ability to run, copy, distribute, study, change and improve software. This
  is the essence of it, without these fundamental rights, software is not Free
  Software. And these fundamentals imply a purpose: Freedom, the ability to do
  as one wills. To do to software as one wills.
&lt;/p&gt;

&lt;p&gt;
  As always, what people make of their freedom is up to them. Some go an preach
  about it, most ignore it, some use it for their personal gain. However, it's
  undeniable that the Free Software movement has entailed a community of
  systematic world wide collaboration. In software development, and I would
  argue in many other aspects of todays life. We all know the examples of
  hundreds of developers hacking together on Linux, thousands of authors on
  Wikipedia per month, millions of pictures in the creative commons and so on.
  Obviously, if you give people the freedom to do as they want, many of them are
  inspired to work together for the common benefit. And because Free Software
  entails collaboration and collaboration is about individuals, making projects
  sustainable has many dimensions. Money is one.
&lt;/p&gt;

&lt;h2&gt;Challenges and what you do about them&lt;/h2&gt;
&lt;p&gt;
  Of course there are many things going wrong today with making Free
  Software projects sustainable. For instance a growing imbalance between
  developers and users (&lt;a href=&quot;https://coderanger.net/funding-foss/&quot;&gt;Noah
  Kantrowitz&lt;/a&gt;), that developers think they are not getting fairly compensated
  (&lt;a href=&quot;http://ryanbigg.com/2015/11/open-source-work/&quot;&gt;Ryan Bigg&lt;/a&gt;) or
  that everybody is waiting for someone else to do something
  (&lt;a href=&quot;http://marijnhaverbeke.nl/blog/sustainable-maintenance.html&quot;&gt;Marijn
  Haverbeke&lt;/a&gt;). Contributor burn-out. There are many, many more.
&lt;/p&gt;
&lt;p&gt;
  The solutions to these shortcomings, discussed in the past months, most exclusively focus on
  monetizing work. Be it through business models, crowd funding, grants and
  other forms of injecting money into the equasion. In a recent piece, &lt;a
  href=&quot;https://medium.com/@nayafia/how-i-stumbled-upon-the-internet-s-biggest-blind-spot-b9aa23618c58&quot;&gt;Nadia
  Eghbal&lt;/a&gt; even argues that somehow venture capital must flow back because all
  of the VC funded software companies somehow base their work on Free Software.
  &lt;a href=&quot;http://words.steveklabnik.com/is-npm-worth-26mm&quot;&gt;Steve Klabnik&lt;/a&gt;
  thinks this is already happening. Here is the thing: Money will buy you
  people who contribute, sure thing. But is it money for contributions that made
  the present? For sure not. Collaborative contributions are the currency of Free
  Software.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;The openSUSE Community&quot; class=&quot;img-responsive img-rounded img-center&quot; src=&quot;/assets/posts/community-572c4c2541e671e3fc6943bfa3508b3f74775f133369ebddba5aeda05f7ac340.jpg&quot;&gt;
  &lt;p class=&quot;img-license text-right&quot;&gt;
    openSUSE Community by Henne Vogelsang licensed
    &lt;a href=&quot;http://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;People and how you treat them&lt;/h2&gt;
&lt;p&gt;
  People have made Free Software as big as it is. &lt;em&gt;Active contributor
  communities&lt;/em&gt;. Humans from all over the world, with different talents,
  levels of expertise and cultural backgrounds collaborating. All with their own
  motivations. Some want to learn from others, some scratch their itch,
  some want to train their skills, some want to boost their resume, some contribute
  on behalf of a company, some just try to avoid being bored on a Saturday afternoon. If your project
  does not actively channel &lt;em&gt;all&lt;/em&gt; of these ambitions into contributions,
  if it does not organize the collaboration, if it is not offering shared
  responsibility and if it does not attract new contributors &lt;b&gt;it's doing
  something wrong&lt;/b&gt;.
&lt;/p&gt;
&lt;p&gt;
  An individual/company slapping a license onto code, uploading
  it to github, merging pull-requests and answering issues is not making a
  sustainable Free Software project. Yet this is what many do today.
&lt;/p&gt;
&lt;p&gt;
  If you look at the most prominent examples of the software people worry about,
  &lt;a href=&quot;https://www.buzzfeed.com/chrisstokelwalker/the-internet-is-being-protected-by-two-guys-named-st&quot;&gt;openssl&lt;/a&gt;
  or &lt;a
  href=&quot;http://www.informationweek.com/it-life/ntps-fate-hinges-on-father-time/d/d-id/1319432&quot;&gt;NTP&lt;/a&gt;,
  they are failed communities. They disintegrated to a point where collaboration
  ceased to exist, the remainaing people were not able to do anything to change
  this (I'm sure they tried hard) and in the end something bad happened, and now
  they are clearly not sustained. Now we all can throw some bucks together to
  keep developers developing but that wont make those projects sustainable Free
  Software communities. In my opinion paying for contributions is to capitulate
  in the face of to the task of building a sustainable community. There are
  other things which are more important.
&lt;/p&gt;

&lt;h2&gt;Fund Free Software without money&lt;/h2&gt;
&lt;p&gt;
  I guess the most obvious way to fund Free Software projects without money is
  to contribute in any way possible for you, duuhh. But apart from that I think
  there are more things we as the Free Software community at large can do
  better.
&lt;/p&gt;
&lt;p&gt;
  In my opinion it's time we help each other to organize collaboration. We need
  to share best pratices about creating sustainable contributor communities that
  attract new people.
&lt;/p&gt;
&lt;p&gt;
  We also should be more upfront with each other when we notice communities
  failing. I have contributed code to NTP a couple of years ago and didn't care
  that it was such a bleak place. Someone merged my patches, I was off again. In
  retrospecitve this feels like not telling someone their flap is open.
&lt;/p&gt;
&lt;p&gt;
  I also think that we need to do better with copyleft project resources. We
  have the choice between 27 different C++ compilers but if you're looking
  for marketing materials, web site themes or templates of contributor
  guidelines you will draw mostly blanks. Convincing prospective users and
  contributors that our Free Software does something significantly better than
  the competition is very important, yet we leave each other hanging with this.
&lt;/p&gt;
&lt;h2&gt;Now go do something&lt;/h2&gt;
&lt;p&gt;
  Luckily somewhere Free Software people already have started with all of this. There is
  the &lt;a href=&quot;http://www.communityleadershipforum.com&quot;&gt;community leadership
  forum&lt;/a&gt; where you can talk about all the aspects of your community.
  &lt;a href=&quot;https://opensource.com/&quot;&gt;opensource.com&lt;/a&gt; curates a blog of
  best practices. Designers started to rally
  around &lt;a href=&quot;http://opensourcedesign.net/&quot;&gt;opensourcedesign.net&lt;/a&gt;.
  People all over start to address the obvious
  &lt;a href=&quot;http://contributor-covenant.org/&quot;&gt;diversity&lt;/a&gt; problem our community has.
  Next month (July 2016) there is a conference to talk with other Free Software people about
  &lt;a href=&quot;http://www.osfeels.com/&quot;&gt;Open Source &amp;amp; Feelings&lt;/a&gt; and I'm sure
  there is more going on out there.
&lt;/p&gt;
&lt;p&gt;
  What do you think about financing Free Software projects? Are you going to do
  something about making Free Software sustainable?
&lt;/p&gt;
&lt;p&gt;
  Yours truly, Henne 💚
&lt;/p&gt;
</description>
        <pubDate>Tue, 31 May 2016 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/free_people.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/free_people.html</guid>
        
        <category>community</category>
        
        
      </item>
    
      <item>
        <title>Mind the gap between platform and app</title>
        <description>&lt;p&gt;
  With the Open Source Event Manager (OSEM), one of the &lt;em&gt;Ruby on Rails&lt;/em&gt; apps I
  hack on, we're heading down the road to version 1.0. A feature we
  absolutely wanted to have, before making this step, was an easy deployment to at
  least one of the many &lt;em&gt;Platform as a Service&lt;/em&gt; (PaaS) providers. We deemed this
  important for two reasons:
&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    Before people commit to use your precious little app they want to try it. And
    this has to be hassle free.
  &lt;/li&gt;
  &lt;li&gt;
    Getting your server operating system ready to deploy Ruby on Rails applications can be
    tedious, too tedious for some people.
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
  So I have been working on making our app ready for &lt;a
  href=&quot;https://devcenter.heroku.com/&quot;&gt;Heroku&lt;/a&gt; which is currently the most
  popular PaaS provider for rails (is it?). This was an interesting road, this
  is my travelogue.
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;h2&gt;Storage in the public cloud&lt;/h2&gt;
&lt;p&gt;
  Storing files is incredibly easy in Rails, there are many ready made solutions
  for it like &lt;a href=&quot;https://github.com/thoughtbot/paperclip&quot;&gt;paperclip&lt;/a&gt;, &lt;a
  href=&quot;https://github.com/markevans/dragonfly&quot;&gt;dragonfly&lt;/a&gt; or &lt;a
  href=&quot;https://github.com/carrierwaveuploader/carrierwave&quot;&gt;carrierwave&lt;/a&gt;. The
  challenge with Heroku is, that on their free plan, your apps storage will be
  discarded the moment it is stopped or restarted. This happens for instance every
  time during a deployment or when the app goes to sleep because nobody is using
  it.
&lt;/p&gt;
&lt;p&gt;
  And even though it's easy to store files in Rails, we in the OSEM team have long
  discouraged this in our app. We rather try to make it as easy as possible to
  reference things you have shared somewhere else. Want to show a picture of your
  Events location? Use the ones you share on flickr or instagram anyway. Embed a
  video of a Talk? Just paste the Youtube or Vimeo link. Share the slides with
  your audience? Slideshare or Speakerdeck to the rescue!
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A picture of OSEMs commercial feature&quot; class=&quot;img-responsive img-rounded img-center&quot; src=&quot;/assets/posts/osem_commercials-78fb287deafe61657e12da959e1fa1efe3c4d49b03a67278889bebafc2e4aa3b.gif&quot;&gt;
  &lt;p class=&quot;img-license text-right&quot;&gt;
    OSEM commercials by Henne Vogelsang licensed
    &lt;a href=&quot;http://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
  Still there are some places left in our app where we upload pictures.
  Pictures we think conference organizers are not necessarily free to share on
  other platforms, like sponsor logos or pictures of sponsored lodgings. So to
  be able to use OSEM on Heroku our file upload needed support for offloading
  the files to someone else's computer a.k.a. *the cloud*. In the end I have
  settled for the carrierwave plug in of &lt;a
  href=&quot;http://cloudinary.com/&quot;&gt;cloudinary&lt;/a&gt; (&lt;a
  href=&quot;https://github.com/openSUSE/osem/pull/970&quot;&gt;pull request #970&lt;/a&gt;).
&lt;/p&gt;

&lt;p&gt;
  This means it's now as easy as configuring the &lt;a
  href=&quot;https://github.com/cloudinary/cloudinary_gem#configuration&quot;&gt;cloudinary
  gem&lt;/A&gt; and making use of their free plan to shove off all the storage OSEM
  needs to them.
&lt;/p&gt;

&lt;p&gt;
  Storage was the first gap in OSEM that I closed, another piece of the puzzle was
  configuration.
&lt;/p&gt;

&lt;h2&gt;Configuration in the environment&lt;/h2&gt;
&lt;p&gt;
  According to &lt;a href=&quot;http://12factor.net/config&quot;&gt;some clever people&lt;/a&gt; it's too easy to
  mistakenly check in your apps configuration file into your version control
  system. That's the reason your apps environment should provide all the settings.
  I'm &lt;strong&gt;not&lt;/strong&gt; a big fan of putting stickers onto microwaves that say you can't use
  it to dry your cat. If people want to be stupid, let them.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img src=&quot;https://media.giphy.com/media/frdn0r0hUXDTa/giphy.gif&quot; alt=&quot;Someone being stupid.&quot; class=&quot;img-responsive img-rounded img-center&quot;&gt;
&lt;/div&gt;

&lt;p&gt;
  But hey 12-Factor is a thing, let's roll with it! So in &lt;a
  href=&quot;https://github.com/openSUSE/osem/pull/900&quot;&gt;pull request #900&lt;/a&gt; I
  removed all traces of OSEMs YAML configuration file and now all the settings
  happen in environment variables.
&lt;/p&gt;

&lt;p&gt;
  This was the second gap I had to close to be able to run our app on Heroku. Now
  all of the sudden things where falling into place and some very interesting
  things emerged for OSEM.
&lt;/p&gt;

&lt;h2&gt;Continuous Deployment&lt;/h2&gt;
&lt;p&gt;
  One of the reasons I have gone down this road was to make it easy for people
  to try out OSEM. Now once you can run your app on Heroku you can also &lt;a
  href=&quot;https://devcenter.heroku.com/articles/github-integration&quot;&gt;integrate your
  github repository&lt;/a&gt; and run a continuous deployment (every commit get's
  deployed right away). That made it possible for us to set up an &lt;a
  href=&quot;http://demo.osem.io/&quot;&gt;OSEM demo instance&lt;/a&gt; for people to try which
  always runs the latest code. All we had to do is to make use of data from our
  test suite to populate the demo (&lt;a
  href=&quot;https://github.com/openSUSE/osem/pull/982&quot;&gt;pull request #982&lt;/a&gt;) and
  voila...
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A picture of OSEMs demo data&quot; class=&quot;img-responsive img-rounded img-center&quot; src=&quot;/assets/posts/osem_demo-cbcfad43d07f57055455a1952ec622f0a4c33a784895ac80a3639942d0a7d66e.jpg&quot;&gt;
  &lt;p class=&quot;img-license text-right&quot;&gt;
    OSEM demo by Henne Vogelsang licensed
    &lt;a href=&quot;http://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;Continuous Review&lt;/h2&gt;
&lt;p&gt;
  So a continuous deployment of the latest code with some sample data. Does that
  sound useful for you as free software developer? I think being a free
  software developer first and foremost means collaborating with varying people
  from all over. People I work with on a daily basis and people who I never had
  contact with before. Collaboration mostly means reviewing each others changes
  to our code. It's pretty easy as we have &lt;a
  href=&quot;https://github.com/openSUSE/osem/blob/master/CONTRIBUTING.md#how-to-contribute&quot;&gt;rules
  and tools&lt;/a&gt; for that in place. What is not so easy is to do the same for
  changes to the functionality, the user experience design, of our app.
&lt;/p&gt;
&lt;p&gt;
  In the OSEM team we some times attach a series of screenshots or animated gifs
  to a github pull requests to convey changes to the user interaction and work
  flows, but this is usually no replacement for trying yourself. Then in the
  middle of me doing all of this &lt;a
  href=&quot;https://blog.heroku.com/heroku-review-apps-ga&quot;&gt;Heroku
  Review Apps&lt;/a&gt; happened. Review apps are instant, disposable deployments of
  your app that spin up automatically with each pull request.
&lt;/p&gt;

&lt;div class=&quot;img&quot;&gt;
  &lt;img alt=&quot;A picture of OSEMs pipeline on heroku&quot; class=&quot;img-responsive img-rounded img-center&quot; src=&quot;/assets/posts/osem_heroku_pipeline-b286ee9802ecac558306061189c4a5d61167d5c3d2c65d05ee7f01ebe3ffab46.png&quot;&gt;
  &lt;p class=&quot;img-license text-right&quot;&gt;
    OSEM heroku pipeline by Henne Vogelsang licensed
    &lt;a href=&quot;http://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
  Now, once someone sends a pull request where I want to review the user
  experience design I just press the 'Create Review App' button on Heroku and a
  minute later I get the a temporary instance populated with test data. Magic.
&lt;/p&gt;

&lt;h2&gt;More things to come?&lt;/h2&gt;
&lt;p&gt;
  Another thing we might want to replace in the future is how we spin up
  developer instances. So far we use &lt;a
  href=&quot;https://github.com/openSUSE/osem/blob/master/CONTRIBUTING.md#runing-osem-for-development&quot;&gt;Vagrant&lt;/a&gt;
  which starts your OSEM checkout in a virtual machine. But nowadays you have to
  have &lt;a href=&quot;https://devcenter.heroku.com/articles/docker&quot;&gt;docker
  containers&lt;/a&gt; in the mix right? Let's see what the future brings.
&lt;/p&gt;
&lt;p&gt;
  All in all, I must say, it was a nice trip into the Platform as a Service
  world. Surprisingly easy to do and even more surprisingly rewarding for the
  development work flow. What do you think?
&lt;/p&gt;
</description>
        <pubDate>Wed, 04 May 2016 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/mind_the_gap.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/mind_the_gap.html</guid>
        
        <category>osem</category>
        
        
      </item>
    
      <item>
        <title>10 Tips for Mentoring #FreeSoftware Development</title>
        <description>&lt;p&gt;
  I believe that one of the most important tasks for a Free Software hacker is to
  bring new people with new perspectives, backgrounds and
  fresh ideas into the community. That's why I try to make contributing to my own projects as
  beginner friendly as possible, that's also the reason I frequently mentor
  people who take their first steps in developing Free Software with programs
  such as &lt;a href=&quot;https://developers.google.com/open-source/gsoc/&quot;&gt;Google's&lt;/a&gt;,
  or &lt;a href=&quot;http://railsgirlssummerofcode.org/&quot;&gt;Rails Girls Summer of Code&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
  Just recently I had the opportunity to implement a mentoring program
  (hey &lt;a href=&quot;http://101.opensuse.org/&quot;&gt;101&lt;/a&gt;)
  for one of the Free Software communities I'm participating in
  (hey &lt;a href=&quot;https://www.opensuse.org/&quot;&gt;openSUSE&lt;/a&gt;) together with a couple
  of friends (hey &lt;a href=&quot;https://github.com/ChrisBr/&quot;&gt;Chris&lt;/a&gt; &amp;amp;
   &lt;a href=&quot;http://blog.cornelius-schumacher.de/&quot;&gt;Cornelius&lt;/a&gt;).
  That adventure required me to think about what I find important
  about the whole process. I'd like to share those thoughts with you. Here are
  my 10 Tips for Mentoring Free Software development.
&lt;/p&gt;

&lt;div id=&quot;more&quot;&gt;&lt;/div&gt;

&lt;h2&gt;1. Put Your Mentee First&lt;/h2&gt;
&lt;p&gt;
  I believe in putting the mentee's needs first. When I mentor someone
  I'll make an extra effort to place myself in their position. Empathize!
  Understanding preferences, requirements and circumstances is important.
  I try hard to comprehend where the mentee comes from and what I need
  to do to get them to contribute to Free Software. Mentoring is about their,
  not about my needs, nor the project's I mentor for.
&lt;/p&gt;

&lt;h2&gt;2. Build a Relationship&lt;/h2&gt;
&lt;p&gt;
  The most important goal is that you build a relationship based on trust and
  respect with the mentee. Without this, I believe, everything else you'll do is
  in vein. Newcomers are overwhelmed and insecure about their skills and it's
  your job to take that fear from them. Because fear is the path to the dark
  side! It's the fun times together with you that will matter most to them later
  on, not so much what code fu-fu you have taught them.
&lt;/p&gt;
&lt;p&gt;
  Do not take this lightly. Relationships do not just happen, they need ongoing
  effort and attention, especially during the early stages. I find that the
  consistency of the relationship is what's most important. Talking as often
  as you can, finding a regular schedule where you meet and sticking to it is
  absolutely necessary, build a routine together.
&lt;/p&gt;

&lt;h2&gt;3. Be a Role Model&lt;/h2&gt;
&lt;img alt=&quot;A picture of a superman graffiti&quot; class=&quot;img-responsive img-rounded img-center&quot; src=&quot;/assets/posts/superman-228df14b7c2a8c77e10f7e30221b2dc2a0628a9aab4303c41193c9293bbd09c3.jpg&quot;&gt;
&lt;p class=&quot;img-license text-right&quot;&gt;
  &lt;a href=&quot;https://www.flickr.com/photos/birdwatcher63/5114732315/&quot;&gt;Superman&lt;/a&gt;
  by Brian Fuller licensed
  &lt;a href=&quot;https://creativecommons.org/licenses/by-nd/2.0/&quot;&gt;CC BY-ND 2.0&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  This might sound like a weird thing from the past and it makes most people
  uncomfortable but you need to be a role model for your mentee. Free Software
  development is as much about behavior in a community, knowing what you want,
  and the ability to convey this to others as it is about pointers, gcc macros
  and git command line options. You need to ensure that your mentee can follow
  your example and that you're not passing on your bad habits. You are
  responsible for developing the competence AND character of the mentee.
&lt;/p&gt;

&lt;h2&gt;4. Lead&lt;/h2&gt;
&lt;p&gt;
  Getting into Free Software development can be an overwhelming and daunting
  endeavor. Precise, reasonable and well-thought-out goals provide a path on which
  your mentee can take one step after the other into this strange new world.
  It's your duty that the goals and expectations for the project are actionable,
  fit your mentee's needs and are technically sound. You lead the way.
&lt;/p&gt;
&lt;h2&gt;5. Audit&lt;/h2&gt;
&lt;p&gt;
  I find it important to understand and communicate where the mentee is
  and how they progress. Setting up regular milestones that I review and
  we celebrate together provide the opportunity to check and correct
  the course.
&lt;/p&gt;
&lt;h2&gt;6. Applaud&lt;/h2&gt;
&lt;p&gt;
  As a grumpy German this is a tricky one for me. But anyhow, I think it's
  important to sharpen your senses for your mentee's personal achievements.
  You recall the excitement the first time you succeeded in setting up the
  development environment? Remember how invincible you felt once you finally got
  a hold of git? The time of your first merged pull-request? Now for you and me
  those things first happened a decade ago and all of this is just the daily
  grind. For the mentee it's super duper exiting. Make sure you recognize and
  acknowledge those achievements. Praise.
&lt;/p&gt;
&lt;blockquote&gt;
  “In the best, the friendliest and simplest relations flattery or praise is necessary, just as grease is necessary to keep wheels turning. ”
― Leo Tolstoy, War and Peace
&lt;/blockquote&gt;
&lt;h2&gt;7. Collaborate&lt;/h2&gt;
&lt;p&gt;
  Whatever challenge you face, remember you are not alone. You mingle on
  the shoulders of giants together with many other mentors. Make sure you share
  your experience, your ideas and your problems with them. All of you strive to
  reach the same goal: getting people into Free Software. Make sure you work
  together in an open, transparent and friendly manner as part of our worldwide
  community.
&lt;/p&gt;
&lt;h2&gt;8. Commit&lt;/h2&gt;
&lt;p&gt;
  Mentoring requires time, effort and endurance. It will cost you some
  evening you wanted to go out with your friends, at least a couple of thoughts every
  day and a lot of nerves because you explain things, that are obvious to
  you, over and over again. If you are not sure that you are willing to do
  this then it's probably better that you don't do it.
&lt;/p&gt;
&lt;p&gt;
  On the other hand mentoring will give you the satisfaction of being a
  positive influence in the life of someone else. You will see a new
  contributor grow into the Free Software community and you will achieve results
  that matter. You will also get the opportunity to learn  something together
  and sometimes even making a new friend for life.
&lt;/p&gt;
&lt;h2&gt;9. Adapt, be Agile&lt;/h2&gt;
&lt;img alt=&quot;A picture of a tree grwoing around a bicycle&quot; class=&quot;img-responsive img-rounded img-center&quot; src=&quot;/assets/posts/adapt-ee7c0bc8ab8463ff672d1375d89ef494edf7fcc8c81d918032477048ffd8216a.jpg&quot;&gt;
&lt;p class=&quot;img-license text-right&quot;&gt;
  &lt;a href=&quot;https://www.flickr.com/photos/sea-turtle/3463746437/&quot;&gt;Bike Tree&lt;/a&gt;
  by Sea Turtle licensed
  &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/2.0/&quot;&gt;CC BY-NC-ND 2.0&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  The only thing that is constant is change! You need to adapt your plan,
  milestones, time line, the technical details, your behavior and
  attitude during your time. Respond to change, help your mentee to do
  the same. Be open, courageous, and committed.
&lt;/p&gt;
&lt;h2&gt;10. Don't Follow My Advise, Form Your Own Opinion&lt;/h2&gt;
&lt;p&gt;
  All of this is just my opinion and there are many awesome resources about
  mentoring in general and about mentoring for Free Software development
  in particular out there. Don't trust me, inform yourself and make up
  your own opinion. Here are some pointers:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;a href=&quot;https://people.gnome.org/~federico/docs/summer-of-code-mentoring-howto/&quot;&gt;
      GNOME mentoring guidelines
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;https://community.kde.org/Mentoring&quot;&gt;
      KDE mentoring guidelines
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://en.flossmanuals.net/GSoCMentoring/&quot;&gt;
      Google Summer of Code Mentoring Guidelines
    &lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 16 Mar 2016 00:00:00 +0000</pubDate>
        <link>https://hennevogel.de/blog/those_who_cant_do.html</link>
        <guid isPermaLink="true">https://hennevogel.de/blog/those_who_cant_do.html</guid>
        
        <category>community</category>
        
        
      </item>
    
  </channel>
</rss>
