<?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: Marco Ieni</title>
    <description>The latest articles on DEV Community by Marco Ieni (@marcoieni).</description>
    <link>https://dev.to/marcoieni</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%2F155338%2Fdeef129d-60bc-41d0-8bd8-8699e78864f2.jpeg</url>
      <title>DEV Community: Marco Ieni</title>
      <link>https://dev.to/marcoieni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcoieni"/>
    <language>en</language>
    <item>
      <title>RustShip: a new Rust podcast</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Fri, 18 Aug 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/marcoieni/rustship-a-new-rust-podcast-j4</link>
      <guid>https://dev.to/marcoieni/rustship-a-new-rust-podcast-j4</guid>
      <description>&lt;p&gt;I’m excited to announce that I started RustShip: a new podcast where I interview other Rust developers to learn from their experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  RustShip #1 — Creating successful open-source projects
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--56GrFWT1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.marcoieni.com/2023/08/rustship-a-new-rust-podcast/rustship1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--56GrFWT1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.marcoieni.com/2023/08/rustship-a-new-rust-podcast/rustship1.jpg" alt="RustShip episode image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the first episode, I interviewed &lt;a href="https://orhun.dev/"&gt;Orhun&lt;/a&gt;, Arch Linux package maintainer and author of tens of open-source projects used and loved by thousands of people, including myself.&lt;/p&gt;

&lt;p&gt;Orhun shared what it’s like maintaining Rust code and his advice on increasing the adoption of our open-source projects.&lt;/p&gt;

