<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edoardo Tenani</title>
    <description>The latest articles on DEV Community by Edoardo Tenani (@endorama).</description>
    <link>https://dev.to/endorama</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30788%2F3a190615-d299-4bf0-a93d-69d18c88bb2c.jpeg</url>
      <title>DEV Community: Edoardo Tenani</title>
      <link>https://dev.to/endorama</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/endorama"/>
    <language>en</language>
    <item>
      <title>Remove yourself from the critical path</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Thu, 26 Jan 2023 21:14:33 +0000</pubDate>
      <link>https://dev.to/endorama/remove-yourself-from-the-critical-path-2k1f</link>
      <guid>https://dev.to/endorama/remove-yourself-from-the-critical-path-2k1f</guid>
      <description>&lt;p&gt;During one of my recent mentoring sessions, an interesting discussion started with my mentee. How do you manage being a leader with being hands-on too?&lt;/p&gt;

&lt;p&gt;If you have some experience in leading a group I suspect you faced the same issue at some point, maybe not with coding but for sure around the "I can't be one of the hands-on people anymore". I don't think this is necessarily true, but being hands-on and a great leader is a tough challenge and its practicality is heavily influenced by the environment around it.&lt;/p&gt;

&lt;p&gt;During our session the main issue were interruptions and meetings driving away time from focused work. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbqgrsld6lw5kr21hmvf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbqgrsld6lw5kr21hmvf.gif" alt="meetings!" width="498" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I there a way out of this? I don't know, but in my experience you can help yourself. The goal in this situation is to create space for deep work, chunks of time in which you expect no interruptions and no meetings. In which you can focus and do deep work.&lt;/p&gt;

&lt;p&gt;There are calendar blocking techniques that can be tried out, but that's like curing the symptoms and not the causes: if everybody needs you, you will never be able to get that focus time, because there will always be something requiring you attention.&lt;/p&gt;

&lt;p&gt;We can now agree that improving on this situation is hard, requires dedication and a lot of learning. Especially if you are moving from an individual contributor role to a team leading role, as you need to adjust your thinking and approach; you are now the one everybody else count on.&lt;/p&gt;

&lt;p&gt;My suggestion here would be: remove yourself from the critical path. Stop being the one everybody needs to go to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the critical path?
&lt;/h2&gt;

&lt;p&gt;Doing something, in a generic way, involves going from a Point A to a Point B. To move from A to B a series of steps are required. The critical path is that path from A to B that you &lt;strong&gt;cannot avoid&lt;/strong&gt; taking; is composed of those steps that are mandatory to move from A to B.&lt;/p&gt;

&lt;p&gt;Let's visualise this with some example. Let's say we are travelling from City A to City B. It doesn't matter which transport are we using, we will need to go through some physical places. And we hope there will be no accident, delay or impediment along our route, because that would slow us down. Or maybe we are taking a taxi, we hope there will be no slow downs as that will make the run more costly. Or maybe you need to study for an exam, so you will want to avoid getting sick, as that would reduce the time you have available for studying, making you risk to fail the exam.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;critical path&lt;/strong&gt; is the series of &lt;strong&gt;steps&lt;/strong&gt; that &lt;strong&gt;needs to be performed&lt;/strong&gt; to &lt;strong&gt;achieve&lt;/strong&gt; an objective. Any impediment in the critical path will make achieving the objective be &lt;strong&gt;more time consuming&lt;/strong&gt;, &lt;strong&gt;more costly&lt;/strong&gt; and/or &lt;strong&gt;not be ready for the deadline&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We can say that this critical path is &lt;strong&gt;the most important&lt;/strong&gt; element you want to watch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Am I in the critical path?
&lt;/h2&gt;

&lt;p&gt;This is a worthy question! How do you identify if you are in the critical path? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyauqrk85c3t62c3f0ys3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyauqrk85c3t62c3f0ys3.gif" alt="It doesn't make sense, Kronk showing a map in The Emperor new groove" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Does any of this happen to you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;other come to you for answers that they need to do their work&lt;/li&gt;
&lt;li&gt;only you have the knowledge needed by others&lt;/li&gt;
&lt;li&gt;you get interrupted frequently (by your reports, your peers or your manager)&lt;/li&gt;
&lt;li&gt;you need to take decisions and people depends on them, so they are blocked waiting for your decision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If yes &lt;strong&gt;you are in the critical path&lt;/strong&gt;. And now what?&lt;/p&gt;