&lt;p&gt;You can find the full episode on &lt;a href="https://www.youtube.com/live/_xABF_H8b3g?feature=share&amp;amp;t=311"&gt;YouTube&lt;/a&gt; or your favorite &lt;a href="https://ieni.dev/rustship"&gt;podcast client&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you don’t have time to listen to the full episode, here are some clips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=sTEMWoIMBMY"&gt;Creativity and Open Source&lt;/a&gt; (25 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=2sHD3CCPt40"&gt;Open Source sustainability and burnout&lt;/a&gt; (37 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=1j4zuPN_8kU"&gt;Packaging Rust binaries for Linux distributions&lt;/a&gt; (4 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/shorts/EPlX1ITjGoE"&gt;Dogfooding: use your own tools&lt;/a&gt; (1 minute)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;I will record the next episode live on &lt;a href="https://www.youtube.com/watch?v=bh6BaJhIrFM"&gt;YouTube&lt;/a&gt; on August 23, 2023. I will interview &lt;a href="https://predr.ag/"&gt;Predrag Gruevski&lt;/a&gt; about &lt;a href="https://github.com/obi1kenobi/trustfall"&gt;Trustfall&lt;/a&gt; and &lt;a href="https://github.com/obi1kenobi/cargo-semver-checks"&gt;Cargo-semver-checks&lt;/a&gt;, two Rust projects he created:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trustfall is a query engine for any combination of data sources, allowing to query files and APIs as if they were databases.&lt;/li&gt;
&lt;li&gt;Cargo-semver-checks is a cargo plugin that scans Rust crates looking for semver violations. It uses Trustfall and Rustdoc to do its job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I plan to do at least one episode every month. Follow me on &lt;a href="https://www.youtube.com/c/MarcoIeni"&gt;YouTube&lt;/a&gt;, &lt;a href="https://twitter.com/MarcoIeni"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/MarcoIeni/"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://hachyderm.io/@MarcoIeni"&gt;Mastodon&lt;/a&gt; to stay up to date with the latest news and join the next live episodes: I’m always happy to answer questions from the chat during the live stream.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>podcast</category>
    </item>
    <item>
      <title>Release-plz: release Rust packages from CI</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Sun, 26 Jun 2022 00:00:00 +0000</pubDate>
      <link>https://dev.to/marcoieni/release-plz-release-rust-packages-from-ci-1e49</link>
      <guid>https://dev.to/marcoieni/release-plz-release-rust-packages-from-ci-1e49</guid>
      <description>&lt;p&gt;Releasing Rust packages is tedious and error-prone, just like most IT manual tasks. For every package you want to release, you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increase the version in &lt;code&gt;Cargo.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Update the changelog.&lt;/li&gt;
&lt;li&gt;Publish the package in the cargo registry (for example, &lt;a href="https://crates.io"&gt;crates.io&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Create and push a git tag.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meet &lt;a href="https://github.com/MarcoIeni/release-plz"&gt;release-plz&lt;/a&gt;: a Rust open-source project that automates these tasks, allowing developers to release Rust packages without the command line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I5rO64n1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2022/06/release-plz-release-rust-packages-from-ci/logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I5rO64n1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2022/06/release-plz-release-rust-packages-from-ci/logo.png" alt="logo" title="logo" width="880" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Version update based on &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/"&gt;conventional commits&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Changelog update with &lt;a href="https://github.com/orhun/git-cliff"&gt;git-cliff&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Cargo workspaces support.&lt;/li&gt;
&lt;li&gt;No configuration required.&lt;/li&gt;
&lt;li&gt;Optional &lt;code&gt;cargo update&lt;/code&gt; before releasing.&lt;/li&gt;
&lt;li&gt;Git tag created for every released package.&lt;/li&gt;
&lt;li&gt;Package published to any cargo registry.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How does it work
&lt;/h2&gt;

&lt;p&gt;The recommended way to run release-plz is via the &lt;a href="https://github.com/MarcoIeni/release-plz-action"&gt;GitHub action&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By default, every time you merge a commit to the main branch, the GitHub action runs two commands: &lt;code&gt;release-plz release-pr&lt;/code&gt; and &lt;code&gt;release-plz release&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a release pull request
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;release-plz release-pr&lt;/code&gt; command opens a pull request that prepares the next release. The command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Downloads the packages of the project from the cargo registry.&lt;/li&gt;
&lt;li&gt;Compares the local packages with the downloaded ones to determine the new commits.&lt;/li&gt;
&lt;li&gt;Updates the packages versions based on the messages of the new commits (based on &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/"&gt;conventional commits&lt;/a&gt; and &lt;a href="https://semver.org/"&gt;semantic versioning&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Updates the packages changelogs with the messages of the new commits.&lt;/li&gt;
&lt;li&gt;Updates all dependencies by running &lt;code&gt;cargo update&lt;/code&gt; (disabled by default).&lt;/li&gt;
&lt;li&gt;Raises a pull request with the above changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the project maintainer merges the release pull request, the packages are ready to be published.&lt;/p&gt;

&lt;p&gt;Here’s an example of a &lt;a href="https://github.com/MarcoIeni/release-plz/pull/189"&gt;PR&lt;/a&gt; opened by release-plz in the release-plz GitHub project itself:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--36YyNHo0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2022/06/release-plz-release-rust-packages-from-ci/pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--36YyNHo0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2022/06/release-plz-release-rust-packages-from-ci/pr.png" alt="pr" title="pr" width="880" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Releasing all updated packages
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;release-plz release&lt;/code&gt; command releases all the packages with a new version.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For example, let’s say you have a workspace with two packages: &lt;code&gt;pkg-a&lt;/code&gt; (version 0.3.1) and &lt;code&gt;pkg-b&lt;/code&gt; (version 0.2.2). The crates.io registry contains &lt;code&gt;pkg-a&lt;/code&gt; version 0.3.1, but it doesn’t contain &lt;code&gt;pkg-b&lt;/code&gt; version 0.2.2 because you didn’t publish this version yet. In this case, release-plz would release &lt;code&gt;pkg-b&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For every release, release-plz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a git tag named &lt;code&gt;&amp;lt;package_name&amp;gt;-v&amp;lt;version&amp;gt;&lt;/code&gt; (e.g. &lt;code&gt;tokio-v1.8.1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Publishes the package to the cargo registry by running &lt;code&gt;cargo publish&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Releases made easy
&lt;/h2&gt;

&lt;p&gt;In short, release-plz makes releasing Rust packages child’s play:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For every change, release-plz creates a release pull request.&lt;/li&gt;
&lt;li&gt;The release pull request reminds the maintainer about the unpublished changes.&lt;/li&gt;
&lt;li&gt;When the maintainer reviews and merges the pull request, release-plz releases the updated packages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Release-plz makes releasing Rust packages as easy as clicking the pull request “merge” button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why yet another release tool
&lt;/h2&gt;

&lt;p&gt;New Rust apps and rewrites are mushrooming every day. Choosing which tools to add to your developer toolbox is becoming harder and harder.&lt;/p&gt;

&lt;p&gt;I feel obliged to explain why I created this project and how it compares with similar tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Differences with release-please
&lt;/h3&gt;

&lt;p&gt;I learned about the “pull request driven release flow” from the article &lt;a href="https://fasterthanli.me/articles/my-ideal-rust-workflow"&gt;My ideal Rust workflow&lt;/a&gt; by &lt;a href="https://twitter.com/fasterthanlime"&gt;fasterthanlime&lt;/a&gt;, where he talks about &lt;a href="https://github.com/googleapis/release-please"&gt;release-please&lt;/a&gt;. I immediately felt like release-please could fit great with the way I work, so I decided to try it. Like release-plz, release-please is an open-source project that manages releases via pull requests. I tried release-please both with the GitHub action and the CLI, but it didn’t work for me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I got a &lt;a href="https://github.com/google-github-actions/release-please-action/issues/348"&gt;“not found”&lt;/a&gt; error, which wasn’t very descriptive.&lt;/li&gt;
&lt;li&gt;Two configuration files were required: &lt;code&gt;.release-please-manifest.json&lt;/code&gt; and &lt;code&gt;release-please-config.json&lt;/code&gt;. Most of the fields I had to write in these two files were already in the &lt;code&gt;Cargo.toml&lt;/code&gt; files. I thought it was a shame that Rust developers needed to duplicate these fields.&lt;/li&gt;
&lt;li&gt;Release-please considers a package “published” when the relative git tag exists. Release-please doesn’t interact at all with cargo registries. However, some Rust projects don’t create git tags. Instead, they just publish the package to crates.io, which is the ultimate source of truth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the problems listed above mainly exist because release-please aims to support different programming languages. So I thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I write a tool specifically optimized for Rust that solves all the problems I have experienced? A tool that works out-of-the-box with nearly every Rust project, without any extra configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It took six months of my spare time to write release-plz, but here we are!&lt;/p&gt;

&lt;h3&gt;
  
  
  Differences with other Rust release tools
&lt;/h3&gt;

&lt;p&gt;These are the release tools in the Rust ecosystem I am aware of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/crate-ci/cargo-release"&gt;cargo-release&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;Bumps the version and publishes Rust packages from the CLI.&lt;/li&gt;
&lt;li&gt;Doesn’t support automatic releases from CI yet. See this open &lt;a href="https://github.com/crate-ci/cargo-release/issues/117"&gt;issue&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/pksunkara/cargo-workspaces"&gt;cargo-workspaces&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;It’s a set of commands to manage cargo workspaces and their crates.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;publish&lt;/code&gt; command releases the packages from the CLI similarly to &lt;code&gt;cargo-release&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Byron/gitoxide/tree/main/cargo-smart-release"&gt;cargo-smart-release&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;Updates and publishes packages from the CLI.&lt;/li&gt;
&lt;li&gt;It’s very similar to release-plz, but it is not meant to be run in CI (see &lt;a href="https://github.com/MarcoIeni/release-plz/issues/13#issuecomment-1065790846"&gt;this&lt;/a&gt; comment from the author).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To respect the “Unix philosophy”, I tried to delegate the release flow to &lt;code&gt;cargo-release&lt;/code&gt; and &lt;code&gt;cargo-workspaces&lt;/code&gt;. However, after discussing with the maintainers &lt;a href="https://github.com/crate-ci/cargo-release/issues/298#issuecomment-1097442446"&gt;here&lt;/a&gt; and &lt;a href="https://github.com/pksunkara/cargo-workspaces/issues/69"&gt;here&lt;/a&gt;, I decided to implement the &lt;code&gt;release-plz release&lt;/code&gt; command by myself.&lt;/p&gt;

&lt;p&gt;Overall, I wasn’t satisfied with the existing Rust release tools because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They use git tags to determine if a package is already published — release-plz uses cargo registries instead.&lt;/li&gt;
&lt;li&gt;They primarily focus on the CLI use case — release-plz focuses mainly on CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Using release-plz increased my productivity. Having an automated release pipeline helps you deliver at a faster pace, with a lower risk of manual mistakes.&lt;/p&gt;

&lt;p&gt;If you try release-plz, please let me know on &lt;a href="https://twitter.com/MarcoIeni"&gt;Twitter&lt;/a&gt;. Also, make sure to open &lt;a href="https://github.com/MarcoIeni/release-plz/issues"&gt;issues&lt;/a&gt; for feature requests or bug reports!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>CKAD: 2021 tips, vimrc, bashrc and cheatsheet</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Mon, 06 Sep 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/marcoieni/ckad-2021-tips-vimrc-bashrc-and-cheatsheet-hp3</link>
      <guid>https://dev.to/marcoieni/ckad-2021-tips-vimrc-bashrc-and-cheatsheet-hp3</guid>
      <description>&lt;p&gt;You are probably busy studying for you exam right now, so I will try to be brief.&lt;/p&gt;

&lt;p&gt;In the following I will share the things that helped me the most in becoming a CKAD, while trying to avoid all generic tips you can find in all the other blog posts like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.marcoieni.com%2F2021%2F09%2Fckad-2021-tips-vimrc-bashrc-and-cheatsheet%2Fckad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.marcoieni.com%2F2021%2F09%2Fckad-2021-tips-vimrc-bashrc-and-cheatsheet%2Fckad.png" title="ckad" alt="ckad"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I only used &lt;code&gt;kubectl apply -f&lt;/code&gt; when interacting with yaml files: ignore &lt;code&gt;kubectl create&lt;/code&gt; and &lt;code&gt;kubectl replace&lt;/code&gt; for simplicity.&lt;/li&gt;
&lt;li&gt;The exam consists in 2 hours to score 66% on 19 questions, so make sure to flag the most difficult questions, so that you complete them at the end only if you still have time.&lt;/li&gt;
&lt;li&gt;Make sure to use bookmarks during the exam to be quicker. I used &lt;a href="https://github.com/reetasingh/CKAD-Bookmarks" rel="noopener noreferrer"&gt;these&lt;/a&gt; ones. You can use them in your additional browser tab.&lt;/li&gt;
&lt;li&gt;Edit the namespace when you copy paste a resource from the docs if it is hardcoded. See &lt;a href="https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource" rel="noopener noreferrer"&gt;network policy&lt;/a&gt; for example, which will be applied to the &lt;code&gt;default&lt;/code&gt; namespace if you don’t edit it.&lt;/li&gt;
&lt;li&gt;Learn how to use &lt;code&gt;less&lt;/code&gt;. I find very useful to pipe k8s resources into it. For example:

&lt;ul&gt;
&lt;li&gt;You can search by typing &lt;code&gt;/&lt;/code&gt; (like vim).&lt;/li&gt;
&lt;li&gt;You can toggle case sensitive search by typing &lt;code&gt;-i&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  .bashrc
&lt;/h2&gt;

&lt;p&gt;You can define aliases in your &lt;code&gt;.bashrc&lt;/code&gt;, so that you don’t have to type long commands during the exam.&lt;/p&gt;

&lt;p&gt;You can copy-paste the first lines from &lt;a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/" rel="noopener noreferrer"&gt;here&lt;/a&gt; at the beginning of your exam. You have to memorize the rest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# enable autocompletion
source &amp;lt;(kubectl completion bash)

alias k=kubectl
complete -F __start_kubectl k # autocomplete k

# get yaml object instead of applying the changes
alias kd="kubectl --dry-run=client -o yaml"
complete -F __start_kubectl kd

alias ka="kubectl apply -f"

# delete resources immediately
alias kD="kubectl delete --grace-period=0 --force"
complete -F __start_kubectl kD

# delete resources immediately from file
alias kDf="kubectl delete --grace-period=0 --force -f"

# In the following, $1 is the filepath of a yaml k8s object.

# vim apply. edit a file and immediately apply it.
va() {
  vim $1
  ka $1
}

# kubectl edit. Delete the resource of a file, edit and apply it.
ke() {
  kDf $1
  va $1
}

# kubectl replace. Delete and recreate the same resource.
kr() {
  kDf $1
  ka $1
}

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

&lt;/div&gt;



&lt;p&gt;After you have edited your &lt;code&gt;.bashrc&lt;/code&gt; run the command &lt;code&gt;source ~/.bashrc&lt;/code&gt; to apply the changes in your current shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  .vimrc
&lt;/h2&gt;

&lt;p&gt;At the beginning of your exam, edit your &lt;code&gt;~/.vimrc&lt;/code&gt; file, in order to edit yaml files efficiently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set nu # set numbers
set tabstop=2 shiftwidth=2 expandtab # use 2 spaces instead of tab
set ai # autoindent: when go to new line keep same indentation

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cheatsheet
&lt;/h2&gt;

&lt;p&gt;Here is a very long list of imperative commands I found useful for the exam.&lt;/p&gt;

&lt;p&gt;create a deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k create deploy nginx
  --image nginx:1.16
  --replicas 4
  --port 8080 # container port
  -- ls /home # command

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

&lt;/div&gt;



&lt;p&gt;create a pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k run nginx
  --image=nginx
  --restart=Never
  -l="key1=value1,key2=value2" # multiple labels
  --env="COLOR=blue" --env="KEY3=val3" # multiple environment variables
  --port=5701 # container port
  --expose # create a ClusterIP service
  --rm -it # delete the pod after completed and open a terminal
  -- /bin/sh -c "while true; do date; sleep 10; done" # command

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

&lt;/div&gt;



&lt;p&gt;create a new Service to expose an existing Deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k expose deploy test
  --port=80
  --target-port=8000
  --type NodePort # optional
  --name my-service

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

&lt;/div&gt;



&lt;p&gt;create a new service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k create svc clusterip pod-name # service with app=pod-name as label
  --tcp=6379:6379 # &amp;lt;port&amp;gt;:&amp;lt;targetPort&amp;gt;

k create svc nodeport pod-name
  --tcp=80:80 # &amp;lt;port&amp;gt;:&amp;lt;targetPort&amp;gt;
  --node-port=30080

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

&lt;/div&gt;



&lt;p&gt;create job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k create job nginx
  --image=nginx
  -- /bin/sh -c 'counter=0; \
     while [$counter -lt 3]; do counter=$((counter+1)); \
     sleep 3; done;'

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

&lt;/div&gt;



&lt;p&gt;create cronjob:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k create cj nginx
  --image=nginx
  --schedule="* * * * *"
  -- /bin/sh -c 'echo "current date: $(date)"'

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

&lt;/div&gt;



&lt;p&gt;create configmap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k create cm app-config
  --from-literal=key123=value123

k create cm app-config
  --from-env-file=config.env # single file with environment variables

k create cm app-config
  --from-file=config.txt # single file or directory

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

&lt;/div&gt;



&lt;p&gt;create secret:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k create secret generic my-secret
  --from-literal=foo=bar

# you also have the other options as above for the configmap

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

&lt;/div&gt;



&lt;p&gt;decode a secret:&lt;code&gt;echo "YmFy" | base64 --decode&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;create service account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k create sa my-sa

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

&lt;/div&gt;



&lt;p&gt;override the image of a deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k set image deploy my-deployment my-container-name=nginx:1.9.1
  --record # save the "CHANGE-CAUSE" in the deployment history

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

&lt;/div&gt;



&lt;p&gt;get pods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k get po
  -l color=green,app!=my-app # label equality filter
  -l 'color in (green, red)' # label set filter
  -l 'color notin (green, red)' # notin filter
  -l 'color exists' # exists filter
  --show-labels # show all labels

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

&lt;/div&gt;



&lt;p&gt;rollouts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k rollout status deploy nginx

k rollout history deploy nginx
  --revision=1 # specify revision (optional)

k rollout undo deploy nginx
  --to-revision=1 # optional

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

&lt;/div&gt;



&lt;p&gt;how to access a pod exposed by a ClusterIp with a timeout of 5 seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k run busybox --image=busybox --restart=Never -it -- /bin/sh
# wget -O- 10.96.32.32:80 -T 5

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

&lt;/div&gt;



&lt;p&gt;open pod shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k exec -it my-pod -- /bin/sh

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

&lt;/div&gt;



&lt;p&gt;create resource quota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create quota myrq --hard=cpu=1,memory=1G,pods=2

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

&lt;/div&gt;



&lt;p&gt;view docs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k explain pods.spec

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

&lt;/div&gt;



&lt;p&gt;get all the events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k get events --sort-by=.metadata.creationTimestamp

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

&lt;/div&gt;



&lt;p&gt;modify objects label:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k label nodes my-node color=blue # add a label to node
k label pod my-pod region=eu # add a label to pod
k label pod my-pod region=us --overwrite # edit a label
k label pod my-pod region- # remove a label

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

&lt;/div&gt;



&lt;p&gt;modify objects annotations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k annotate ... # (same usage as k label)

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

&lt;/div&gt;



&lt;p&gt;edit namespace for all subsequent kubectl commands in the same context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k config set-context --current --namespace=core-banking

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

&lt;/div&gt;



&lt;p&gt;horizontal pod autoscaler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k autoscale deploy my-deploy
  --cpu-percent=70 # sum of the cpu percentages used by all the pods that needs to be reached for the hpa to start spinning other pods
  --min=2 # min number of pods
  --max=8 # max number of pods the HPA can scale

k get hpa

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

&lt;/div&gt;



&lt;p&gt;taints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# apply taint
k taint nodes my-node my-key=my-value:NoSchedule

# remove taint
k taint nodes my-node my-key=my-value:NoSchedule-

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Theory
&lt;/h2&gt;

&lt;p&gt;I studied for the CKAD by watching the CKAD &lt;a href="https://kodekloud.com/courses/certified-kubernetes-application-developer-ckad/" rel="noopener noreferrer"&gt;course&lt;/a&gt; by Mumshad Mannambeth, which is simply awesome and it contains very useful labs, too. I also read the CKAD &lt;a href="https://www.amazon.com/Certified-Kubernetes-Application-Developer-Depth/dp/1492083739/" rel="noopener noreferrer"&gt;book&lt;/a&gt; from O’Reilly, which I recommend if you want a written resource, too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice
&lt;/h2&gt;

&lt;p&gt;This is an hands-on exam, so of course you need to practice a lot. These are some useful resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/subodev/50-questions-for-ckad-and-cka-exam-3bjm"&gt;https://dev.to/subodev/50-questions-for-ckad-and-cka-exam-3bjm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam-2f42d1228552" rel="noopener noreferrer"&gt;https://medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam-2f42d1228552&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dgkanatsios/CKAD-exercises" rel="noopener noreferrer"&gt;https://github.com/dgkanatsios/CKAD-exercises&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you complete these and the labs of the CKAD course you will be probably ready for the exam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shortcuts
&lt;/h2&gt;

&lt;p&gt;Time is precious! Use the corresponding shorcut of a k8s resource instead of its fullname.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fullname&lt;/th&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;configmaps&lt;/td&gt;
&lt;td&gt;cm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;namespaces&lt;/td&gt;
&lt;td&gt;ns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;persistentvolumeclaims&lt;/td&gt;
&lt;td&gt;pvc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;persistentvolumes&lt;/td&gt;
&lt;td&gt;pv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pods&lt;/td&gt;
&lt;td&gt;po&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serviceaccounts&lt;/td&gt;
&lt;td&gt;sa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;services&lt;/td&gt;
&lt;td&gt;svc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deployments&lt;/td&gt;
&lt;td&gt;deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replicasets&lt;/td&gt;
&lt;td&gt;rs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;horizontalpodautoscalers&lt;/td&gt;
&lt;td&gt;hpa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cronjobs&lt;/td&gt;
&lt;td&gt;cj&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jobs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;secrets&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;networkpolicies&lt;/td&gt;
&lt;td&gt;netpol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;resourcequotas&lt;/td&gt;
&lt;td&gt;quota&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Verify your work
&lt;/h2&gt;

&lt;p&gt;After you are done (or when you are short of time) you should verify what you have done.&lt;/p&gt;

&lt;p&gt;First of all run &lt;code&gt;k get po --all-namespaces&lt;/code&gt; in every context to check that all pods are running.&lt;/p&gt;

&lt;p&gt;After that, you can check if every resource was applied successfully:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;configmaps and secret: &lt;code&gt;k exec my-pod -- env&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;volumes: &lt;code&gt;k exec my-pod -- ls /mount/volume/path&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;services: &lt;code&gt;k get ep&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Overall preparing for the certification was really helpful and the exam itself is really practical, so I highly recommend it! 🤓&lt;/p&gt;

&lt;p&gt;The most important tip I can give is the following: I probably practiced too much for it, ending up scoring 99%. If the score is not important for you (the score is not written anywhere in the certification) just try it when you feel a little bit confident! Remember: you have two attempts!&lt;/p&gt;

&lt;p&gt;Good luck with your exam: stay calm and focus ✌&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My 2020 Recap: Open Source, talks, meetups and more!</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Sat, 02 Jan 2021 21:30:44 +0000</pubDate>
      <link>https://dev.to/marcoieni/my-2020-recap-open-source-talks-meetups-and-more-4o2e</link>
      <guid>https://dev.to/marcoieni/my-2020-recap-open-source-talks-meetups-and-more-4o2e</guid>
      <description>&lt;p&gt;I am not a huge fan of year recaps or new year's resolutions.&lt;br&gt;
Mainly because I don't like thinking about the past in general or setting goals for the future.&lt;br&gt;
I like to focus on the present, following my curiosity day by day and if I realize I want to accomplish&lt;br&gt;
something I don't wait the new year to do it, but &lt;em&gt;I try&lt;/em&gt; to start as soon as possible.&lt;/p&gt;

&lt;p&gt;However, retrospectives are powerful, you can analyze what has gone wrong in order to try to improve it. Plus 2020 was..2020!&lt;br&gt;
And together with all the tons of terrible stuff that happened to us, in the future I would like to&lt;br&gt;
remember 2020 also for the nice things I accomplished this year. So let's start!&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source contributions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MBEPEIqY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2021/01/my-2020-recap-open-source-talks-meetups-and-more/gh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MBEPEIqY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2021/01/my-2020-recap-open-source-talks-meetups-and-more/gh.png" alt="contributions" width="880" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This year we had a lot of free time. The problem was that we had to spend it at home.&lt;br&gt;
I used a big part of that to contribute to open source software. Why? Glad you asked!&lt;br&gt;
Writing open source software is a really good opportunity to learn and to improve the world a little bit at the same time.&lt;/p&gt;

&lt;p&gt;This was the year of Rust for me: most of the time at my laptop was spent on learning and working with programming language.&lt;br&gt;
After reading &lt;a href="https://doc.rust-lang.org/book/"&gt;the book&lt;/a&gt; and doing exercises and pet projects&lt;br&gt;
you have to go in the wild and receive some code reviews, i.e. someone more experienced than you&lt;br&gt;
has to tell you why your code sucks:&lt;br&gt;
contributing to open source software is just the best way to achieve this goal!&lt;/p&gt;

&lt;h3&gt;
  
  
  Rust
&lt;/h3&gt;

&lt;p&gt;Personal projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/stm32f407-rs"&gt;stm32f407 experiments&lt;/a&gt;: A bunch of personal experiments with STM32f407G-DISC1 and rust.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rust-github.github.io/"&gt;Rust GitHub Template&lt;/a&gt;: A template to create an amazing rust project hosted on GitHub in no time. (51 ⭐ on GitHub)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/MarcoIeni/poke-speare"&gt;Poke Speare&lt;/a&gt;: Toy project to experiment with rust async, actix, reqwest and wiremock.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/poetry-book"&gt;Poetry book builder&lt;/a&gt;: My first rust project, a pet project not worth checking out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rust-unofficial/patterns"&gt;design patterns book&lt;/a&gt;: On december I started maintaining the design patterns repository. Me and &lt;a href="https://github.com/simonsan"&gt;simonsan&lt;/a&gt; just converted it into a lovely &lt;a href="https://rust-unofficial.github.io/patterns/"&gt;rust book&lt;/a&gt;. 📖&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dandavison/delta/commits?author=MarcoIeni"&gt;delta&lt;/a&gt;: Solved almost 100 clippy warnings, implemented CI and CD with GitHub actions, helped solving a &lt;a href="https://github.com/dandavison/delta/issues/463"&gt;really interesting bug&lt;/a&gt; which I plan to discuss in my YouTube channel. Plus there is this (thanks Dan 🙏):
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r4OXcu4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2021/01/my-2020-recap-open-source-talks-meetups-and-more/thanks.png" alt="thanks" width="880" height="474"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/LukeMathWalker/wiremock-rs/commits?author=MarcoIeni"&gt;wiremock-rs&lt;/a&gt;: improved error messages and documentation.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sharkdp/bat/commits?author=MarcoIeni"&gt;bat&lt;/a&gt;: fixed clippy warnings.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tiborschneider/rofi-rs/commits?author=MarcoIeni"&gt;rofi-rs&lt;/a&gt;: fixed cippy warnings, added CI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rust-embedded/svd/commits?author=MarcoIeni"&gt;svd&lt;/a&gt;: implemented GitHub actions mainly.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/stm32-rs/svdtools/issues/9"&gt;svdtoold&lt;/a&gt;: worked too much on an issue which sadly was forgotten..This is part of open source, too. 😔 Silver lining: I learned a lot of rust by working on this! 🤓&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sharkdp/fd/pull/524"&gt;fd&lt;/a&gt;: solved a very simple issue starting from a very complex solution that was over-engineered at best 😂&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/stm32-rs/stm32-rs/commits?author=MarcoIeni"&gt;stm32-rs&lt;/a&gt;: Improved CI, documentation and fixed some devices. In this repo overall I added 95 lines and I removed 3451 lines..neat 😎
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bpyZo9p6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2021/01/my-2020-recap-open-source-talks-meetups-and-more/addless.png" alt="difference" width="422" height="94"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For obvious reasons I've excluded opened issues, support to users and little PRs like small documentation fixes (even if &lt;a href="https://github.com/rust-lang/rust/pull/80410"&gt;this&lt;/a&gt; one is special because it belongs to the rust repo 🧡).&lt;/p&gt;

&lt;h3&gt;
  
  
  VHDL
&lt;/h3&gt;

&lt;p&gt;Learning a new language every year is really important.&lt;br&gt;
If possible you should learn a language that belongs to a different programming paradigm&lt;br&gt;
with respect to what you are used to.&lt;br&gt;
Well, what's better than a language used to describe hardware for that? 🤩&lt;/p&gt;

&lt;p&gt;If you want to experience the same feelings you had while learning your first programming language or&lt;br&gt;
if you think you know everything about parallel programming you should really learn vhdl.&lt;br&gt;
It's totally different from what I was used to and learning it was really really funny.&lt;/p&gt;

&lt;p&gt;I published:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/VUnit/vunit_action"&gt;VUnit action&lt;/a&gt;: a GitHub action for VUnit that was moved to the official VUnit organization (yay 😁).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/vhdl-examples"&gt;Vhdl examples&lt;/a&gt;: A bunch of personal Vhdl experiments tested in a CI with VUnit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  VSpaceCode
&lt;/h3&gt;

&lt;p&gt;I love spacemacs, and I bring its key bindings into every editor I use. &lt;br&gt;
In 2019 I already created &lt;a href="https://github.com/MarcoIeni/spaceclipse"&gt;spaceclipse&lt;/a&gt; and &lt;a href="https://github.com/MarcoIeni/intellimacs"&gt;intellimacs&lt;/a&gt; (which counts 249 ⭐ on GitHub at the moment), but&lt;br&gt;
what me, &lt;a href="https://github.com/stevenguh"&gt;Steven&lt;/a&gt; and all the contributors are doing with &lt;a href="https://vspacecode.github.io/"&gt;VSpaceCode&lt;/a&gt; is amazing!&lt;br&gt;
We have 726 ⭐ and 3963 installs! It really feels like it's the best of both worlds (full blown ready to use IDE vs spacemacs workflow).&lt;/p&gt;

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

&lt;p&gt;I posted 6 articles on my website and 5 videos in my YouTube channel. Oh, right, I opened a YouTube channel in September!&lt;br&gt;
I have 40 subscribers right now so there is a lot of room for improvements there and next year I will upload other rust contents for sure!&lt;/p&gt;

&lt;h2&gt;
  
  
  Daily job
&lt;/h2&gt;

&lt;p&gt;Even if it is only a small entry in this post, my daily job is of course what occupies most of my time.&lt;/p&gt;

&lt;p&gt;This year I realized I want to work with rust full time, not only during weekends.&lt;br&gt;
So, on November I joined &lt;a href="https://truelayer.com/"&gt;True Layer&lt;/a&gt;, which is what I consider the best&lt;br&gt;
decision I have ever made in my career (which honestly is not that long anyway 😂).&lt;/p&gt;

&lt;p&gt;True Layer is amazing, both from a human and a technical perspective.&lt;br&gt;
I am learning a lot of stuff about rust and the cloud native world and even if we are remote I feel very well connected&lt;br&gt;
with my team (which is amazing by the way 😁).&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Saturday Italy
&lt;/h2&gt;

&lt;p&gt;Contributing to open source is funny, but doing it together it's better. That's why &lt;br&gt;
starting from the idea of &lt;a href="https://www.meetup.com/Open-Source-Saturday-Milano/"&gt;Open Source Saturday Milano&lt;/a&gt; I created&lt;br&gt;
&lt;a href="https://oss-italy.github.io/"&gt;Open Source Saturday Italy&lt;/a&gt;, the online version, useful for people who lives in small cities with no meetups and compatible with&lt;br&gt;
our beloved covid restrictions!&lt;/p&gt;

&lt;p&gt;We meet on Saturday online on discord and we do some pair programming.&lt;br&gt;
You cannot imagine how much I learned from these events and how many nice and talented people I've known.&lt;/p&gt;

&lt;p&gt;If you like the idea you can create an Open Source Saturday for your own area! 😁&lt;/p&gt;

&lt;h2&gt;
  
  
  Talks
&lt;/h2&gt;

&lt;p&gt;This year I gave two talks (remotely of course 🙃).&lt;br&gt;
The first one was at the Italian Linux Day, where I talked about how to avoid using the mouse for the&lt;br&gt;
sake of a better workflow.&lt;br&gt;
The second one was at the Rust Milano Meetup and it was called &lt;a href="https://www.meetup.com/rust-language-milano/events/274315007/"&gt;How to create an awesome Rust project on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are interested I recorded two YouTube videos that have almost the same content, you can find them &lt;a href="https://www.youtube.com/watch?v=0aQGy0sQiUU&amp;amp;t=227s"&gt;here&lt;/a&gt; and &lt;a href="https://www.youtube.com/watch?v=meAz2RQMHvM&amp;amp;t=1770s"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mentorship
&lt;/h2&gt;

&lt;p&gt;In September I joined the &lt;a href="https://rustbeginners.github.io/awesome-rust-mentors/"&gt;awesome rust mentors&lt;/a&gt; army. 🤠&lt;/p&gt;

&lt;p&gt;I was contacted by almost 10 people (I should check old messages on all socials for the exact number).&lt;br&gt;
They were really nice overall and I think I was able to help all of them in a way or another. 😀&lt;/p&gt;

&lt;h2&gt;
  
  
  Certifications
&lt;/h2&gt;

&lt;p&gt;In July I attended the Computer Engineer Professional examination, which is what in Italy&lt;br&gt;
we call "Esame di stato".&lt;/p&gt;

&lt;p&gt;It was a good excuse to review old University notes and learn new concepts at the same time.&lt;br&gt;
In particular, the ethical aspect of our profession is something it's always underestimated and it&lt;br&gt;
was really pleasant to go through our formal codes of ethics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Personal life
&lt;/h2&gt;

&lt;p&gt;I like to keep most of my personal life offline.&lt;br&gt;
Just wanted to say I've been really lucky, since all my family is doing well.&lt;/p&gt;

&lt;p&gt;Also, I started playing guitar again after 5 years or so and it's a great way to switch context from programming and have some mental rest! 🎸&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I am very glad my profession allows me to do all this amazing stuff from a 600€ laptop.&lt;br&gt;
Other people like musicians, actors, etc. aren't so lucky, so we, as developers, should appreciate this possibility every day.&lt;/p&gt;

&lt;p&gt;My 2021 resolutions are the same of 2020:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have fun&lt;/li&gt;
&lt;li&gt;Be curious&lt;/li&gt;
&lt;li&gt;Make the world a better place (even a little bit!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe also "do better new year's resolutions?". The point is that 90% of what I have done this year&lt;br&gt;
wasn't predictable at all in December 2019. I mean..starting a meetup, switching my full time job from&lt;br&gt;
embedded to rust backend development..really? 🙂&lt;/p&gt;

&lt;p&gt;Of course I have long term goals, like learning Haskell, improving my kubernetes skills, recording more YouTube videos or start watching Game of Thrones.&lt;br&gt;
But I feel like seriously writing them down and assigning a deadline will prevent me from doing random stuff&lt;br&gt;
that just came to my mind the day before while I was going to bed. 😅&lt;/p&gt;

&lt;p&gt;So actually not having proper new year's resolutions is the way to go for me in 2021.&lt;br&gt;
Let's see if I will change my mind in 2022. 😁&lt;/p&gt;

</description>
      <category>rust</category>
      <category>open</category>
      <category>source</category>
    </item>
    <item>
      <title>Rust makes cross compilation child's play</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Sat, 05 Dec 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/marcoieni/rust-makes-cross-compilation-child-s-play-4e4g</link>
      <guid>https://dev.to/marcoieni/rust-makes-cross-compilation-child-s-play-4e4g</guid>
      <description>&lt;h2&gt;
  
  
  Why do I care about this
&lt;/h2&gt;

&lt;p&gt;Recently I solved &lt;a href="https://github.com/dandavison/delta/issues/396"&gt;this&lt;/a&gt; delta issue, where the maintainer asked to switch from Travis CI to GitHub actions.&lt;/p&gt;

&lt;p&gt;These are all the pull requests I’ve done if you want to have a look at this journey:&lt;a href="https://github.com/dandavison/delta/pull/399"&gt;#399&lt;/a&gt;, &lt;a href="https://github.com/dandavison/delta/pull/400"&gt;#400&lt;/a&gt;,&lt;a href="https://github.com/dandavison/delta/pull/409"&gt;#409&lt;/a&gt;, &lt;a href="https://github.com/dandavison/delta/pull/411"&gt;#411&lt;/a&gt;,&lt;a href="https://github.com/dandavison/delta/pull/413"&gt;#413&lt;/a&gt;, &lt;a href="https://github.com/dandavison/delta/pull/417"&gt;#417&lt;/a&gt;and finally &lt;a href="https://github.com/dandavison/delta/pull/418"&gt;#418&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And yes..As you can see I like small incremental work and early feedback instead of giant pull requests. 😁&lt;/p&gt;

&lt;p&gt;Anyway, the delta project has a lot of compilation targets and the binaries are automatically released in the GitHub releases &lt;a href="https://github.com/dandavison/delta/releases"&gt;page&lt;/a&gt; every time the project is tagged. Sweet. 😌&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AsRQv0vE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2020/12/rust-makes-cross-compilation-childs-play/delta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AsRQv0vE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2020/12/rust-makes-cross-compilation-childs-play/delta.png" alt="delta releases" title="Releases" width="800" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From an x86_64 architecture (TLDR: common 64 bit Intel or AMD processors) it is really straightforward to compile for a different operating system with &lt;code&gt;cargo&lt;/code&gt; if you are targeting the same architecture. For example if you want to compile for macOS you just need to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rustup target add x86_64-apple-darwin
cargo build --target x86_64-apple-darwin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problems start to arise when you want to compile for a different architecture, such as i686 (32 bit) or ARM processors. In this case, you have to install some dependencies and set some environment variables, which may be painful. For example, in the old continuous integrations scripts of delta,&lt;a href="https://github.com/dandavison/delta/blob/15d06cbf7584570ec3b5beaba99cb8898f9ec3dc/etc/ci/before_install.sh"&gt;this&lt;/a&gt; was the way dependencies were installed. Ugly, I know. As rust developers we are used to great tools, so there must be a better way right?&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Cross
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Zero setup” cross compilation and “cross testing” of Rust crates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the description of the &lt;a href="https://github.com/rust-embedded/cross"&gt;Cross&lt;/a&gt; tool.&lt;/p&gt;

&lt;p&gt;The TLDR is that it let you compile and test rust projects for architectures other than i686 and x86_64.&lt;/p&gt;

&lt;p&gt;Instead of doing &lt;code&gt;cargo build --target &amp;lt;YOUR_TARGET&amp;gt;&lt;/code&gt; you simply do &lt;code&gt;cross build --target &amp;lt;YOUR_TARGET&amp;gt;&lt;/code&gt;. Based on the target, in fact, cross will run a docker image that has all the right dependencies already installed and configured by the rust-embedded team itself. 😉 And that’s it..just run &lt;code&gt;cargo install cross&lt;/code&gt; and you are ready to cross-compile for all&lt;a href="https://github.com/rust-embedded/cross#supported-targets"&gt;these&lt;/a&gt; targets in rust, no other dependency is required, except docker of course!&lt;/p&gt;

&lt;p&gt;Obviously this was not an exhaustive overview about cross and I encourage you to have a look at the GitHub page if you are interested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross in GitHub actions
&lt;/h2&gt;

&lt;p&gt;Of course, after a whole morning getting mad trying to setup weird ubuntu dependencies for the delta issue, when I found out about cross I felt very stupid for not knowing it in advance and I tried to integrate it in the Continuous Deployment delta pipeline.&lt;/p&gt;

&lt;p&gt;It turns out that this is like the easiest thing in the world! The &lt;a href="https://github.com/actions-rs/cargo"&gt;action-rs/cargo&lt;/a&gt; action I was already using had built-in &lt;a href="https://github.com/actions-rs/cargo#cross-compilation"&gt;support&lt;/a&gt; for cross. Now I even felt more stupid, but anyway..you just need to set the &lt;code&gt;use-cross&lt;/code&gt; variable to &lt;code&gt;true&lt;/code&gt; and you are done!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dandavison/delta/blob/e198c0d841d9fb660e59e0329235a8601b407c69/.github/workflows/cd.yml#L32-L37"&gt;This&lt;/a&gt; is the step that builds the whole delta project for all its different targets..easy, right? 😀&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross in Rust GitHub template
&lt;/h2&gt;

&lt;p&gt;You may or (probably) may not be aware of &lt;a href="https://rust-github.github.io/"&gt;Rust GitHub Template&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Rust GitHub Template is a template for cargo generate that aims to be a starting point suitable for the vast majority of rust projects that will be hosted on GitHub.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Beyond all its nice goodies, this template will setup Continuous Deployment for you, therefore whenever you tag your project, it will be published on &lt;code&gt;crates.io&lt;/code&gt; and the binaries will be released in the GitHub Releases page, just like in delta. 😁&lt;/p&gt;

&lt;p&gt;Until today, Rust GitHub template only supported x86_64 windows, linux and mac, but after I found out Cross I couldn’t resist and I added support for i686 and aarch64 linux architectures, which are both two &lt;a href="https://doc.rust-lang.org/nightly/rustc/platform-support.html"&gt;tier 1&lt;/a&gt; rust targets. In practice, this means your “old thinkpad” and “raspberry pi” users will thank you a lot. 😛&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HtT1-PxV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2020/12/rust-makes-cross-compilation-childs-play/rust-gh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HtT1-PxV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2020/12/rust-makes-cross-compilation-childs-play/rust-gh.png" alt="gh template releases" title="Releases" width="476" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rust-github/rust-gh-example/blob/01e0aae91f83e1e932f4498a0eddb2905c8fffc3/.github/workflows/cd.yml#L57-L63"&gt;This&lt;/a&gt; is an example of the resulting Continuous Deployment step.&lt;/p&gt;

&lt;p&gt;And that was it, after I spent a lot of &lt;em&gt;very useful&lt;/em&gt; time trying to setup compilation dependencies basically I just wanted to share my love for the &lt;code&gt;cross&lt;/code&gt;tool with the rest of the world in order to avoid this pain to as many people as possible. 😅&lt;/p&gt;

&lt;p&gt;Thanks for reading this far! You can find me on &lt;a href="https://twitter.com/MarcoIeni"&gt;twitter&lt;/a&gt; or &lt;a href="https://www.youtube.com/MarcoIeni"&gt;YouTube&lt;/a&gt;, bye! 👋&lt;/p&gt;

</description>
      <category>rust</category>
      <category>cross</category>
    </item>
    <item>
      <title>📽 2 videos about rust code coverage in VSCode</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Sun, 11 Oct 2020 10:18:28 +0000</pubDate>
      <link>https://dev.to/marcoieni/2-videos-about-rust-code-coverage-in-vscode-38kf</link>
      <guid>https://dev.to/marcoieni/2-videos-about-rust-code-coverage-in-vscode-38kf</guid>
      <description>&lt;h1&gt;
  
  
  Useless personal stuff
&lt;/h1&gt;

&lt;p&gt;It's several years now that I feel the need to share what I learn with other people.&lt;br&gt;
  I gained so much value from free online content that at this point I consider&lt;br&gt;
  immoral for me to not give back something to the community.&lt;/p&gt;

&lt;p&gt;I started my sharing process one year ago with my &lt;a href="https://www.marcoieni.com/"&gt;personal website&lt;/a&gt; and it has&lt;br&gt;
  been great!&lt;br&gt;
  However, in general I prefer videos to text, because I can watch them on the&lt;br&gt;
  go, while I am eating something and so on.&lt;br&gt;
  Making videos is something I wanted to do for a long time and now finally I&lt;br&gt;
  declare procrastination over (at the moment, at least 😅).&lt;/p&gt;
&lt;h1&gt;
  
  
  Code coverage in VSCode
&lt;/h1&gt;

&lt;p&gt;We will use the following three tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://crates.io/crates/cargo-tarpaulin"&gt;cargo tarpaulin&lt;/a&gt;: analyzes your rust code and gives you code coverage data&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://crates.io/crates/cargo-watch"&gt;cargo watch&lt;/a&gt;: run =cargo tarpaulin= every time we save the file&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters"&gt;coverage gutters&lt;/a&gt;: show covered lines on VSCode&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  First video: basics
&lt;/h2&gt;

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

&lt;p&gt;In the first video I explain the basics that will allow you to display which&lt;br&gt;
   lines are covered by your tests in VSCode.&lt;/p&gt;
&lt;h2&gt;
  
  
  Second video: let's automatize the process
&lt;/h2&gt;

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

&lt;p&gt;I shot the second one after some really helpful feedback by some &lt;a href="https://www.reddit.com/r/rust/comments/j0ribi/rust_code_coverage_in_vscode/"&gt;reddit&lt;/a&gt; users.&lt;br&gt;
   I show how to automatize the process with cargo watch.&lt;/p&gt;

&lt;h1&gt;
  
  
  Give me feedback!
&lt;/h1&gt;

&lt;p&gt;These are one of my first videos and as you can hear my English is far from&lt;br&gt;
  perfect, but I'm trying to improve.&lt;br&gt;
  Please give me feedback regarding any aspect of these videos that you think I&lt;br&gt;
  can improve.&lt;/p&gt;

&lt;p&gt;Anyway, I was very happy to receive users feedback after my first video:&lt;br&gt;
  it looks like sharing what you know is a really good way to learn what you don't. 😉&lt;/p&gt;

&lt;p&gt;I hope my two cents will be useful for someone, bye! 😀&lt;/p&gt;

</description>
      <category>rust</category>
      <category>vscode</category>
      <category>coverage</category>
    </item>
    <item>
      <title>Create an amazing Rust GitHub project in no time</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Sat, 05 Sep 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/marcoieni/create-an-amazing-rust-github-project-in-no-time-4d4b</link>
      <guid>https://dev.to/marcoieni/create-an-amazing-rust-github-project-in-no-time-4d4b</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Expectations on open source projects are becoming higher and higher everyday.If a project is not well documented and it doesn't have a test suite and a continuousintegration environment, it is very unlikely that it will be taken seriously bythe community.&lt;/p&gt;

&lt;p&gt;Luckily for us, the tools to create high quality projectsare becoming better and better at the same time, too.&lt;/p&gt;

&lt;p&gt;For example, &lt;a href="https://www.rust-lang.org/"&gt;rust&lt;/a&gt; provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the &lt;a href="https://doc.rust-lang.org/cargo/"&gt;cargo&lt;/a&gt; build system which includes built-in support for tests and documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rust-lang/rust-clippy"&gt;clippy&lt;/a&gt; static code analyzer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rust-lang/rustfmt"&gt;rustfmt&lt;/a&gt; auto formatting tool&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools are well established and they are used by all the relevant rust projects.The rust ecosystem, in fact, is really homogeneous, in the sense that the way youbuild, test, run and deploy a certain application/library is very standard.&lt;/p&gt;

&lt;p&gt;Therefore, when you are creating a new project, it's really likely that you canrecycle documentation and CI steps from your older projects or other bigger rustprojects out there..which is great, but as my java professor taught me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;if you are copying and pasting several times, you are almost surely doing it wrong!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that's exactly what I was doing..In fact, every time I had to create a new GitHub project, I was using the goodcopying and pasting technique on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the set of markdownfiles that GitHub asks you to fill, such as CONTRIBUTING.md, CHANGELOG.md, CODE_OF_CONDUCT.md, issueand pull request templates, and most importantly the README.md!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;files needed to setup the CI environment, most of the time GitHub actions, specifically.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, because of the standard tooling that rust provides, copying and pasting worksreally well on these files, because as we said, what works for one project will almost workfor another one. But we can do better than this..&lt;/p&gt;

&lt;h1&gt;
  
  
  cargo generate
&lt;/h1&gt;

&lt;p&gt;In order to avoid copying and pasting, there is the &lt;a href="https://github.com/ashleygwilliams/cargo-generate"&gt;cargo generate&lt;/a&gt; tool, which isdescribed as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a developer tool to help you get up and running quickly with a new Rust project by leveraging a pre-existing git repository as a template.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means that you can setup a template repository, with all the files youneed and you ask &lt;code&gt;cargo generate&lt;/code&gt; to create a project starting from thistemplate, by replacing project name and authors (and username &lt;a href="https://github.com/ashleygwilliams/cargo-generate/pull/164"&gt;soon&lt;/a&gt;?) with yours.&lt;/p&gt;

&lt;p&gt;After using this tool to create some rust embedded projects with really littleeffort, I immediately appreciated its power and so during these days I decidedto use it to create a new template that makes me skip the copying and pasting phase ofcreating a new rust project hosted on github.&lt;/p&gt;

&lt;h1&gt;
  
  
  Rust GitHub Template
&lt;/h1&gt;

&lt;p&gt;I have described the Rust GitHub Template on a &lt;a href="https://rust-github.github.io/"&gt;website&lt;/a&gt;, where I describedits features and instructions onhow to use it to create a new rust project.&lt;/p&gt;

&lt;p&gt;In short, it allows you to create a new rust project with documentation andGitHub actions such as automatic security checks, CI and CD already set up byonly specifying project name and GitHub username.You can see an example project generated by this template &lt;a href="https://github.com/rust-github/rust-gh-example"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As the Rust GitHub Template website states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop copy pasting tons of markdown and yaml files each time you start a new rust project. Let’s write them only once, together!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks, and I hope you enjoy using Rust GitHub Template!&lt;/p&gt;

</description>
      <category>rust</category>
      <category>github</category>
      <category>actions</category>
      <category>template</category>
    </item>
    <item>
      <title>Continuous integration with VHDL</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Sun, 19 Apr 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/marcoieni/continuous-integration-with-vhdl-4b8o</link>
      <guid>https://dev.to/marcoieni/continuous-integration-with-vhdl-4b8o</guid>
      <description>&lt;h1&gt;
  
  
  Skippable introduction
&lt;/h1&gt;

&lt;p&gt;During this lockdown (like almost everyone) I have a lot of free time, so I decidedto give a look at my to do list.In the &lt;strong&gt;looong&lt;/strong&gt; term goals part where you can find impossible goals like "savethe world" or "learn haskell" there was "learn vhdl", too.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Now or never&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's what I thought. So here I am, reading the awesome &lt;a href="http://freerangefactory.org/"&gt;free range vhdl&lt;/a&gt; bookand getting started with the first examples.I am debugging my nonsense signals produced by my nonsense code with &lt;a href="https://www.xilinx.com/products/design-tools/vivado/vivado-webpack.html"&gt;VivadoWebPACK&lt;/a&gt;, which has some limitations, but it's free and it's a decent tool if you are learning.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why writing tests
&lt;/h1&gt;

&lt;p&gt;Anyway, getting the output right and going to the next exercise reminded me ofold dark ages when I was hacking my &lt;code&gt;main&lt;/code&gt; and adding &lt;code&gt;print&lt;/code&gt; everywhere to know ifmy code was working.Yes, your code might work now, when the sun is high and you haven't touched asingle comma of your codebase. But what if new requirements comes in or you have tofix a bug? You will unavoidably have to change your code. At that point how willyou be sure that you didn't break anything?&lt;/p&gt;

&lt;p&gt;Yes, &lt;strong&gt;tests&lt;/strong&gt; is the right answer. 💯And once you get used to them I can ensure you will never go back!In particular, I get used to repeatable tests and big green check marks thatensure you that your program does not work only on your computer and that youhaven't forget to &lt;code&gt;git add&lt;/code&gt; some files.&lt;/p&gt;

&lt;p&gt;So I thought: "why don't I try to setup Continuous integration for a VHDL project?" 😀&lt;/p&gt;

&lt;h1&gt;
  
  
  CI for VHDL
&lt;/h1&gt;

&lt;p&gt;Easy, right? Unfortunately there was no GitHub actions that matched the word"vhdl" on the &lt;a href="https://github.com/marketplace?type=actions"&gt;github actions marketplace&lt;/a&gt;. And there's a very good reason forthat. Hardware description languages like VHDL or Verilog are not like commonprogramming languages where nowadays everything is open source.Most of the people, uses whatever the FPGA makerprovides them, which includes proprietary libraries and so on and of course thisstuff is not intended to be used with docker and things like that.&lt;/p&gt;

&lt;p&gt;Anyway, for my simple examples I didn't need vendor proprietary libraries,therefore I was free to explore open source solutions to run and tests my code 😀&lt;/p&gt;

&lt;p&gt;I choose to use &lt;a href="http://ghdl.free.fr/"&gt;ghdl&lt;/a&gt; (an open-source simulator for the VHDL language)and &lt;a href="https://vunit.github.io/"&gt;vunit&lt;/a&gt; (an open source unit testing framework for VHDL/SystemVerilog).&lt;/p&gt;

&lt;p&gt;It turns out that there is a really handy docker &lt;a href="https://hub.docker.com/r/ghdl/vunit"&gt;image&lt;/a&gt; hosted on the dockerhub, which provides both vunit and ghdl.&lt;/p&gt;

&lt;p&gt;It was super easy to create a GitHub action based on this image, so meet &lt;a href="https://github.com/marketplace/actions/vunit-action"&gt;VunitAction&lt;/a&gt;, a GitHub action that let you do CI with your VHDL projects!You can find how I used this action in my &lt;a href="https://github.com/vhdl-examples"&gt;vhdl examples&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So yes, finally there is at least one match for the word "vhdl" in the Githubaction Marketplace 😅&lt;/p&gt;

</description>
      <category>vhdl</category>
      <category>vunit</category>
      <category>ghdl</category>
      <category>ci</category>
    </item>
    <item>
      <title>Doc-org: org-mode + latex + docker = pdf</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Wed, 26 Feb 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/marcoieni/doc-org-org-mode-latex-docker-pdf-4lcd</link>
      <guid>https://dev.to/marcoieni/doc-org-org-mode-latex-docker-pdf-4lcd</guid>
      <description>&lt;h1&gt;
  
  
  Why plain text is better than word processors
&lt;/h1&gt;

&lt;p&gt;I was so tired of working with word processors like Microsoft Word that I created &lt;del&gt;yet another&lt;/del&gt; a documentation system based on plain text.&lt;/p&gt;

&lt;p&gt;With plain text you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use git&lt;/li&gt;
&lt;li&gt;easily see differences between a version and another&lt;/li&gt;
&lt;li&gt;use grep and other basic utilities&lt;/li&gt;
&lt;li&gt;generate documents automatically with simple scripts&lt;/li&gt;
&lt;li&gt;use my favorite editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, with plain text I am free to do whatever I want.&lt;/p&gt;

&lt;h1&gt;
  
  
  Alternatives to word processors
&lt;/h1&gt;

&lt;p&gt;The first thing you need in order to create a documentation system based on plain text is to choose a markup language.After many years of experiments with markdown, asciidoc and so on, I fell in love with org-mode.You can search for online demos if you don't believe me: if you are comfortable with emacs, there is nothingbetter than writing documents using org-mode.&lt;/p&gt;

&lt;p&gt;Anyway, emacs does not reinvent the wheel and so there isn't a direct way to convert org-mode to pdf.What it does instead, is to translate org-mode into latex, which is the best language to create pdf files in my opinion.&lt;/p&gt;

&lt;p&gt;So, by using emacs, you can export org-mode to latex in order to avoid writing directly in latex, which is too much verboseand it's not very readable until you export it.&lt;/p&gt;

&lt;p&gt;This is how I have done my MSc &lt;a href="https://github.com/MarcoIeni/msc-thesis"&gt;thesis&lt;/a&gt; and overall I was happy of the final result.Anyway, when you try to mix your own latex customizations with latex automatically exported by emacs, it becomesa little bit difficult to achieve what you want.&lt;/p&gt;

&lt;p&gt;That's why emacs has a &lt;code&gt;body-only&lt;/code&gt; export option, which let you export only the body of your document.In this way you can have full control of your latex customizations.&lt;/p&gt;

&lt;h1&gt;
  
  
  Convincing your colleagues to migrate
&lt;/h1&gt;

&lt;p&gt;So, given for granted that org-mode + latex is the best way to create pdf files you still need to convince your colleagues toinstall emacs and latex on their machines and to learn how to use emacs.Basically this is not possible. 😅&lt;/p&gt;

&lt;p&gt;That's why I have created &lt;a href="https://github.com/doc-org/doc-org"&gt;doc-org&lt;/a&gt;, a command line utility based on docker that generates pdf files starting from org mode and latex.The only installation requirement is docker, therefore you/your colleagues don't need to install and learn how to use emacs and latex.Of course you can edit org-mode documents with any editor, you are not forced to use emacs..it's just plain text! 😎&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/doc-org/examples"&gt;Here&lt;/a&gt; there are tons of example documents that are automatically generated by using github actions.Yes, you can version your small plain text files with git and then automatically build the pdf after every &lt;code&gt;git push&lt;/code&gt;! 💪&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I am very happy I have started this project providing lots of toy examples.I hope that more companies leave behind the idea of word processors, becausethe best way to write documents together is the same of writing code together: plain text + version control systems like git.&lt;/p&gt;

&lt;p&gt;Checkout doc-org on &lt;a href="https://github.com/doc-org/doc-org"&gt;github&lt;/a&gt;. If you have problems/suggestions just open an issue. 🤓&lt;/p&gt;

</description>
      <category>docker</category>
      <category>latex</category>
      <category>orgmode</category>
      <category>pdf</category>
    </item>
    <item>
      <title>Linux on my 32GB windows tablet is surprisingly good</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Sat, 11 Jan 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/marcoieni/linux-on-my-32gb-windows-tablet-is-surprisingly-good-51a8</link>
      <guid>https://dev.to/marcoieni/linux-on-my-32gb-windows-tablet-is-surprisingly-good-51a8</guid>
      <description>&lt;h1&gt;
  
  
  Why I removed windows from my tablet
&lt;/h1&gt;

&lt;p&gt;I have a HP Pavilion X2 10-n105nl: an hybrid laptop/tablet with detachable keyboard and touch screen display. I bought it in 2016 in order to take notes at university with its keyboard and a Dell active stylus. It did its job pretty well, and for 210 euro I cannot complain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.marcoieni.com%2F2020%2F01%2Flinux-on-my-32gb-windows-tablet-is-surprisingly-good%2Fhp_laptop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.marcoieni.com%2F2020%2F01%2Flinux-on-my-32gb-windows-tablet-is-surprisingly-good%2Fhp_laptop.png" title="https://www.marcoieni.com/2020/01/linux-on-my-32gb-windows-tablet-is-surprisingly-good/hp_laptop.png" alt="https://www.marcoieni.com/2020/01/linux-on-my-32gb-windows-tablet-is-surprisingly-good/hp_laptop.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, time passes and windows gets bigger apparently. Now when it tries to download windows updates it complains that I have not enough space on the hard drive. So, I removed everything I installed on it, I created a new user and removed the old one. And the problem is still there. Even if I follow windows instructions and I put an external storage (a 64GB usb stick), it still needs additional 8 GB of free internal storage,which simply cannot be obtained, since almost all the available space of this tablet is occupied by windows itself.&lt;/p&gt;

&lt;p&gt;Of course, using a laptop without security updates is not an option, but even if you consider it, windowsbecame really slow on this device, even if you just browse the web.&lt;/p&gt;

&lt;p&gt;Basically this tablet became obsolete only after a couple of years.&lt;/p&gt;

&lt;h1&gt;
  
  
  Let's try linux on a tablet
&lt;/h1&gt;

&lt;p&gt;During these Christmas holidays I had a lot of free time, so I decided to try to bring back to life this "old" laptop by installing Linux on it. I have to be honest, I didn't have a lot of hopes because in my mind linux was not good on detachable tablets.&lt;/p&gt;

&lt;p&gt;First I tried pop os 19.10 and ubuntu 19.10. Since on my main laptop I run arch linux, I wanted to have a debian based machine.Well, I tried Bluetooth, wifi, touch screen and.. They all worked great!I was really surprised and happy to see this out of the box experience with linux on a tablet. The only problem was the speakers: no sound at all 😞&lt;/p&gt;

&lt;p&gt;I looked online in order to find a solution. I tried a couple of those on Pop os, but my laziness suddenly struck a critical hit,so I thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;why don't we try manjaro and see if sound works out of the box?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I downloaded Manjaro 18.1.5 KDE version, which is a DE I wanted to try. And yes! Sound worked out of the box, together with all the other things I tested before. If you are curious, I have 19,4GB of free storage even if manjaro KDE comes with &lt;del&gt;too much&lt;/del&gt; a lot of software preinstalled like libreoffice and thunderbird.&lt;/p&gt;

&lt;p&gt;Now I am comfortably writing this article on a plane, thanks to my small 12" manjaro linux tablet 😃&lt;/p&gt;

&lt;h1&gt;
  
  
  Is it perfect?
&lt;/h1&gt;

&lt;p&gt;Of course I bet that linux on this device doesn't do everything right, expecially without further tweaks. For example, one thing I noticed is that after that I close the lid, the device suspends correctly, but when I reopen it the touchpadtap to click doesn't work anymore.&lt;/p&gt;

&lt;p&gt;I am sure that there are other little things like this that I haven't encountered yet (this is not my main machine), but.. hey, at least it works!&lt;/p&gt;

&lt;h1&gt;
  
  
  Installation instructions
&lt;/h1&gt;

&lt;p&gt;In the following I put a short overview of what I did. If you have more specific question, please leave a comment down below.&lt;/p&gt;

&lt;p&gt;If you do not own this device you may not be interested in this chapter. In this case move to the end of the article for the conclusions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Save your windows licence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open windows prompt with admin priviledges and type
```
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;wmic path SoftwareLicensingService get OA3xOriginalProductKey&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Write down your windows license because you never know.

## Backup your data

They will be erased, together with your windows install.

## Update your bios

Go to the [hp support page](https://support.hp.com/us-en/drivers/selfservice/HP-Pavillion-10-x2-PC/8499312/model/9788451) of this tablet and download and install the latest bios version. At the time of writing it's the `F.18 Rev.A` version. I installed it through their windows program without problems.

## Flash manjaro ISO

Put manjaro image on a USB stick. I used etcher to flash it. Plug the USB stick in.

## Disable secure boot

Reboot your laptop and press `Esc` repeatedly before the HP logo appears.

- Press `F10` to go to `BIOS Setup`

- Go to `System Configutation` tab

- Select `Boot Options`

- Select `Secure Boot` and disable it

- Press `F10` to save and exit

Congratulations, you are now free to install whatever operating system you like on your machine 😄

## Change boot order

Reboot your laptop and press `Esc` repeatedly before the HP logo appears.

- Press F9 to go to `Boot Device Options`

- Change boot order in order to place USB disk first.

Reboot the machine to boot into your USB stick, which contains the manjaro image.

## Install manjaro

Once you have booted into manjaro try if everything works and if you are happy install it!I choose the option to completely remove all the data on the hard disk and install manjaro on it.Furthermore, I didn't created a swap partition in order to save space on the hard drive.

# Conclusion

If you like me tought that linux was not ready for hybrid tablet/laptop devices, I hope you changed your mind at this point.If you have a device of this type that is not working as expected with windows, you can give linux a chance by trying it without installing it with a live distro on a USB stick.

_Check out my other blog posts at_ https://www.marcoieni.com/ 🤓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Keep a changelog!</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Sun, 29 Dec 2019 22:42:22 +0000</pubDate>
      <link>https://dev.to/marcoieni/keep-a-changelog-hf0</link>
      <guid>https://dev.to/marcoieni/keep-a-changelog-hf0</guid>
      <description>&lt;p&gt;In this article I will show you a changelog format and a convention for assigning numbers to your software versions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xTtfOwPq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2019/12/keep-a-changelog/changelog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xTtfOwPq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.marcoieni.com/2019/12/keep-a-changelog/changelog.png" alt="changelog.png" width="546" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The boring introduction
&lt;/h1&gt;

&lt;p&gt;During these holidays I renamed one of my side projects, because I was so smart toname it like a registered trademark. 😓&lt;br&gt;
I had to find a way to communicate this to the users, because manual interventionwas required in order to update.&lt;/p&gt;

&lt;p&gt;The first thing that came to my mind was to place a big announcement at the beginning of the READMEin which I say that the project was renamed and the instructions required to update it. But then I thought: how much should I leave the message there?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For 1 month? Users could update also after this time.&lt;/li&gt;
&lt;li&gt;For 1 year? Too many new users will be really annoyed by this big section.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project we are talking about is &lt;a href="https://github.com/MarcoIeni/intellimacs"&gt;intellimacs&lt;/a&gt;. Tldr: it is just a bunch of vim configuration files. Since the project is really simple, for a long time I thought that commit messages were enough to documentthe changes to the project. Turns out it is not, because since commit messages has to be small, there aretoo many commits with messages like "fixed typo" that create a lot of noise.&lt;/p&gt;

&lt;p&gt;After this terrible idea I thought to build a full website with a blog were people can get updatesfor the project. This would not be so bad, but it is something that requires time to be built and that I'll have to maintain. Furthermore, for the user would be a pain to first read all the github documentation and then go through the websitewhere there will be inevitably duplicated info. For a project of this size, I think that keeping everything inside the github repository is enough for now.&lt;/p&gt;

&lt;p&gt;Anyway, now the project counts 130 stars on GitHub, so all these people deserves to get comprehensive and coincise news about the project.&lt;/p&gt;

&lt;p&gt;The best solution I have found for my problem is to keep a changelog. The user, before updating, can see on which version they are by running &lt;code&gt;git tag&lt;/code&gt; and they can see what changedby reading this nice plain text file, which contains all the notable changes of the project.&lt;/p&gt;

&lt;p&gt;It's something I always knew it was necessary, but that I continued to postpone with excuses like &lt;em&gt;"my project is not too big yet"&lt;/em&gt; or &lt;em&gt;"the project is very simple, commit messages are enough"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Well, turns out that now I added a changelog to my project and I found a really nice and efficientway to do it! 💪&lt;/p&gt;
&lt;h1&gt;
  
  
  Keeping a changelog
&lt;/h1&gt;

&lt;p&gt;After some online research I found this really nice website called, in fact, &lt;a href="https://keepachangelog.com/en/1.0.0/"&gt;keep a changelog&lt;/a&gt;. This website proposes a common format for changelogs which in my opinion is really nice.&lt;/p&gt;

&lt;p&gt;This is an example of this changelog format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [1.0.0] - 2017-06-20
### Added
- "Why keep a changelog?" section.
- "Who needs a changelog?" section.
- "How do I make a changelog?" section.

### Changed
- Start using "changelog" over "change log" since it's the common usage.
- Fix phrasing and spelling in German translation.

### Removed
- Section about "changelog" vs "CHANGELOG".

## [0.1.0] - 2015-10-06
### Added
- Answer "Should you ever rewrite a change log?".

### Changed
- Improve argument against commit logs.
- Start following [SemVer](https://semver.org) properly.

## [0.0.3] - 2014-08-09
### Added
- "Why should I care?" section mentioning The Changelog podcast.

## [0.0.2] - 2014-07-10
### Added
- Explanation of the recommended reverse chronological release ordering.

## [0.0.1] - 2014-05-31
### Added
- This CHANGELOG file to hopefully serve as an evolving example of a
  standardized open source project CHANGELOG.
- CNAME file to enable GitHub Pages custom domain
- README now contains answers to common questions about CHANGELOGs
- Good examples and basic guidelines, including proper date formatting.
- Counter-examples: "What makes unicorns cry?"







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

&lt;/div&gt;



&lt;p&gt;The changelog starts with a brief introduction and then it lists all the versions of the software.&lt;/p&gt;

&lt;p&gt;Basically, when you make a change to your software, you add this change to the &lt;code&gt;Unreleased&lt;/code&gt; section,in one of the following subsections:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;
&lt;strong&gt;Added&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
For new features.
&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;
&lt;strong&gt;Changed&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
For changes in existing functionality.
&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;
&lt;strong&gt;Deprecated&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
For soon-to-be removed features.
&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;
&lt;strong&gt;Removed&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
For now removed features.
&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;
&lt;strong&gt;Fixed&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
For any bug fixes.
&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;
&lt;strong&gt;Security&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
In case of vulnerabilities.
&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;When a new release is ready, rename the &lt;code&gt;Unreleased&lt;/code&gt; section with the new version number and the current date. And you are done! You have your changelog. The &lt;code&gt;Unreleased&lt;/code&gt; section will be empty again, ready to be filled with your new awesome changes! 😃&lt;/p&gt;

&lt;h1&gt;
  
  
  Version numbers
&lt;/h1&gt;

&lt;p&gt;Now..how to choose version numbers?&lt;/p&gt;

&lt;p&gt;Well, for that the Keep a Changelog website indicates &lt;a href="https://semver.org/spec/v2.0.0.html"&gt;Semantic Versioning&lt;/a&gt;. This standard indicates that the software version should be in the format MAJOR.MINOR.PATCH. The initial version is 0.0.1. When a new version is released increment the:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;
&lt;strong&gt;MAJOR version&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
When you make incompatible API changes.
&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;
&lt;strong&gt;MINOR version&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
When you add functionality in a backwards compatible manner.
&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;
&lt;strong&gt;PATCH version&lt;/strong&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
When you make backwards compatible bug fixes.
&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;When you increase the MAJOR version, MINOR and PATCH go to zero, while when you increase the MINOR version, PATCH goes to zero.&lt;/p&gt;

&lt;p&gt;A pre-release version &lt;em&gt;may&lt;/em&gt; be denoted by appending a hyphen and a series of dot separated identifiers immediately following the patch version.&lt;br&gt;
Examples: 1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92.&lt;/p&gt;

&lt;p&gt;Even if this method is mainly indicated for public APIs, I decided to apply it even if my project has not public APIs. Of course, I started with version 0.0.1, but since my project is now stable and a manual intervention was requiredfor the update, I directly went to version &lt;a href="https://github.com/MarcoIeni/intellimacs/releases/tag/v1.0.0"&gt;1.0.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For my project, when a new version is released I tag the git repository, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git tag -a v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I go to &lt;a href="https://github.com/MarcoIeni/intellimacs/releases"&gt;releases&lt;/a&gt;, and I create a new release for the current tag, where I copy the content of the changelog. I don't know if this is a best practice, but keeping the changelog only on github releases for me it's dangerous, since (as stated on keep a changelog website) it's not portable and I like the concept of having a plain text file with all the changes versioned together with the software.&lt;/p&gt;

</description>
      <category>changelog</category>
      <category>versioning</category>
    </item>
    <item>
      <title>Coderetreat is the funniest coding event I've ever attended</title>
      <dc:creator>Marco Ieni</dc:creator>
      <pubDate>Mon, 18 Nov 2019 17:46:23 +0000</pubDate>
      <link>https://dev.to/marcoieni/coderetreat-is-the-funniest-coding-event-i-ve-ever-attended-59pc</link>
      <guid>https://dev.to/marcoieni/coderetreat-is-the-funniest-coding-event-i-ve-ever-attended-59pc</guid>
      <description>&lt;p&gt;November 16th is the Global Day of Coderetreat and this was the first time I partecipated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_q7cOz0Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.coderetreat.org/images/facilitating/coderetreat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_q7cOz0Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.coderetreat.org/images/facilitating/coderetreat.png" alt="https://www.coderetreat.org/images/facilitating/coderetreat.png" title="https://www.coderetreat.org/images/facilitating/coderetreat.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The subtitle of the &lt;a href="https://www.coderetreat.org/"&gt;website&lt;/a&gt; describe it as&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a day-long, intensive practice event, focusing on the fundamentals of software development and design, away from the pressures of 'getting things done'.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Basically you pair program with strangers and instead of thinking about deadlines or legacy code that you have no time to refactor, you focus on best practices such as test driven development or some tricky challenges took from &lt;a href="https://www.cs.helsinki.fi/u/luontola/tdd-2009/ext/ObjectCalisthenics.pdf"&gt;object calisthenics&lt;/a&gt;. The proposed problem is always the same every year: &lt;a href="https://en.wikipedia.org/wiki/Conways_Game_of_Life"&gt;Conway's Game of Life&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;BUT! 😱 There is one rule: every 45 minutes you have to change buddy, delete all your code and start over!&lt;/p&gt;

&lt;p&gt;At the beginning you feel a bit of frustration, because you know that by the end of the day you will never finish that damn game, but everytime you start again you notice that you master the problem a little bit more: This means that iteration by iteration, you see your code getting simpler and cleaner!&lt;/p&gt;

&lt;p&gt;In fact, one of my takeaways from this day is this one: if you have a portion of code that makes you struggle everytime the debugger goes into it, maybe instead of trying to refactor it you could try to rewrite it from scratch! I can ensure you that a lot of great ideas will pop into your mind if you have a blank editor buffer instead of old ugly code in front of you.&lt;/p&gt;

&lt;p&gt;And what about 3 hours meetings just to decide if an option is better than the other? Maybe in less time you could have implemented small prototypes of both the solutions in order to see which one looks better and you can have something concrete to discuss on with your team. 😌&lt;/p&gt;

&lt;p&gt;In conclusion, if you missed the coderetreat I strongly advise you to partecipate next year (you can check locations on the &lt;a href="https://www.coderetreat.org/"&gt;website&lt;/a&gt;) or if you can, try this exercise with a friend, it's really funny and you learn a lot.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Check out my other blog posts at &lt;a href="https://www.marcoieni.com/"&gt;https://www.marcoieni.com/&lt;/a&gt;&lt;/em&gt; 🤓&lt;/p&gt;

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