&lt;p&gt;There are some strategies you may try to move away from it. Those strategies require time and trust as their main ingredients, as removing yourself from the critical path is &lt;strong&gt;all about delegation&lt;/strong&gt;. You need to learn how to delegate (a skill that you generally don't need as individual contributor), and the more effective you will be at it, the more effective your work as a manager.&lt;br&gt;&lt;br&gt;
The hard part of delegation is that is not about doing something, &lt;strong&gt;is about not doing&lt;/strong&gt; something. But that something has to happen anyway. Delegation is hard. Delegation involves trust. Trust is even harder. &lt;/p&gt;

&lt;p&gt;So how do you build trust? Here are some techniques. In the next examples I'll be using teacher and student as "the one that knows how to perform a task right now" and "the one that should learn how to perform a task in the future".&lt;/p&gt;

&lt;h3&gt;
  
  
  Shadowing
&lt;/h3&gt;

&lt;p&gt;Is there a task you do that someone else could do with some training? How do you deliver that training? Shadowing may be a solution. The student follows (or "shadows") the teacher while they perform the task. The goal is for the student to be independent in executing the task after a set period.&lt;/p&gt;

&lt;p&gt;Other literature is available, but I want to give some hints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define a deadline after which the shadowing period ends&lt;/li&gt;
&lt;li&gt;apply to task that may benefit from observation (es interviewing, meetings) but do not apply to heavy concept base tasks where a lot of prior knowledge is required&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pairing
&lt;/h3&gt;

&lt;p&gt;Do you have a knowledge-heavy task at hand that you would like to delegate but don't know how as it requires a lot of prior knowledge? In this case shadowing is probably not enough. Do pairing sessions, as in "code pairing" sessions, but for other topics.&lt;/p&gt;

&lt;p&gt;During those sessions select a driver and a writer. The driver direct how to do things, the writer executes. Exchange roles after some time. This is a great way to get to know the other person and build trust, while sharing knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proposal documents
&lt;/h3&gt;

&lt;p&gt;Do you have a task that needs some thinking, where multiple solutions needs to be explored and there is no clear solution? Delegate writing a proposal document and review it together. Going through a document has many benefits: it allows asynchronous communications, will last for future people ("verba volant, scripta manent" Latins used to say) and will provide for time and space to have an insightful conversation.&lt;/p&gt;

&lt;p&gt;Do remember to appoint a driver for the document, who will be in charge of moving from draft to the final decision. The driver does not have to be the one taking the decision too, on this subject there is a whole lot of literature, so go surfing!&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfalls
&lt;/h2&gt;

&lt;p&gt;Delegation does not come without its risks. Watch out for things that you don't want to happen, some of which I summarise below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6nwmzn0t0qlo1jpxr03m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6nwmzn0t0qlo1jpxr03m.gif" alt="Kronk pulling the wrong lever, Izma falling" width="498" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Not all tasks are the right candidate for delegation
&lt;/h3&gt;

&lt;p&gt;That task the CEO is really looking for and keeps you accountable for? Probably that's not the best task to delegate.&lt;/p&gt;

&lt;p&gt;Not all tasks can be delegated, but fortunately not all tasks have the same importance (as &lt;code&gt;impact * complexity *  urgency&lt;/code&gt;). Knowing which task to delegate is one of the hidden skills of great leaders. I think that for being great at it you need to remember that half of it is your judgement but the other half is the environment around you.&lt;/p&gt;

&lt;p&gt;Some tasks that may be good candidates are: any decision that can be reverted (from less expensive to most expensive to revert), any task outside of the critical path, any "nice to have".&lt;/p&gt;

&lt;p&gt;Another judgement method you can apply here is what you are aiming for: are you aiming for more personal focus time? Are you aiming to making sure the critical path does not have any impediment? Are you trying to upskill someone? Keep in mind your goal when delegating, as it affects your decisions.&lt;/p&gt;

&lt;p&gt;One framework to help here is the &lt;a href="https://en.wikipedia.org/wiki/Time_management#The_Eisenhower_Method" rel="noopener noreferrer"&gt;Eisenhower Matrix&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't setup people for failure
&lt;/h3&gt;

&lt;p&gt;If you remove yourself from critical paths but is not safe to do so or is not appropriate given your team health and competence, you are setting up people for failure. &lt;/p&gt;

&lt;p&gt;Failure brings pressure and frustration. Frustration leads to fear or anger. And we know how this ends, fear leads to the dark side. &lt;/p&gt;

&lt;p&gt;Over time people will get disengaged, they may even get mentally or physically sick due to the excessive burden and in the end leave the group (or company). Don't be that leader.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be okay with people failing!
&lt;/h3&gt;

&lt;p&gt;Have you ever done something for the first time? Like riding a bike, singing, studying a subject? Where you good at it? I bet not that much. &lt;/p&gt;

&lt;p&gt;When someone else will start doing something, in particular something you are used to do frequently, they will probably not be good at it. They are building &lt;strong&gt;their way&lt;/strong&gt; of doing it, and the only way for this to happen and to make them grow is to allow them to fail in a safe space. Your goal is to &lt;strong&gt;build the safe space&lt;/strong&gt;, not to prevent them from failing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be okay with having hard talks
&lt;/h3&gt;

&lt;p&gt;People you delegate to will not do everything right. As &lt;strong&gt;you&lt;/strong&gt; will be responsible for the outcome, you need to learn to have hard conversations. &lt;/p&gt;

&lt;p&gt;You need to learn how to talk about issues, missteps and errors. My advise is to learn how to be emphatetic, respectful and transparent. We tend to associate negative feedback with something bad, but learning how to give negative feedback in a human and constructive way is a golden skill, it build trust.&lt;/p&gt;

&lt;p&gt;If you think this is hard, consider the alternative: everything will be great until it won't be anymore, the number of wrong things will probably be too much and you will have way worst conversations to have.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stop thinking about the effort, start thinking about the outcome
&lt;/h3&gt;

&lt;p&gt;When people in your team feel safe and empowered they will do awesome things together. A team &lt;strong&gt;is more than the sum of its components&lt;/strong&gt;. &lt;strong&gt;Your team&lt;/strong&gt; will be more resilient, more effective. &lt;strong&gt;You&lt;/strong&gt; will be more resilient and more effective.&lt;/p&gt;




&lt;p&gt;As leaders, leading other people is a challenge but will give back many rewards if you're committed to improve and clearly show that you care for people.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post first appeared on my blog, at &lt;a href="https://endorama.dev/2023/remove-yourself-from-the-critical-path/" rel="noopener noreferrer"&gt;https://endorama.dev/2023/remove-yourself-from-the-critical-path/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mentorship</category>
      <category>leadership</category>
      <category>delegation</category>
    </item>
    <item>
      <title>Golang divisions</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Mon, 19 Sep 2022 19:27:07 +0000</pubDate>
      <link>https://dev.to/endorama/golang-divisions-1nm6</link>
      <guid>https://dev.to/endorama/golang-divisions-1nm6</guid>
      <description>&lt;p&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@chrisliverani?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Chris Liverani&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At work today I read a piece of code in Golang that got me curious:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;maxQuerySize&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;
&lt;span class="c"&gt;// metricDataQueries is user provided&lt;/span&gt;
&lt;span class="n"&gt;sliceLength&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metricDataQueries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;maxQuerySize&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="c"&gt;// what's the value of sliceLength?&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;sliceLength&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="n"&gt;whatever&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a simple integer division, but the result is then used as a parameter to the for loop.&lt;br&gt;
Integer division has a drawback, that can create a bug in this case: the remainder, as &lt;code&gt;float&lt;/code&gt; in for loop declarations are supported only if no truncation happens when converting to &lt;code&gt;int&lt;/code&gt; (i.e. &lt;code&gt;10.0&lt;/code&gt; works, &lt;code&gt;10.1&lt;/code&gt; don't).&lt;/p&gt;

&lt;p&gt;How does Go handle this? The answer is as simple as it gets: remainder is ignore and the result is the quotient. The reason why this happens is explained in Go specs, under &lt;a href="https://go.dev/ref/spec#Constant_expressions"&gt;Constant expressions&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any other operation on untyped constants results in an untyped constant of the same kind; that is, a boolean, integer, floating-point, complex, or string constant. If the untyped operands of a binary operation (other than a shift) are of different kinds, the result is of the operand's kind that appears later in this list: integer, rune, floating-point, complex.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which means that to have "true" division you need to convert &lt;em&gt;at least one argument&lt;/em&gt; to &lt;code&gt;float&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;10.0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2.0&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;10.0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2.0&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// float&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// float&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// float&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// int&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://go.dev/play/p/UfjOH9rGIAi"&gt;go.dev/play&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Doing integer division effectively "floors" the result of the operation. What if we want the ceil of it?&lt;/p&gt;

&lt;p&gt;Go &lt;code&gt;math&lt;/code&gt; package has &lt;a href="https://pkg.go.dev/math#Ceil"&gt;&lt;code&gt;Ceil(x float64) float64&lt;/code&gt;&lt;/a&gt; for this, which implies doing a "true" division and applying &lt;code&gt;Ceil&lt;/code&gt; on the result.&lt;/p&gt;

&lt;p&gt;All of this was not really surprising, but it's cool to see this being implemented in a very ergonomic way. &lt;/p&gt;

&lt;p&gt;Just a note: if you want to get a float value you must convert to &lt;code&gt;float&lt;/code&gt; division arguments &lt;strong&gt;before&lt;/strong&gt; the division.&lt;/p&gt;

&lt;p&gt;Do this: &lt;code&gt;float64(2) / float64(10) // 0.2&lt;/code&gt; and &lt;strong&gt;not&lt;/strong&gt; this: &lt;code&gt;a := float64(2 / 10) // 0&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>math</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>asdf, little awesome tool</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Wed, 17 Aug 2022 21:46:30 +0000</pubDate>
      <link>https://dev.to/endorama/asdf-little-awesome-tool-2gdm</link>
      <guid>https://dev.to/endorama/asdf-little-awesome-tool-2gdm</guid>
      <description>&lt;p&gt;Some years ago I discovered a little tool with a huge potential. I started using it and since then it proved useful in so many ways it's now a mandatory tool in my toolset.&lt;/p&gt;

&lt;p&gt;This tool is &lt;a href="https://asdf-vm.com/"&gt;&lt;code&gt;asdf&lt;/code&gt;&lt;/a&gt;. &lt;code&gt;asdf&lt;/code&gt; is a CLI tool version manager. You may already be using multiple ones (&lt;code&gt;rbenv&lt;/code&gt;, &lt;code&gt;nvm&lt;/code&gt;, &lt;code&gt;goenv&lt;/code&gt; to name a few) to manage versions of programming language tooling and accessories.&lt;/p&gt;

&lt;p&gt;Having multiple tools for this purposes creates a series of disadvantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setting up your workstation is more painful (multiple tools to install, multiple versions to manage); this become more complex when you work in a team and want to provide a great onboarding experience&lt;/li&gt;
&lt;li&gt;adopting a new tool force you to first search for a dedicated version manager, then install the tool (you may go without one, but that's going to bite your future self)&lt;/li&gt;
&lt;li&gt;how to share the same version in all environments, in particular dev and CI? Was that file &lt;code&gt;.go-version&lt;/code&gt;, &lt;code&gt;.golang-version&lt;/code&gt;? Each tool uses it's own convention, sometimes they align but having a consistent experience is not in their DNA;&lt;/li&gt;
&lt;li&gt;what's the command again? Each tool may have different CLI commands, making switching between them a pain; this may happen more easily if you're in a team;&lt;/li&gt;
&lt;li&gt;remember the &lt;a href="https://www.reddit.com/r/programming/comments/p1j1c/tabs_vs_spaces_vs_both/"&gt;Good Old Times™ of “spaces VS tabs”&lt;/a&gt;? Well, why start a 🔥 war around which tool to use?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's summarise why &lt;code&gt;asdf&lt;/code&gt; is ground breaking: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;helps developer onboarding across a wide set of tool;&lt;/li&gt;
&lt;li&gt;helps team collaborating;&lt;/li&gt;
&lt;li&gt;removes useless discussion drive by preference;&lt;/li&gt;
&lt;li&gt;has a consistent UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Would that be enough? NO 😜&lt;/p&gt;

&lt;p&gt;It delivers more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://asdf-vm.com/plugins/create.html"&gt;creating plugins&lt;/a&gt; is &lt;strong&gt;so easy&lt;/strong&gt; you can just add whatever you want (I did it &lt;a href="https://github.com/endorama/asdf-desk"&gt;here&lt;/a&gt;, &lt;a href="https://github.com/endorama/asdf-goreleaser"&gt;here&lt;/a&gt;, &lt;a href="https://github.com/endorama/asdf-envchain"&gt;here&lt;/a&gt; and &lt;a href="https://github.com/endorama/asdf-envchain"&gt;here&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;creating plugins is most probably not needed because what you need is &lt;strong&gt;already available&lt;/strong&gt;; &lt;a href="https://github.com/asdf-community"&gt;&lt;code&gt;asdf-community&lt;/code&gt;&lt;/a&gt; has 60 repositories (so around 60 plugins), just a &lt;code&gt;asdf plugin-add&lt;/code&gt; away;&lt;/li&gt;
&lt;li&gt;are we forgetting the CI? Hell no! Note that this only works if you are using GitHub Actions, but if that's the case there are &lt;a href="https://github.com/asdf-vm/actions"&gt;actions ready to be used&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In case you don't want to use the install action provided by the asdf community because it does not leverages other optimized setup actions, I developed an action that parses the &lt;code&gt;.tool-versions&lt;/code&gt; file extracting each tool version so they can then be reused in other actions. No &lt;code&gt;asdf&lt;/code&gt; needed!&lt;br&gt;&lt;br&gt;
This action is available &lt;a href="https://github.com/endorama/asdf-parse-tool-versions"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you reached this line, &lt;strong&gt;STOP&lt;/strong&gt; right here and &lt;a href="https://asdf-vm.com/guide/getting-started.html"&gt;go install&lt;/a&gt; &lt;code&gt;asdf&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cli</category>
      <category>team</category>
      <category>developertools</category>
    </item>
    <item>
      <title>URI, URL, URN?? Identifying resources on the web</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Thu, 21 Jul 2022 08:14:24 +0000</pubDate>
      <link>https://dev.to/endorama/uri-url-urn-identifying-resources-on-the-web-ebc</link>
      <guid>https://dev.to/endorama/uri-url-urn-identifying-resources-on-the-web-ebc</guid>
      <description>&lt;p&gt;&lt;em&gt;Cover image by &lt;a href="https://unsplash.com/@cifilter?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Shannon Potter&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you do web development you will, at some point, encounter 3 particular term: URI, URL and URN (this is not so familiar but you may have encountered ARNs in AWS).&lt;br&gt;
You may also have seen URI and URL being used interchangeably, but it's important to note they are not the same thing even if they are used for very similar purposes: finding things and finding things on the internet.&lt;/p&gt;

&lt;p&gt;Let's break down what do those acronyms mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URI stands for Uniform Resource Indicator&lt;/li&gt;
&lt;li&gt;URL stands for Uniform Resource Locator&lt;/li&gt;
&lt;li&gt;URN stands for Uniform Resource Name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;URLs and URNs are specific classifications of URIs.&lt;br&gt;&lt;br&gt;
It happens that URIs are very different between each other (from &lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-1.1.2"&gt;rfc3986#section-1.1.2&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ftp://ftp.is.co.za/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one
mailto:John.Doe@example.com
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow me in a deep dive into URIs, URLs and URNs and some good old RFC digging. Put on your safety 🥽, grab your ⛏ and let's go!!&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a URI
&lt;/h2&gt;

&lt;p&gt;A Uniform Resource Identifier is a generic way to uniquely identify any resource. &lt;/p&gt;

&lt;p&gt;The complete definition is in &lt;a href="https://datatracker.ietf.org/doc/html/rfc3986"&gt;RFC 3986&lt;/a&gt;, where you can hunt for all the details.&lt;/p&gt;

&lt;p&gt;It takes the form of a string with this syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are 5 components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.1"&gt;&lt;code&gt;scheme&lt;/code&gt;&lt;/a&gt; (required), arbitrary but there are popular ones like &lt;code&gt;mailto&lt;/code&gt;, &lt;code&gt;https&lt;/code&gt;, &lt;code&gt;ftp&lt;/code&gt; or &lt;code&gt;arn&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2"&gt;&lt;code&gt;authority&lt;/code&gt;&lt;/a&gt; (optional), for user information and top level namespace (usually a domain or IP address) with the syntax&lt;br&gt;
&lt;code&gt;authority   = [ userinfo "@" ] host [ ":" port ]&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1"&gt;&lt;code&gt;userinfo&lt;/code&gt;&lt;/a&gt; (optional); either a &lt;code&gt;username&lt;/code&gt; or a &lt;code&gt;username&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; concatenated by &lt;code&gt;:&lt;/code&gt; (&lt;code&gt;username:password&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"&gt;&lt;code&gt;host&lt;/code&gt;&lt;/a&gt; (required), can be a domain or an IPv4/IPV6&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3"&gt;&lt;code&gt;port&lt;/code&gt;&lt;/a&gt; (optional)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"&gt;&lt;code&gt;path&lt;/code&gt;&lt;/a&gt; (required but can be empty - you know, parsers 🤷), a hierarchical structure separated by &lt;code&gt;/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"&gt;&lt;code&gt;query&lt;/code&gt;&lt;/a&gt; (optional), it &lt;strong&gt;starts&lt;/strong&gt; with &lt;code&gt;?&lt;/code&gt; and can contain &lt;code&gt;?&lt;/code&gt; and &lt;code&gt;/&lt;/code&gt; (like &lt;code&gt;path&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"&gt;&lt;code&gt;fragment&lt;/code&gt;&lt;/a&gt; (optional), it starts with &lt;code&gt;#&lt;/code&gt; until the end of the URI&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is quite convoluted and the RFC is incredibly detailed. The &lt;a href="https://en.wikipedia.org/wiki/Uniform_Resource_Identifier"&gt;Wikipedia page for URI&lt;/a&gt; helps!&lt;/p&gt;

&lt;p&gt;It's important to understand the URI as it's the foundation on which URL and URN are based.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a URL
&lt;/h2&gt;

&lt;p&gt;The Uniform Resource Locator is a string representation to for a resource available via the Internet.&lt;/p&gt;

&lt;p&gt;It has it's own RFC, &lt;a href="https://datatracker.ietf.org/doc/html/rfc1738"&gt;RFC 1738&lt;/a&gt;, where we find all the familiar names and strings we see as Web developers.&lt;/p&gt;

&lt;p&gt;It defines some specific schemas we all know and love:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   ftp                     File Transfer protocol
   http                    Hypertext Transfer Protocol
   gopher                  The Gopher protocol
   mailto                  Electronic mail address
   news                    USENET news
   nntp                    USENET news using NNTP access
   telnet                  Reference to interactive sessions
   wais                    Wide Area Information Servers
   file                    Host-specific file names
   prospero                Prospero Directory Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(wait, what is &lt;code&gt;wais&lt;/code&gt;??? Think I'm too young for that!)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;and it defines the usual "Internet" scheme syntax for all URLs schemes that involve usage of an IP-based protocol:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/&amp;lt;url-path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm young enough that I basically only used &lt;code&gt;ftp&lt;/code&gt;, &lt;code&gt;http&lt;/code&gt; and &lt;code&gt;mailto&lt;/code&gt;! (And well.. &lt;a href="https://dev.to/kasuken/how-to-watch-star-wars-in-your-terminal-523c"&gt;watching Star Wars over &lt;code&gt;telnet&lt;/code&gt;&lt;/a&gt; 😆) Did you use some of the others? Let me know in the comment, I want to read your story!!&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a URN
&lt;/h2&gt;

&lt;p&gt;Quite simply, it's a URI with the &lt;code&gt;urn&lt;/code&gt; scheme. URNs are &lt;strong&gt;location indipendent&lt;/strong&gt; and &lt;strong&gt;persistent&lt;/strong&gt; identifiers. &lt;/p&gt;

&lt;p&gt;This means there is only 1 unique URN for a given resource in a given namespace &lt;strong&gt;forever&lt;/strong&gt; (or until that resource doesn't exist any more).&lt;/p&gt;

&lt;p&gt;URNs are defined by &lt;a href="https://datatracker.ietf.org/doc/html/rfc8141"&gt;RFC 8141&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Their properties of being &lt;strong&gt;location indipendent&lt;/strong&gt; and &lt;strong&gt;persistent&lt;/strong&gt; makes them useful for some very interesting use cases, especially.&lt;/p&gt;

&lt;p&gt;Their syntax definition (&lt;a href="https://datatracker.ietf.org/doc/html/rfc8141#section-2"&gt;rfc8141#section-2&lt;/a&gt;) is quite more complex, here a simplified version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;URN = "urn" ":" NID ":" NSS [ "?+" r-component ] [ "?=" q-component ] [ "#" f-component ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more easily akin to a URI with multiple components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;urn&lt;/code&gt; is the &lt;code&gt;scheme&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc8141#section-2.1"&gt;&lt;code&gt;NID&lt;/code&gt;&lt;/a&gt; (required), the namespace identifier&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc8141#section-2.2"&gt;&lt;code&gt;NSS&lt;/code&gt;&lt;/a&gt; (required), the namespace specific string&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc8141#section-2.3.1"&gt;&lt;code&gt;r-component&lt;/code&gt;&lt;/a&gt; (optional), query parameters to pass to URL resolution services, note that it's used is &lt;em&gt;discouraged&lt;/em&gt;: "Thus, r-components SHOULD NOT be used for URNs before their semantics have been standardized."&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc8141#section-2.3.2"&gt;&lt;code&gt;q-component&lt;/code&gt;&lt;/a&gt; (optional), query parameters for the named resource or the service supplying the named resource&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc8141#section-2.3.3"&gt;&lt;code&gt;f-component&lt;/code&gt;&lt;/a&gt; (optional), a fragment representing the location or region for the named resource, ignored during URN equivalence operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should be noted that a &lt;a href="https://datatracker.ietf.org/doc/html/rfc8141#section-7.2"&gt;public registry for URNs namespaces exists&lt;/a&gt;, and is &lt;a href="https://www.iana.org/assignments/urn-namespaces/urn-namespaces.xhtml"&gt;maintained at IANA&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Does it mean you need to register a namespace before using it? No if you plan to use it internally, yes if you want it to be internet-global (like &lt;a href="https://www.rfc-editor.org/rfc/rfc4854.html"&gt;&lt;code&gt;xmpp&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://www.rfc-editor.org/rfc/rfc4122.html"&gt;&lt;code&gt;uuid&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So cool but where to use them?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS
&lt;/h3&gt;

&lt;p&gt;If you have experience with &lt;a href="https://aws.amazon.com/"&gt;Amazon Web Services&lt;/a&gt; you will have encountered ARNs: &lt;a href="https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html"&gt;Amazon Resource Names&lt;/a&gt;. By their definition:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Amazon Resource Names (ARNs) uniquely identify AWS resources. We require an ARN when you need to specify a resource unambiguously across all of AWS, such as in IAM policies, Amazon Relational Database Service (Amazon RDS) tags, and API calls.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sounds familiar? The format too is very URN-like (there are different formats, look at the docs!):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arn:partition:service:region:account-id:resource-type/resource-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the look of it it does not seem to be a RFC-compliant URN, but it's extremely similar.&lt;/p&gt;

&lt;h3&gt;
  
  
  GCP
&lt;/h3&gt;

&lt;p&gt;Google Cloud Platform relies on URIs to identify resources on the platform.&lt;/p&gt;

&lt;p&gt;(Resources names](&lt;a href="https://cloud.google.com/apis/design/resource_names"&gt;https://cloud.google.com/apis/design/resource_names&lt;/a&gt;) are schema-less URIs similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;logging.googleapis.com/projects/myproject123/locations/global/buckets/my-bucket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;logging.googleapis.com&lt;/code&gt; is the &lt;code&gt;authority&lt;/code&gt;, the &lt;code&gt;path&lt;/code&gt; the resource. Being the &lt;code&gt;path&lt;/code&gt; hierarchical is possible to represent GCP resource structure this way (project -&amp;gt; collection -&amp;gt; resource).&lt;/p&gt;

&lt;h3&gt;
  
  
  LinkedIn
&lt;/h3&gt;

&lt;p&gt;Another at-scale example is &lt;a href="https://docs.microsoft.com/en-us/linkedin/shared/api-guide/concepts/urns?view=li-lms-2022-07"&gt;LinkedIn&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;URNs are used to represent foreign associations to an entity (persons, organizations, and so on) in an API. A URN is a string-based identifier with the format:&lt;br&gt;
&lt;code&gt;urn:{namespace}:{entityType}:{id}&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Express foreign keys
&lt;/h3&gt;

&lt;p&gt;Simple relational database design generally rely on (autoincrementing) &lt;code&gt;int&lt;/code&gt; for rows IDs in tables. This system is effective and works in a single database scenario. &lt;/p&gt;

&lt;p&gt;When scaling to multiple DBs or distributed applications (es microservices) using integers is not enough anymore. Some common problems are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;conflicting autoincrementing numbers: being auto incremental they are exposed to possible race conditions when creating records&lt;/li&gt;
&lt;li&gt;too generic: the system (or it's operators) is not able to know only by looking at the ID what kind of resource that ID refers to. If you think is not that important, Atlassian recently &lt;a href="https://www.atlassian.com/engineering/post-incident-review-april-2022-outage"&gt;blew up 883 customer's websites&lt;/a&gt; due to a similar confusion: a script included IDs for websites and not apps in the Atlassian backend ecosystem. Those IDs were then used for deletion, but the thing deleted wasn't, as expected, the customer app instance but their entire website. &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Do you have any other examples of URNs being used in systems? I'm curious to know about them so please let me know in the comments!&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>webdev</category>
      <category>development</category>
      <category>learning</category>
    </item>
    <item>
      <title>Coordination does not scale</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Tue, 02 Nov 2021 11:38:29 +0000</pubDate>
      <link>https://dev.to/endorama/coordination-does-not-scale-394e</link>
      <guid>https://dev.to/endorama/coordination-does-not-scale-394e</guid>
      <description>&lt;p&gt;It's monday. You wake out and reach the office (which may very well be your sofa given the current times), turn on your laptop and open your email software.&lt;br&gt;
One of them catches your attention; the title reads "New company wide Project Management tool".&lt;/p&gt;

&lt;p&gt;A chill goes down your spine. "Make it be not Jira" is the first thought as you open the email.&lt;/p&gt;

&lt;p&gt;Feels familiar? I guess everyone had a similar moment in their professional career.&lt;/p&gt;

&lt;p&gt;I've had the pleasure to follow the rollout and administrate an Atlassian Jira Cloud instance for a couple of years for a small company, and I don't think I have fully recovered yet. The complexity hidden behind that subscription is massive.&lt;/p&gt;

&lt;p&gt;After self-reflection, my question is: was it Jira's fault? Is the tool to blame for the complexity of the resulting process and the effort it required just to use it for day to day work? Would another tool change the outcome?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It seems it's the tool that matters, but it's not. It's the context around the tool that matters.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a perspective from an ex-DevOps working for a product company.&lt;br&gt;
This post is not about Jira. Far from being perfect but you'll never be happy using a hammer when you need a screwdriver.&lt;/p&gt;

&lt;p&gt;This post is about the fundamental wrong assumption we make when searching for a project management tool.&lt;/p&gt;

&lt;p&gt;The first interesting question is: why do we need a project management tool?&lt;br&gt;
The answer I've seen in the wild is that coordinating the work in progress becomes too difficult, and this complexity is blamed on the tooling being missing or not adequate (i.e. different or fragmented usage, missing items, lack of visibility or adoption).&lt;/p&gt;

&lt;p&gt;The supposed benefit of a Project Management tool are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;coordination, defined as being able to make plans on top of other groups activities/plannings&lt;/li&gt;
&lt;li&gt;consistency, defined as being able to move easily across groups/teams with a small overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you are not going to achieve consistency, and once that promise is broken, good luck obtaining coordination. More interesting, coordination may not be what you need at all.&lt;/p&gt;

&lt;p&gt;First, let's examine consistency. I've yet to see two teams (or people) use the same tool in the same way. It doesn't matter how far the teams are, even in the same company.&lt;br&gt;
Most of the time, the usage is so different that they could be two different, not interoperable tools, and the complexity would be the same.&lt;br&gt;
Consistency requires a massive effort in understanding, coordination, enforcement. Such effort does not scale and is so rigid that you risk being paralysed by it.&lt;/p&gt;

&lt;p&gt;Do we really need consistency? &lt;strong&gt;No&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We strive for consistency because we expect it to drive better collaboration. And we struggle so much trying to be consistent that our work becomes keeping the consistency.&lt;/p&gt;

&lt;p&gt;I would argue that once you reach proper consistency, the one-size-fits-all approach resulting from it would be a terrible product management take. (Remember it is a product company, not a consultancy).&lt;br&gt;
The one-size-fits-all does not work because software development is knowledge work. It implies learning, continuously. It implies adapting.&lt;/p&gt;

&lt;p&gt;We know that knowledge work requires "&lt;a href="https://www.calnewport.com/blog/2012/11/21/knowledge-workers-are-bad-at-working-and-heres-what-to-do-about-it/"&gt;deep work&lt;/a&gt;", defined as long slots of uninterrupted focus work time. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Deep Work Hypothesis.&lt;/strong&gt;&lt;br&gt;
Deep work is becoming increasingly valuable at the same time that it’s becoming increasingly rare. Therefore, if you cultivate this skill, you’ll thrive.&lt;br&gt;
&lt;em&gt;Cal Newport in &lt;a href="https://www.calnewport.com/blog/2015/11/20/deep-work-rules-for-focused-success-in-a-distracted-world/"&gt;Deep Work: Rules for Focused Success in a Distracted World&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t6kwMMOP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://images.unsplash.com/photo-1453728013993-6d66e9c9123a%3Fixid%3DMnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8%26ixlib%3Drb-1.2.1%26auto%3Dformat%26fit%3Dcrop%26w%3D1740%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t6kwMMOP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://images.unsplash.com/photo-1453728013993-6d66e9c9123a%3Fixid%3DMnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8%26ixlib%3Drb-1.2.1%26auto%3Dformat%26fit%3Dcrop%26w%3D1740%26q%3D80" alt="landscape with focused center through photographic lens" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The recent remote work explosion made clear something that remote companies already knew: focus work drives productivity (and revenue).&lt;br&gt;
If we already trust people to plan work and execute through long focused time slots, why don't we trust teams to do the same?&lt;/p&gt;

&lt;p&gt;It's time to go back to the drawing board and review the question that brought us here. The question we should start from is "how do we deliver better software?". &lt;br&gt;
We know some coordination is needed and we know focus is needed.&lt;br&gt;
So why don't we focus on making coordination &lt;em&gt;easier&lt;/em&gt; instead of making it &lt;em&gt;consistent&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;What does consistency even mean in a fast-paced context like software development? There is an industry focus on being agile to respond to changes, but coordination makes reacting to change more difficult and expensive.&lt;/p&gt;

&lt;p&gt;What to do instead? Incidentally, we can take inspiration from the same field we are in. Software Engineers developed ways to make it easier for different code created in isolation to work once it is put all together.&lt;/p&gt;

&lt;p&gt;We use testing, decoupling, interfaces and APIs. Those are our tools to build incredibly complex and interconnected systems.&lt;/p&gt;

&lt;p&gt;Then why don't we apply the same principles to coordinating work? (Spoiler: hyperscalers do).&lt;br&gt;
We can derive that it is not coordination that is important, but boundaries and understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundaries&lt;/strong&gt;: once I start thinking about what a dependency should do to fulfil a need I have, I stop worrying about my work and start worrying about someone else’s work. Boundaries drive &lt;strong&gt;Expectations&lt;/strong&gt;: if I know I cannot directly influence something, I will need to find ways to integrate with more generalist approaches.&lt;br&gt;
&lt;strong&gt;Understanding&lt;/strong&gt;: no system can talk to another without mutual protocols that both systems understand. No teams can work together without mutual understanding and building shared processes.&lt;/p&gt;

&lt;p&gt;Defining boundaries and understanding others can be only fulfilled through communication. Any communication protocol (in use by humans or machines) adds overhead to the conversation (why is the Lora protocol preferred over TCP/IP in IoT? Lower overhead)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Being a generalist and understating others requires communicating, which creates overhead, like any communication protocol.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Any form of collaboration has overhead. Your Project Management tool of choice will have overhead, probably hidden behind all the marketing. &lt;/p&gt;

&lt;p&gt;But we have a North Star to drive us, we want to &lt;strong&gt;build better software&lt;/strong&gt;.&lt;br&gt;
We cannot answer only considering costs (collaboration overhead) we have to consider quality.&lt;br&gt;
Boundaries and understanding drive quality.&lt;/p&gt;

&lt;p&gt;You will adopt a Project Management tool. But do not use it for coordination, use it to empower teams within themselves.&lt;/p&gt;

&lt;p&gt;Coordination is not the forcing function you want your employee to spend time on. Instead, engage teams to define boundaries and create space to understand each other.&lt;/p&gt;

&lt;p&gt;In the end, we want &lt;a href="https://twitter.com/shreyas/status/1326199111058481152"&gt;better software for better products to better serve our customers&lt;/a&gt; in an ever changing landscape. Your silver bullets are empowered teams working towards the same goals.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover photo by &lt;a href="https://unsplash.com/@myleon?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Leon&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/project-manager?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Inline photo by &lt;a href="https://unsplash.com/@pawelskor?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Paul Skorupskas&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/focus-camera?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hey 👋 I'm Edoardo. I've been a DevOps and started digging into processes and what does it mean to improve software delivery within a company. Reading and listening creates opinion, and I'd like to discuss them with anyone interested! Join the conversation and let me know what you think in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>management</category>
      <category>business</category>
    </item>
    <item>
      <title>How Stripe is actioning the osquery API at scale [osquery@scale]</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Fri, 16 Oct 2020 16:02:53 +0000</pubDate>
      <link>https://dev.to/endorama/how-stripe-is-actioning-the-osquery-api-at-scale-osquery-scale-4j5e</link>
      <guid>https://dev.to/endorama/how-stripe-is-actioning-the-osquery-api-at-scale-osquery-scale-4j5e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;OSquery is an operating system instrumentation framework for Windows, OS X (macOS), Linux, and FreeBSD. The tools make low-level operating system analytics and monitoring both performant and intuitive.&lt;br&gt;
&lt;em&gt;From &lt;a href="https://www.osquery.io/"&gt;osquery&lt;/a&gt; website&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I recently watched this talk from &lt;a href="https://www.osqueryatscale.com/"&gt;osquery@scale&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My interest in OSquery started some years ago, as the premises are super cool: convert your system in a SQL database you can query with usual SQL syntax.&lt;br&gt;&lt;br&gt;
This integrates very well with standard data analytics tooling and process, so is a powerful way to gather data at scale for review, analysis and alerting.&lt;/p&gt;

&lt;p&gt;Want to know which processes are executing on a machine? Or how many users there are? Any intrusion detection rule you want to check?&lt;br&gt;
✔ OSquery can do this, and &lt;a href="https://osquery.readthedocs.io/en/stable/"&gt;a lot more&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As such I was really interested in how OSquery can is leveraged in the real world for security monitoring at scale.&lt;/p&gt;

&lt;p&gt;The talk present how OSquery fits into a global scale security effort both at laptop and server level. Highly rewarding!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/-9BfXMYn0wk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Presenter: &lt;a href="https://www.linkedin.com/in/matthew-kemelhar-69058723"&gt;https://www.linkedin.com/in/matthew-kemelhar-69058723&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Challenge at scale: creating a security ecosystem where OSquery is a critical component&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every environment has different tools, sensors, logs and storage&lt;/li&gt;
&lt;li&gt;most tools have &lt;strong&gt;their&lt;/strong&gt; GUI and query language&lt;/li&gt;
&lt;li&gt;OSquery usage of SQL relates easily to other business flow that have analytics value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that needs to play together with other elements. OSquery is a piece of Security @ Stripe.&lt;/p&gt;

&lt;p&gt;3 goals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;eliminate need to recreate detection logic for different tools&lt;/li&gt;
&lt;li&gt;enable other teams who need information without access to security tools&lt;/li&gt;
&lt;li&gt;centralize methodology for detection that everyone can activate without access to all machines and with reduced skill-set (less to learn = more effective)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OSquery on laptop managed using Chef, where logs are collected.&lt;br&gt;
OSquery on servers managed by puppet, queries pushed through puppet and logs are stored in AWS S3 forwarded to Splunk.&lt;/p&gt;

&lt;p&gt;Design criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generalize security for our environment&lt;/li&gt;
&lt;li&gt;extensible framework&lt;/li&gt;
&lt;li&gt;detection logic agnostic from tooling&lt;/li&gt;
&lt;li&gt;skills required: Python and SQL&lt;/li&gt;
&lt;li&gt;easy to collect metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Taking a practice from Data Science, they started using Jupiter Notebooks, writing libraries that codified the logic. They have a centralized notebook server (sensitive information can be protected) and use GitHub repos (collaborative peer review).&lt;/p&gt;

&lt;p&gt;OSquery is cool but get better &lt;strong&gt;when you can correlate&lt;/strong&gt; other data.&lt;/p&gt;

&lt;p&gt;The second part of the presentation is about how to detect meaningful events and reduce alert fatigue.&lt;/p&gt;

&lt;p&gt;They started building a baseline (average size of CLI commands) to detect anomalies. Grab data in a timeframe and decorate them.&lt;br&gt;
Once you have a baseline, detecting anomalies is easier.&lt;/p&gt;

&lt;p&gt;They created a repo with classified attack stages (loosely based on the MITRE Attack framework) and extended to include custom detections. This allow to provide README as mini-runbooks for specific detection groups. (&lt;a href="https://youtu.be/-9BfXMYn0wk?t=1080"&gt;example rule in the video&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;They generalized the metadata for detections (independently from the system). Each rule is automatically deployed to a detection engine, so all rules are centralized in a single repo. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They prefer JS-based rules&lt;/strong&gt; (with fallback to SQL when is not possible). (&lt;a href="https://youtu.be/-9BfXMYn0wk?t=1380"&gt;example engine in the video&lt;/a&gt;).&lt;/p&gt;

</description>
      <category>conference</category>
      <category>osquery</category>
      <category>security</category>
    </item>
    <item>
      <title>KubeConEU 2020 - Day 2</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Thu, 01 Oct 2020 13:37:47 +0000</pubDate>
      <link>https://dev.to/endorama/kubeconeu-2020-day-2-31j4</link>
      <guid>https://dev.to/endorama/kubeconeu-2020-day-2-31j4</guid>
      <description>&lt;p&gt;The journey continues! Day 2 to 4 where packed with talks! I tried to create briefs from each one I followed.&lt;/p&gt;

&lt;p&gt;From Day 2 onward the talks where early and late in the afternoon, leaving space for keynotes in the middle. With that many interesting talks, I have to admit I skipped all keynotes after the first one in Day 2, but I'm watching them on-demand (it was easier to interact with speakers timely after their talks, as there were no talk dedicated channels but topic dedicated channels, so following conversations long after the talk was complex at times).&lt;/p&gt;

&lt;h2&gt;
  
  
  Deliver Your Cloud Native Application with Design Pattern as Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/ZeiY?iframe=no"&gt;Talk link&lt;/a&gt;&lt;br&gt;
Who is for: Ops, Backend&lt;br&gt;
by &lt;a href="https://twitter.com/JunMakishi"&gt;@JunMakishi&lt;/a&gt;, &lt;a href="https://twitter.com/TAR_O_RIN"&gt;@TAR_O_RIN&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As organization embrace the Cloud and it's tools, managing fragmentation becomes more and more complex. The idea of applying design patterns to create composable and reusable infrastructure components is very cool. It also allows to abstract in a reusable way different cloud provider patterns. &lt;/p&gt;

&lt;p&gt;They integrate &lt;strong&gt;pipelines&lt;/strong&gt; in the equation, which is awesome. Flexibility of pipelines is one of the key advantages of being in the Cloud, leveraging that is very powerful.&lt;/p&gt;

&lt;p&gt;It's not a one-size-fit-all approach, but their solution is inspiring. Based on Infrastructure as a Code and &lt;a href="https://cuelang.org"&gt;CueLang&lt;/a&gt; for configurations.&lt;/p&gt;

&lt;p&gt;The talk explores a powerful concept: &lt;strong&gt;configuration as data&lt;/strong&gt; &amp;gt;&amp;gt; &lt;strong&gt;configuration as code&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
I agree! &lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--9K_9m716--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pbs.twimg.com/profile_images/1204077305271705606/j5XjhPAt_normal.jpg" alt="Kelsey Hightower profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Kelsey Hightower
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @kelseyhightower
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kDgU_xDI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      During the &lt;a href="https://twitter.com/ArrestedDevOps"&gt;@ArrestedDevOps&lt;/a&gt; podcast, hosted by &lt;a href="https://twitter.com/bridgetkromhout"&gt;@bridgetkromhout&lt;/a&gt;, I was able to dive into what I refer to as infrastructure as data. Its the idea that configuration should be treated as data and leverage pipelines for manipulation and policy enforcement. &lt;a href="https://t.co/YYLyXUz4ZM"&gt;arresteddevops.com&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      23:13 PM - 04 Dec 2019
    &lt;/div&gt;


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


&lt;p&gt;Their solution does not take into account state management, that should be separately handled (they use Pulumi, previously they used Terraform).&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/PHajuKqjNs8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes Patterns
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/ZerV/kubernetes-patterns-roland-huss-red-hat?iframe=no"&gt;Talk link&lt;/a&gt;&lt;br&gt;
Who is for: Backend&lt;br&gt;
by &lt;a href="https://twitter.com/ro14nd"&gt;@ro14nd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Companion book: &lt;em&gt;Kubernetes Patterns&lt;/em&gt; (Free download &lt;a href="https://k8spatterns.io/"&gt;https://k8spatterns.io/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Nothing particularly new to me, I've had my chance to review and study Kubernetes patterns some time ago.&lt;/p&gt;

&lt;p&gt;Worth checking out if you're a developer using K8s for app delivery. The book is definitely to be downloaded for study and future reference.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/eJmNSYvelSw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Progressive Delivery
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/ZesH/progressive-delivery-in-kubernetes-carlos-sanchez-adobe-viktor-farcic-cloudbees?iframe=no"&gt;Talk link&lt;/a&gt;&lt;br&gt;
Who is for: Ops, Backend&lt;br&gt;
by &lt;a href="https://twitter.com/vfarcic"&gt;@vfarcic&lt;/a&gt;, &lt;a href="https://twitter.com/csanchez"&gt;@csanchez&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Progressive delivery is a term to describe deployment techniques to avoid common all-or-nothing deployment pitfalls. &lt;/p&gt;

&lt;p&gt;The goal is to shift traffic slowly from the old to the new version, being able to roll back immediately in case of unexpected behaviours of the new deployment.&lt;/p&gt;

&lt;p&gt;Avoid downtime, limit the blast radius, ship code faster!&lt;/p&gt;

&lt;p&gt;I was positively impressed by the visual explanations of techniques. The concepts were clear to me before the presentation, but have been explained so well it has been a pleasurable review.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Monitoring is the new testing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Today monitoring allow to know when users are experiencing issues &lt;strong&gt;and react automatically&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Demo time focus on &lt;a href="https://istio.io/"&gt;Istio&lt;/a&gt; and &lt;a href="https://flagger.app/"&gt;flagger.app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;How to manage databases with progressive delivery? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Cloud hosted solutions&lt;/li&gt;
&lt;li&gt;Make you app &lt;strong&gt;always&lt;/strong&gt; backward compatible&lt;/li&gt;
&lt;li&gt;Only non-breaking database schema changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Jf29YXu1Q48"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Build an Automatic Canary Release Pipeline in a Kubernetes-native Way
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/Zeie/build-an-automatic-canary-release-pipeline-in-a-kubernetes-native-way-ying-chun-guo-ibm"&gt;Talk link&lt;/a&gt;&lt;br&gt;
Who is for: Ops&lt;br&gt;
by Ying Chun Guo&lt;/p&gt;

&lt;p&gt;I was a bit mislead by the title of this talk. The focus is on &lt;a href="https://knative.dev/"&gt;Knative&lt;/a&gt; (a serverless platform on top of Kubernetes) and &lt;a href="https://tekton.dev/"&gt;Tekton&lt;/a&gt; (a Kubernetes-native CI/CD system). Truly Kubernetes-native but very "locked in".&lt;/p&gt;

&lt;p&gt;Seeing how the two systems play together has been interesting, but unless you are planning to adopt such technologies there is little knowledge that you can reuse in other environment.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/xK1QD_aZWq8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Container Vulnerabilities with Open Policy Agent
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/Zekd/handling-container-vulnerabilities-with-open-policy-agent-teppei-fukuda-aqua-security"&gt;Talk link&lt;/a&gt;&lt;br&gt;
Who is for: Ops, Security&lt;br&gt;
by &lt;a href="https://twitter.com/knqyf263"&gt;@knqyf263&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This has been one of the most interesting talk I've followed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Scanning for vulnerabilities does not scale. In 2019 there have been little less than 50 vulnerabilities &lt;strong&gt;per day&lt;/strong&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How can the team keep up with that? By reducing noise and focusing on &lt;strong&gt;what matters to us&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Use Open Policy Agent (OPA) to define &lt;strong&gt;how&lt;/strong&gt; to handle vulnerabilities discovered by a scanner. This allows to create policies to handle vulnerabilities based on internal knowledge and requirements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aquasecurity/trivy"&gt;Trivy&lt;/a&gt; has direct OPA integration.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;trivy-enforcer&lt;/code&gt; is a custom K8s controller that allows enforcing policies on images to be deployed on K8s. Still experimental, looks awesome!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/WKE2XNZ2zr4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Caching Patterns for Kubernetes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/ZerY/architectural-caching-patterns-for-kubernetes-rafal-leszko-hazelcast"&gt;Talk link&lt;/a&gt;&lt;br&gt;
Who is for: Backend&lt;br&gt;
by &lt;a href="https://twitter.com/RafalLeszko"&gt;@RafalLeszko&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do you happen to need caching data in your services? Generally, is quite a common need.&lt;/p&gt;

&lt;p&gt;The overview of caching pattern was quite complete but the talk felt centred around promoting the speaker company product more than giving a solid understanding of different caching patterns.&lt;/p&gt;

&lt;p&gt;Still worth to watch if you want an overview of caching patterns or if you're interested in the product (Hazelcast).&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/poO6KDRHAL0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Tracing is For Everyone: Tracing User Events with GraphQL and OpenTelemetry
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/ZeiJ/tracing-is-for-everyone-tracing-user-events-with-graphql-and-opentelemetry-nina-stawski-splunk"&gt;Talk link&lt;/a&gt;&lt;br&gt;
Who is for: Frontend&lt;br&gt;
by &lt;a href="https://twitter.com/ninastawski"&gt;@ninastawski&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This talk is presented by a UI engineer! It's so interesting to see tracing applied to frontend because can really help understand where customers are having issues using your application.&lt;/p&gt;

&lt;p&gt;Why only Backend and Ops should have the cool tools? &lt;a href="https://github.com/open-telemetry/opentelemetry-js"&gt;OpenTelemetry.js&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;UI is much more than a "service". Users do lots of things in UI and with complex UI apps (microfrontends, complex journeys) tracing &lt;strong&gt;is powerful&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Collect actions in UI then send to backend and collect (in &lt;a href="https://zipkin.io/"&gt;Zipkin&lt;/a&gt;). If you want to follow along the demo, a GitHub repo &lt;a href="https://github.com/nstawski/opentelemetry-graphql"&gt;is provided&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By carefully tagging traces is possible to correlate &lt;strong&gt;frontend and backend&lt;/strong&gt; traces to look at the entire user journey. &lt;strong&gt;COOL!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8Ldp9w8wm-U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Five Great Ways to Lose Data on Kubernetes (And How to Avoid Them)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/Zet6/five-great-ways-to-lose-data-on-kubernetes-and-how-to-avoid-them-robert-hodges-altinity-ltd"&gt;Talk link&lt;/a&gt;&lt;br&gt;
Who is for: Ops&lt;br&gt;
by &lt;a href="https://twitter.com/dbcicero"&gt;@dbcicero&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Database data resiliency is always an interesting topic for me. Nobody cares if the app is up and the code works if the database is broken.&lt;/p&gt;

&lt;p&gt;The talk had cool tips, and some very nice troubleshooting/discovery commands. Highly recommended!&lt;/p&gt;

&lt;p&gt;It starts with a clear explanation on Kubernetes related risks for &lt;em&gt;stateful&lt;/em&gt; applications and mitigations.&lt;/p&gt;

&lt;p&gt;The main mentioned topics have been: replicas, affinity, distance, ephemeral storage and operator error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Replicas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Replica is one of the ways to avoid node failure.&lt;/p&gt;

&lt;p&gt;How does Replicas cope with &lt;em&gt;blast radius&lt;/em&gt; (how fare away you need to be to not be affected by a failure)?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Affinity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The process of requesting different replica to be nearby or distanced. Kubernetes supports &lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/"&gt;Pod affinity&lt;/a&gt; natively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Protect replicas using distance (affinity/anti-affinity).&lt;/p&gt;

&lt;p&gt;Take backup in object storage (it's easy and durable).&lt;/p&gt;

&lt;p&gt;How does distance cope with &lt;em&gt;blast radius&lt;/em&gt;? How to protect across regions or K8s clusters? &lt;strong&gt;It's complicated&lt;/strong&gt;: it's not just a data problem, is a resource problem too (think load, DNS). (This part was out of scope for the talk, unfortunately!)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The persistent volume that doesn't&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Kubernetes ephemeral storage is a feature. Unless you want it to be persistent 😅&lt;/p&gt;

&lt;p&gt;A pod cannot understand if storage is ephemeral or not.&lt;/p&gt;

&lt;p&gt;Persistent Volumes are not enough if you don't use them! When you &lt;strong&gt;expect&lt;/strong&gt; your Pod to use persistent storage, &lt;strong&gt;verify&lt;/strong&gt; it writes data to be persisted to the proper mount point, otherwise ephemeral storage is used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fat fingers of fate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The saddest one. When an operator &lt;strong&gt;deletes&lt;/strong&gt; applications. In Kubernetes deleting workloads is very easy. Once an application is deleted, dynamically provisioned persistent volumes (like the ones created by cloud provider integrations) are &lt;strong&gt;deleted&lt;/strong&gt; by default. &lt;/p&gt;

&lt;p&gt;But fear no more, you can avoid that &lt;a href="https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/"&gt;changing the Reclaim Policy&lt;/a&gt; to &lt;code&gt;Retain&lt;/code&gt;. You can  achieve the same by creating a new &lt;code&gt;StorageClass&lt;/code&gt; with &lt;code&gt;Retain&lt;/code&gt; policy and use that.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zW7gLyPln3w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Escaping the Jungle - Migration to Cloud Native CI/CD
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kccnceu20.sched.com/event/Zesu/escaping-the-jungle-migration-to-cloud-native-cicd-anton-weiss-otomato-software?iframe=no"&gt;Talk link&lt;/a&gt; &lt;br&gt;
Who is for: Ops, Backend&lt;br&gt;
by &lt;a href="http://twitter.com/antweiss"&gt;@antweiss&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When a company starts it's journey, there is a blank slate. Then, after a while, you get in the jungle, where everything is in your stack and there is tech debt everywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's time to find &lt;a href="https://charity.wtf/2018/12/02/software-sprawl-the-golden-path-and-scaling-teams-with-agency/"&gt;the Golden Path&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Golden Path is not "the only" path, but it makes easier for the organization to work together. It's the supported path, out of it, you're on your own.&lt;/p&gt;

&lt;p&gt;Meanwhile, you may want to build &lt;em&gt;Cloud Native&lt;/em&gt; apps. And what about CI/CD? What is a &lt;em&gt;Cloud Native&lt;/em&gt; CI/CD?&lt;/p&gt;

&lt;p&gt;"Avoid e2e test at all, they are very brittle. Adopt &lt;a href="https://www.martinfowler.com/bliki/ContractTest.html"&gt;Contract Testing&lt;/a&gt; instead."&lt;/p&gt;

&lt;p&gt;When building the Golden Path, build the map of &lt;strong&gt;where&lt;/strong&gt; we are going and embed it in the pipelines.&lt;/p&gt;

&lt;p&gt;This one has been one of the most interesting for me, as surfing the amount of different tech stacks in a company can be incredibly daunting and I can see the Golden Path value proposition.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/kgVe5cWSMZQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;That's the end for Day 2! Any talk you think is missing? Let me know in the comments!&lt;/p&gt;

</description>
      <category>conference</category>
      <category>kubernetes</category>
      <category>cloud</category>
      <category>series</category>
    </item>
    <item>
      <title>A KubeConEU 2020 story</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Thu, 17 Sep 2020 16:34:50 +0000</pubDate>
      <link>https://dev.to/endorama/a-kubeconeu-2020-story-42d9</link>
      <guid>https://dev.to/endorama/a-kubeconeu-2020-story-42d9</guid>
      <description>&lt;p&gt;KubeCon Europe 2020 has been a massive virtual event this year. The price was incredibly low (no travel, no accomodation, lower ticket cost) so it was very accessible.&lt;/p&gt;

&lt;p&gt;18k+ attendees gathered online to follow the &lt;a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/program/schedule/"&gt;massive schedule&lt;/a&gt; available!&lt;/p&gt;

&lt;p&gt;I attended all 4 days of the conference, here is my retrospective.&lt;/p&gt;

&lt;p&gt;The quality of content and the number of talks was impressive. My schedule had around 60 different talks I were interested in 😵 I couldn't attend all, but I'll do my best to watch the recording.&lt;/p&gt;

&lt;p&gt;A word of mention to the staff, the platform was good, the Slack workspace was massive and very active and the overall experience has been very nice for such a massive event. All talks were registered with a final QA live session, then the discussion continue in the thematic Slack channels, one for each content track.&lt;/p&gt;

&lt;p&gt;This year I dedicated my time on hands-on tracks (like AppDev, Security, Observability, Networking, ...) but there was a huge spot for meeting maintainers and sponsors where you could actively engage with the community. I guess I'll dedicate more time on that the next year!&lt;/p&gt;

&lt;p&gt;I've added Youtube embed for videos of talks I watched but you can find all videos in &lt;a href="https://www.youtube.com/playlist?list=PLj6h78yzYM2O1wlsM-Ma-RYhfT5LKq0XC"&gt;KubeCon + CloudNativeCon Europe 2020 - Virtual YouTube playlist&lt;/a&gt;. Videos don't have the questions and answers section included, but if you navigate to the talk page and look for Closed Caption Transcript you should be able to read them.&lt;/p&gt;

&lt;p&gt;Let's dive in!&lt;/p&gt;

&lt;h1&gt;
  
  
  Day 1
&lt;/h1&gt;

&lt;p&gt;The first day has been introductory. I skimmed around lighting talks and some tutorials.&lt;/p&gt;

&lt;p&gt;The talk that hit home was &lt;a href="https://kccnceu20.sched.com/event/Zeiw/kubecon-cloudnativecon-101-a-beginners-guide-to-the-conference-karen-chu-michelle-noorali-microsoft"&gt;"KubeCon + CloudNativeCon 101: A Beginner’s Guide to The Conference"&lt;/a&gt; by &lt;a href="https://twitter.com/karenhchu"&gt;Karen Chu&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/michellenoorali"&gt;Michelle Noorali&lt;/a&gt;. Is your first KubeCon? Fear no more, as this talk can guide you around giving you a warm welcome in the KubeCon community.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The journey will continue in the next post from this series!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Did you attend KubeCon EU 2020? If yes share your thoughts in the comments! I'd love to know.&lt;/p&gt;

</description>
      <category>conference</category>
      <category>kubernetes</category>
      <category>cloud</category>
      <category>series</category>
    </item>
    <item>
      <title>Contributing back to Ansible — flexible secrets with some Sops</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Wed, 11 Dec 2019 08:26:43 +0000</pubDate>
      <link>https://dev.to/endorama/contributing-back-to-ansible-flexible-secrets-with-some-sops-53c</link>
      <guid>https://dev.to/endorama/contributing-back-to-ansible-flexible-secrets-with-some-sops-53c</guid>
      <description>&lt;p&gt;&lt;em&gt;This blog post has been published originally on Arduino blog:&lt;/em&gt; &lt;a href="https://blog.arduino.cc/2019/12/04/contributing-back-to-ansible-flexible-secrets-with-some-sops/"&gt;https://blog.arduino.cc/2019/12/04/contributing-back-to-ansible-flexible-secrets-with-some-sops/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is from Edoardo Tenani, DevOps Engineer at Arduino.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qRkXn9VM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.arduino.cc/wp-content/uploads/2019/12/Ansible-1024x589.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qRkXn9VM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.arduino.cc/wp-content/uploads/2019/12/Ansible-1024x589.png" alt="Post header image" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this blog, we’re going to answer: How does one store sensitive data in source code (in this case, Ansible playbooks) securely and in a way that the secrets can be easily shared with the rest of the team?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ansible is an open source community project sponsored by Red Hat, it’s the simplest way to automate IT. Ansible is the only automation language that can be used across entire IT teams from systems and network administrators to developers and managers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At Arduino, we started using Ansible around the beginning of 2018 and since then, most of our infrastructure has been provisioned via Ansible playbooks: from the frontend servers hosting our websites and applications (such as &lt;a href="https://create.arduino.cc/editor/"&gt;Create Web Editor&lt;/a&gt;), to the MQTT broker at the heart of Arduino IoT Cloud.&lt;/p&gt;

&lt;p&gt;As soon as we started adopting it, we faced one of the most common security problems in software: How does one store sensitive data in source code (in this case, Ansible playbooks) securely and in a way that the secrets can be easily shared with the rest of the team?&lt;/p&gt;

&lt;p&gt;Ansible configuration system comes to the rescue here with its built-in mechanism for handling secrets called &lt;a href="https://docs.ansible.com/ansible/latest/user_guide/vault.html"&gt;Ansible Vault&lt;/a&gt;, but unfortunately it had some shortcomings for our use case.&lt;/p&gt;

&lt;p&gt;The main disadvantage is that Vault is tied to Ansible system itself: In order to use it, you have to install the whole Ansible stack. We preferred a more self-contained solution, possibly compiled in a single binary to ease portability (i.e. inside Docker containers).&lt;/p&gt;

&lt;p&gt;The second blocker is the “single passphrase” Ansible Vault relies on: a shared password to decrypt the entire vault. This solution is very handy and simple to use for personal projects or when the team is small, but as we are constantly growing as a company we preferred to rely on a more robust and scalable encryption strategy. Having the ability to encrypt different secrets with different keys, while being able to revoke access to specific users or machines at any time was crucial to us.&lt;/p&gt;

&lt;p&gt;The first solution we identified has been &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;, a backend service purposely created for storing secrets and sensitive data with advanced encryption policies and access management capabilities. In our case, as the team was still growing, the operational cost of maintaining our Vault cluster was considered too high (deploying a High Available service that acts as a single point of failure for your operations is something we want to handle properly and with due care).&lt;/p&gt;

&lt;p&gt;Around that same time, while reading industry’s best practices and looking for something that could help us managing secrets in source code, we came across mozilla/sops, a simple command line tool that allows strings and files to be encrypted using a combination of AWS KMS keys, GCP KMS keys or GPG keys.&lt;/p&gt;

&lt;p&gt;Around that same time, while reading industry’s best practices and looking for something that could help us managing secrets in source code, we came across &lt;a href="https://github.com/mozilla/sops"&gt;&lt;strong&gt;mozilla/sops&lt;/strong&gt;&lt;/a&gt;, a simple command line tool that allows strings and files to be encrypted using a combination of AWS KMS keys, GCP KMS keys or GPG keys.&lt;/p&gt;

&lt;p&gt;Sops seemed to have all the requirements we were looking for to replace Ansible Vault:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A single binary, thanks to the porting from Python to Golang that Mozilla recently did.&lt;/li&gt;
&lt;li&gt;Able to encrypt and decrypt both entire files and single values.&lt;/li&gt;
&lt;li&gt;Allow us to use identities coming from AWS KMS, identities that we already used for our web services and where our operations team had access credentials.&lt;/li&gt;
&lt;li&gt;A fallback to GPG keys to mitigate the AWS lock-in, allowing us to decrypt our secrets even in the case of AWS KMS disruption.&lt;/li&gt;
&lt;li&gt;The same low operational cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sops’ adoption was a great success: The security team was happy and the implementation straightforward, with just one problem. When we tried to use Sops in Ansible configuration system, we immediately noticed what a pain it was to encrypt variables.&lt;/p&gt;

&lt;p&gt;We tried to encrypt/decrypt single values using a helper script to properly pass them as extra variables to ansible-playbook. It almost worked, but developers and operations were not satisfied: It led to errors during development and deployments and overall felt clumsy and difficult.&lt;/p&gt;

&lt;p&gt;Next we tried to encrypt/decrypt entire files. The helper script was still needed, but the overall complexity decreased. The main downside was that we needed to decrypt all the files prior to running ansible-playbook because Ansible system didn’t have any clue about what was going on: those were basically plain ansible var_files. It was an improvement, but still lacking the smooth developer experience we wanted.&lt;/p&gt;

&lt;p&gt;As Ansible configuration system already supports encrypted vars and storing entire files in Ansible Vault, the obvious choice was to identify how to replicate the behaviour using Sops as the encryption/decryption engine.&lt;/p&gt;

&lt;p&gt;Following an idea behind a feature request first opened upstream in the Ansible repository back in 2018 (&lt;a href="https://github.com/ansible/ansible/issues/36982"&gt;Integration with Mozilla SOPS for encrypted vars&lt;/a&gt;), we developed a lookup plugin and a vars plugin that seamlessly integrate Ansible configuration system and Sops.&lt;/p&gt;

&lt;h2&gt;
  
  
  No more helper scripts needed
&lt;/h2&gt;

&lt;p&gt;Just ensure Sops executable is installed, correct credentials are in place (ie. AWS credentials or GPG private key) and run ansible-playbook as you normally would.&lt;/p&gt;

&lt;p&gt;We believe contributing to a tool we use and love is fundamental in following the Arduino philosophy of spreading the love for open source. &lt;/p&gt;

&lt;p&gt;Our sops plugins are currently under review in the &lt;strong&gt;ansible/ansible&lt;/strong&gt; GitHub repository: &lt;a href="https://github.com/ansible/ansible/pull/59639"&gt;Add sops lookup plugin&lt;/a&gt; and &lt;a href="https://github.com/ansible/ansible/pull/59641"&gt;Add sops vars plugin&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You can test it out right away by downloading the plugin files from the PRs and &lt;a href="https://docs.ansible.com/ansible/latest/dev_guide/developing_locally.html"&gt;adding them in your local Ansible controller installation&lt;/a&gt;. You will then be able to use both plugins from your playbooks. Documentation is available, as for all Ansible plugins, in the code itself at the beginning of the file; search for &lt;em&gt;DOCUMENTATION&lt;/em&gt; if you missed it.&lt;/p&gt;

&lt;p&gt;If you can leave a comment or a GitHub reaction on the PR, that would be really helpful to expedite the review process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do from now on?
&lt;/h2&gt;

&lt;p&gt;If you’re a developer you can have a look at Sops’ &lt;a href="https://github.com/mozilla/sops/issues"&gt;issues list&lt;/a&gt; and contribute back to the project!&lt;/p&gt;

&lt;p&gt;The Sops team is constantly adding new features (like a new command for publishing encrypted secrets in latest &lt;a href="https://github.com/mozilla/sops/releases/tag/3.4.0"&gt;3.4.0 release&lt;/a&gt;, or Azure Key Vault support) but surely there are interesting issues to tackle. For example, the Kubernetes Secret integration being discussed in issue &lt;a href="https://github.com/mozilla/sops/issues/401"&gt;401&lt;/a&gt; or the –verify command discussed in issue &lt;a href="https://github.com/mozilla/sops/issues/437"&gt;437&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Made with &amp;lt;3 by the Arduino operations team!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ansible® is a registered trademark of Red Hat, Inc. in the United States and other countries.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ansible</category>
      <category>opensource</category>
      <category>mozilla</category>
      <category>secrets</category>
    </item>
    <item>
      <title>My 2019 Hacktoberfest</title>
      <dc:creator>Edoardo Tenani</dc:creator>
      <pubDate>Mon, 11 Nov 2019 19:18:10 +0000</pubDate>
      <link>https://dev.to/endorama/my-2019-hacktoberfest-2baa</link>
      <guid>https://dev.to/endorama/my-2019-hacktoberfest-2baa</guid>
      <description>&lt;p&gt;This is my third year participating in the Hacktoberfest challenge!&lt;/p&gt;

&lt;p&gt;2017 has been terrible, I've not been able to submit any Pull Requests.&lt;/p&gt;

&lt;p&gt;2018 was way better, mainly due to me learning Golang that created a whole lot of new opportunities for contribution.&lt;/p&gt;

&lt;p&gt;This year I started gathering interesting issues and projects since summer, so that I would have a pool of issues to choose from during Hacktoberfest.&lt;/p&gt;

&lt;p&gt;It all started with finding a bug in Ansible while at work. 😅&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/ansible/ansible/pull/63140"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg"&gt;
      &lt;span class="issue-title"&gt;
        ACMEAccount.get_request check status code value lower boundary
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#63140&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/endorama"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--dxBtm2jU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/526307%3Fv%3D4" alt="endorama avatar"&gt;
      &lt;/a&gt;
      &lt;span class="arrow-left-outer"&gt;&lt;/span&gt;
      &lt;span class="arrow-left-inner"&gt;&lt;/span&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/endorama"&gt;endorama&lt;/a&gt;
        &lt;/strong&gt; commented on &lt;a href="https://github.com/ansible/ansible/pull/63140"&gt;Oct 04, 2019&lt;/a&gt;&lt;span class="timestamp"&gt;&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;h5&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;SUMMARY&lt;/h5&gt;

&lt;p&gt;Any HTTP code below 200 cannot be considered a success, should be
handled like a failure instead.&lt;/p&gt;
&lt;p&gt;This is particularly true for below zero status codes.&lt;/p&gt;
&lt;p&gt;This change is required to avoid &lt;code&gt;ACMEAccount.get_request&lt;/code&gt; to consider any HTTP status code below &lt;code&gt;400&lt;/code&gt; to be a success. In #63139 status &lt;code&gt;-1&lt;/code&gt; is returned due to a &lt;code&gt;.netrc&lt;/code&gt; file permission error, but the function does not report it as an error.&lt;/p&gt;
&lt;p&gt;Fixes #63139&lt;/p&gt;

&lt;h5&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;ISSUE TYPE&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Bugfix Pull Request&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;COMPONENT NAME&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;module_utils/acme&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;ADDITIONAL INFORMATION&lt;/h5&gt;



    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ansible/ansible/pull/63140"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Second one has been found by share luck! Following the Arduino main repository, I saw a weird issue:&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/arduino/Arduino/issues/9281"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg"&gt;
      &lt;span class="issue-title"&gt;
        Bug in arduino-linux-setup.sh affecting non-bash users
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#9281&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jwcollins"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--f9MqOfjA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars2.githubusercontent.com/u/5275025%3Fv%3D4" alt="jwcollins avatar"&gt;
      &lt;/a&gt;
      &lt;span class="arrow-left-outer"&gt;&lt;/span&gt;
      &lt;span class="arrow-left-inner"&gt;&lt;/span&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jwcollins"&gt;jwcollins&lt;/a&gt;
        &lt;/strong&gt; commented on &lt;a href="https://github.com/arduino/Arduino/issues/9281"&gt;Oct 04, 2019&lt;/a&gt;&lt;span class="timestamp"&gt;&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Hi.  This script has an obvious, but easily fixed bug.  Currently there are a bunch of comments before #!/bin/bash.  And it assumes, very incorrectly, that pound-bang /bin/bash is a comment.  In fact, "#!" is a valid Unix/Linux magic number, and "/bin/bash" is the path to the program which needs to interpret / execute the script.  When run by a user who uses /bin/bash as their everyday shell, it works, but only because the user happens to have invoked bash.  But when run by a user who uses another shell (e.g. /bin/tcsh) as their shell, it doesn't work, because pound-bang is not at the top of the file, and thus /bin/bash is not invoked to execute the script.  And since the script is written to bash, as opposed to tcsh (or ksh or ... ) syntax, it won't work.&lt;/p&gt;
&lt;p&gt;This bug report is against distribution 1.8.10.  Screen capture of trying to run this script from a non-bash shell is pasted below.  Read the below wikipedia link, which mis-pronounces "pound-bang", but is otherwise valid.  This construct has worked since handed down by Real Programmer Dennis Ritchie in Jan 1980.  Please learn it.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Shebang_(Unix)" rel="nofollow"&gt;https://en.wikipedia.org/wiki/Shebang_(Unix)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://user-images.githubusercontent.com/5275025/66237072-f886f880-e6a8-11e9-938f-546eb9de3d03.png" rel="nofollow"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lk9b0wLY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/5275025/66237072-f886f880-e6a8-11e9-938f-546eb9de3d03.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/arduino/Arduino/issues/9281"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;An easy one, but &lt;em&gt;fun&lt;/em&gt;: the shebang mentioned has been in the wrong place probably since the file has been added to the repo, on May 2, 2018. The fun part is that the file was coming from another repository, where was dated 2017. And as the copyright suggested, it may have been created way before, in 2015.&lt;br&gt;
Which actually means that script has been broken for 4 years and was working by share luck: in 4 year either no one tried to run that script on a shell different than &lt;code&gt;bash&lt;/code&gt; or no one bothered reporting it (this would make me sad!).&lt;br&gt;&lt;br&gt;
This as a reminder that broken code can live a long life in any codebase. Even very simple things may have hidden edge cases no one just happened to hit before.&lt;br&gt;
A project that I followed closely during the last year has been &lt;code&gt;sops&lt;/code&gt;. I really like the approach and available functionalities and I wanted to contribute to it.&lt;/p&gt;

&lt;p&gt;I spent some time digging in &lt;code&gt;sops&lt;/code&gt; open issues and contributed to the &lt;code&gt;filestatus&lt;/code&gt; command:&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/mozilla/sops/pull/545"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg"&gt;
      &lt;span class="issue-title"&gt;
        add filestatus command
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#545&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/endorama"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--dxBtm2jU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/526307%3Fv%3D4" alt="endorama avatar"&gt;
      &lt;/a&gt;
      &lt;span class="arrow-left-outer"&gt;&lt;/span&gt;
      &lt;span class="arrow-left-inner"&gt;&lt;/span&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/endorama"&gt;endorama&lt;/a&gt;
        &lt;/strong&gt; commented on &lt;a href="https://github.com/mozilla/sops/pull/545"&gt;Oct 08, 2019&lt;/a&gt;&lt;span class="timestamp"&gt;&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Closes #460&lt;/p&gt;
&lt;p&gt;Add &lt;code&gt;filestatus&lt;/code&gt; command, reporting if the file is in encrypted or unencrypted state.&lt;/p&gt;
&lt;p&gt;I reused &lt;code&gt;ensureNoMetadata&lt;/code&gt; logic, thus the command would return &lt;code&gt;0&lt;/code&gt; when the file is not encrypted and &lt;code&gt;203&lt;/code&gt; when the file is encrypted (respecting the &lt;code&gt;codes.FileAlreadyEncrypted&lt;/code&gt; error code)&lt;/p&gt;
&lt;p&gt;It does not output the error message as returned by &lt;code&gt;ensureNoMetadata&lt;/code&gt;, preferring a simpler output: "File is encrypted" or "File is unencrypted".&lt;/p&gt;
&lt;p&gt;As I'm not so fond on &lt;code&gt;sops&lt;/code&gt; internals, I'm sure there are multiple things to review, I'll gladly update the code to reflect any suggestion.&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mozilla/sops/pull/545"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Last one, is probably my favourite: a simple one indeed, but (I hope) with a future. This year I got a new laptop, and decided to move from my trusted and loved Ubuntu 16.04 installation to something newer.&lt;br&gt;&lt;br&gt;
I've been following &lt;a href="https://elementary.io/"&gt;Elementary OS&lt;/a&gt; since 0.3, tried 0.4 but were not able to use it successfully for work.&lt;br&gt;&lt;br&gt;
But this was the year, Elementary OS 0.5 Juno felt ready for my daily workloads, and is my stable OS since a couple of months now.&lt;br&gt;&lt;br&gt;
I can say I'm pretty in love with it. It has some small glitches (is OSS and donation based so ❤) but the overall experience it awesome. Is snappy, easy to use and has a polished touch that really make it shine. Kudos to the development team, they did an incredible work!&lt;/p&gt;

&lt;p&gt;There is one issue I'm struggling with: being a not native English speaker, I switch keyboard layout a lot, between italian (my main writing language) and English (my main coding language).&lt;br&gt;&lt;br&gt;
It always interested me to contribute to an Operative system, but I have never been able to (due to my inexperience and web specific knowledge).&lt;/p&gt;

&lt;p&gt;Contributing to an Operating System is daunting, I don't know where to start and don't know most of the tools (from the programming language to how a Desktop Environment works, I'm a newbie!). Thus starting small was my best choice. A simple task that required reading a lot of documentation and a bit of understanding how apps work on Elementary:&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/elementary/wingpanel-indicator-power/pull/124"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg"&gt;
      &lt;span class="issue-title"&gt;
        add AppData configurations
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#124&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/endorama"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--dxBtm2jU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/526307%3Fv%3D4" alt="endorama avatar"&gt;
      &lt;/a&gt;
      &lt;span class="arrow-left-outer"&gt;&lt;/span&gt;
      &lt;span class="arrow-left-inner"&gt;&lt;/span&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/endorama"&gt;endorama&lt;/a&gt;
        &lt;/strong&gt; commented on &lt;a href="https://github.com/elementary/wingpanel-indicator-power/pull/124"&gt;Oct 24, 2019&lt;/a&gt;&lt;span class="timestamp"&gt;&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Hello! I would love to contribute to ElementaryOS, but I'm new to Vala, Meson, Ninja so I'm starting from simple stuff!&lt;/p&gt;
&lt;p&gt;This PR provide the AppData configuration file as requested in #111&lt;/p&gt;
&lt;p&gt;Thank you!&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/elementary/wingpanel-indicator-power/pull/124"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This is a starting point, my final goal is:&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/elementary/gala/issues/180"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg"&gt;
      &lt;span class="issue-title"&gt;
        Different keyboard layouts for individual windows
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#180&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/liminspace"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--gvVJoHGW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/5173158%3Fv%3D4" alt="liminspace avatar"&gt;
      &lt;/a&gt;
      &lt;span class="arrow-left-outer"&gt;&lt;/span&gt;
      &lt;span class="arrow-left-inner"&gt;&lt;/span&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/liminspace"&gt;liminspace&lt;/a&gt;
        &lt;/strong&gt; commented on &lt;a href="https://github.com/elementary/gala/issues/180"&gt;Feb 17, 2018&lt;/a&gt;&lt;span class="timestamp"&gt;&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Hi there!
It's very important to have different layouts for each windows if you use more than one layout.
But it is impossible in Elementary OS.
Is there some solution how to fix it?
Thanks.&lt;/p&gt;
&lt;p&gt;ps: Elementary OS can be the first candidate to move from Ubuntu with Unity, but it must have at least base functionality like above.&lt;/p&gt;


&lt;p&gt;Want to back this issue? &lt;strong&gt;&lt;a href="https://www.bountysource.com/issues/55172446-different-keyboard-layouts-for-individual-windows?utm_campaign=plugin&amp;amp;utm_content=tracker%2F62872462&amp;amp;utm_medium=issues&amp;amp;utm_source=github" rel="nofollow"&gt;Post a bounty on it!&lt;/a&gt;&lt;/strong&gt; We accept bounties via &lt;a href="https://www.bountysource.com/?utm_campaign=plugin&amp;amp;utm_content=tracker%2F62872462&amp;amp;utm_medium=issues&amp;amp;utm_source=github" rel="nofollow"&gt;Bountysource&lt;/a&gt;.
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;/div&amp;gt;
&amp;lt;div class="gh-btn-container"&amp;gt;&amp;lt;a class="gh-btn" href="https://github.com/elementary/gala/issues/180"&amp;gt;View on GitHub&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;In a couple hours I've been able to compile and replace the Window Manager from source code (😎). A pretty happy and motivating start!&lt;/p&gt;

&lt;p&gt;This was my 2019 Hacktoberfest. What about you? Did you contribute?  &lt;/p&gt;

&lt;p&gt;This year Hacktoberfest is over, but Open Source Software is waiting for your contribution: it may be small, it may sound simple or daunting but is everyone's job to keep that software in good shape. Everyone starts small.  &lt;/p&gt;

&lt;p&gt;Go &lt;em&gt;Make&lt;/em&gt; the world better!&lt;/p&gt;
&lt;/div&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
