<?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: axem</title>
    <description>The latest articles on DEV Community by axem (@axem).</description>
    <link>https://dev.to/axem</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%2Forganization%2Fprofile_image%2F7223%2F43e423d2-5de6-4d1f-9ec5-d73849715309.png</url>
      <title>DEV Community: axem</title>
      <link>https://dev.to/axem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/axem"/>
    <language>en</language>
    <item>
      <title>Tool Containerization Best Practices For Embedded Software Development</title>
      <dc:creator>janosmurai</dc:creator>
      <pubDate>Tue, 24 Sep 2024 12:41:02 +0000</pubDate>
      <link>https://dev.to/axem/tool-containerization-best-practices-for-embedded-software-development-4d22</link>
      <guid>https://dev.to/axem/tool-containerization-best-practices-for-embedded-software-development-4d22</guid>
      <description>&lt;p&gt;Containerization of development tools in the embedded software industry is still emerging but gaining traction rapidly. More teams are beginning to use containers to &lt;strong&gt;standardize and streamline their development environments, improving reproducibility and collaboration.&lt;/strong&gt; However, the industry still faces challenges in fully integrating containerized workflows. &lt;/p&gt;

&lt;p&gt;In this blog post, we will explore the process of containerizing a development environment for embedded software development, using the STM32F1 target as a basic example. Instead of relying on the vendor's integrated IDE, we will assemble the necessary development tools ourselves. This approach allows us to encapsulate the tools and their dependencies in a container image for improved consistency and portability.&lt;/p&gt;

&lt;p&gt;We've already discussed &lt;a href="https://axemsolutions.io/blog/optimized-development-environment-with-containerization.html" rel="noopener noreferrer"&gt;the advantages of containerization&lt;/a&gt;, but now let's delve into the practical steps to create a containerized development environment. Our example toolkit includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build system: &lt;a href="https://www.gnu.org/software/make/#documentation" rel="noopener noreferrer"&gt;GNU Make&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Toolchain: &lt;a href="https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads" rel="noopener noreferrer"&gt;Arm GNU Toolchain&lt;/a&gt; (the official compiler toolchain from Arm)
&lt;/li&gt;
&lt;li&gt;Debugger and deployer: &lt;a href="https://github.com/stlink-org/stlink" rel="noopener noreferrer"&gt;stlink-org&lt;/a&gt; (an open-source implementation of ST's STLINK Tools)
&lt;/li&gt;
&lt;li&gt;Test environment: &lt;a href="https://cpputest.github.io/" rel="noopener noreferrer"&gt;CppUTest&lt;/a&gt; (a C/C++ based test framework)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A container image is essentially a file with executable code that can create a container on a computing system. &lt;strong&gt;The main objective of this tutorial is to use containerization to isolate the development tools and their dependencies&lt;/strong&gt;. To achieve this, we will leverage Docker as our container engine, so we will need to craft a Dockerfile. (See the &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; to install Docker on your system.)&lt;/p&gt;

&lt;p&gt;Before creating the container image, the initial decision revolves around selecting an appropriate base image. For development containers, a Debian-based image is generally sufficient. This base image is relatively compact, stable, and comes with many of the dependencies pre-installed.&lt;/p&gt;

&lt;p&gt;The next crucial step is to gather all the necessary tools and their dependencies. Here's a breakdown of how to obtain each component:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Make and stlink-org:&lt;/strong&gt; You can easily install these tools from the Debian repository using the apt package manager.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gnu-arm-none-eabi:&lt;/strong&gt; To enable debugging for the toolchain, you must install the gdb package via the apt package manager. Additionally, you'll need the wget and bzip2 packages to download and install the toolchain's binary, which is available from Arm's official file server.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CppUTest:&lt;/strong&gt; CppUTest is installed from source, and you can obtain the source files from the project's GitHub repository using git. To build the source files successfully, you'll need the following packages: g++, cmake, libtool, and autoconf.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;To ensure that you've gathered all the necessary dependencies, a helpful tip is to attempt to install each tool to a container created from the chosen base image. For example, if you're using a Debian base image, you can run the following command: &lt;br&gt;
&lt;code&gt;docker run \-it debian:bullseye /bin/bash&lt;/code&gt; &lt;br&gt;
This should open up a shell in a Debian based container. In this shell try to run the commands you’d like to add to your dockerfile. This approach is much more efficient than troubleshooting the Dockerfile with rebuilding every iteration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Creating a monocontainer
&lt;/h2&gt;

&lt;p&gt;Now that we know how to obtain our development tools, it's time to dive into containerization. For this example, We've prepared a Dockerfile to encapsulate the toolset and dependencies within a monocontainer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use the Debian base image as our starting point.&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; debian:bullseye&lt;/span&gt;

&lt;span class="c"&gt;# Install the required packages.&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;g++&lt;span class="o"&gt;=&lt;/span&gt;4:10.2.1-1 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;cmake&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.18.4-2+deb11u1 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;libtool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2.4.6-15 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;autoconf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2.69-14 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1:2.30.2-1+deb11u2 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;gdb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.1-1.7 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;wget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.21-1+deb11u1 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;bzip2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0.8-4 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;make&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.3-4.1 &lt;span class="se"&gt;\
&lt;/span&gt;                   stlink-tools&lt;span class="o"&gt;=&lt;/span&gt;1.6.1+ds-3

&lt;span class="c"&gt;# Clone and install CppUTest&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;git clone https://github.com/cpputest/cpputest
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /cpputest&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;autoreconf &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    ./configure &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    make tdd
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; CPPUTEST_HOME=/cpputest&lt;/span&gt;

&lt;span class="c"&gt;# Set the working directory for your project&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /work&lt;/span&gt;

&lt;span class="c"&gt;# Download and set up the GNU Arm toolchain&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xjf&lt;/span&gt; gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;rm &lt;/span&gt;gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;mv &lt;/span&gt;gcc-arm-none-eabi-10.3-2021.10 /opt/gcc-arm

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PATH="/opt/gcc-arm/bin:${PATH}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's a breakdown of the Dockerfile:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We start with a Debian base image.
&lt;/li&gt;
&lt;li&gt;We update the package list and install the required software dependencies directly from the Debian repository using the apt package manager.
&lt;/li&gt;
&lt;li&gt;We clone the CppUTest repository from GitHub, build it in the /cpputest directory, and set the CPPUTEST_HOME environment variable to the installation path.
&lt;/li&gt;
&lt;li&gt;We configure the working directory as /work.
&lt;/li&gt;
&lt;li&gt;The GNU Arm toolchain is downloaded, unzipped, and placed in the /opt/gcc-arm directory. We also update the PATH environment variable to ensure the toolchain is accessible system-wide.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To create the container image, run the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker build \-t dev\_env\_image .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;On a PC Intel i7-8550U (8) @ 4.000GHz, this process took approximately 5 minutes and 22 seconds.&lt;/p&gt;

&lt;p&gt;With the containerized development environment ready, you can experiment with it using a simple demo repository. Clone the repository with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone https://github.com/axem-solutions/example&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Navigate to the root of the example directory.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd example&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Run the container.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run --privileged --rm -it -v "$(pwd)":/work dev_env_image:latest bash&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here’s a breakdown of the command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;—privileged&lt;/code&gt;: Give access to the USB devices. This is not a secure solution, only used for the sake of simplicity.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;—rm&lt;/code&gt;: Remove the container after stopping it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-v “$(pwd)":/work&lt;/code&gt;: Mount the current working directory to &lt;code&gt;/work&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev_env_image:latest&lt;/code&gt;: Use the image we have just built.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bash&lt;/code&gt;: Run bash inside the container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside the container, you can use the tools as you would natively.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build the project:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;make&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the test cases:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;cd /work/app/test&lt;/code&gt;&lt;br&gt;
&lt;code&gt;make&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy to the target:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;cd /work/build&lt;/code&gt; &lt;br&gt;
&lt;code&gt;st-flash write tutorial.bin 0x8000000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Another option is to start the tasks alongside the container. When the task finishes the container stops.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build the project:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;docker run \--rm \-v "$(pwd)":/work dev\_env\_image:latest make&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the test cases:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;docker run \--rm \-v "$(pwd)":/work dev\_env\_image:latest /bin/sh \-c "cd app/test; make"&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy to the target:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;docker run \--privileged \--rm \-v "$(pwd)":/work dev\_env\_image:latest /bin/sh \-c "cd build; st-flash write tutorial.bin 0x8000000"&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Problems with the monocontainer approach
&lt;/h2&gt;

&lt;p&gt;While placing each tool in a single container may seem like a straightforward approach, it can lead to several challenges reminiscent of issues faced with traditional Integrated Development Environments (IDEs). In this chapter, we will discuss the downsides of the monocontainer approach and why it may not always be the ideal solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalability and Maintainability:&lt;/strong&gt; The monocontainer approach may work well for simple projects, as demonstrated in our example. However, in real-world scenarios, software development often involves a multitude of tools. &lt;strong&gt;As more tools are added, the Dockerfiles can become excessively lengthy, potentially stretching to hundreds of lines&lt;/strong&gt;. This can lead to a lack of scalability and make the environment hard to maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficult bug localization:&lt;/strong&gt; The containerized tools may share resources and have interdependencies. Making modifications to the image can inadvertently result in &lt;strong&gt;complex and challenging-to-detect malfunctions&lt;/strong&gt;. This can make the process of pinpointing the root cause of a problem even more difficult.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time-Consuming Modifications:&lt;/strong&gt; Docker builds are structured with a series of ordered build instructions defined by the Dockerfile. Each instruction roughly translates to an image layer. When building an image, Docker attempts to reuse layers from previous builds. However, if a layer has changed since the last build, that layer and all subsequent layers must be rebuilt. Meaning, &lt;strong&gt;the lower layer gets modified, the more time it takes for the image to build&lt;/strong&gt;. Consequently, maintaining large Dockerfiles can quickly become a time-consuming task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Variants:&lt;/strong&gt; Throughout the development lifecycle, there may be a need for different image variants. For example, &lt;strong&gt;when setting up a Continuous Integration/Continuous Deployment (CI/CD) server, some tools may become unnecessary (e.g., the debugger), while new tools (e.g., the CI/CD service) are required to run CI/CD pipelines.&lt;/strong&gt; Alternatively, changes in the project may necessitate the creation of a new development environment while retaining the old one for compatibility reasons.&lt;/p&gt;

&lt;p&gt;As mentioned earlier, Docker images are composed of layers. These layers can be shared among images until the point where the first difference occurs. This means &lt;strong&gt;that layers of image variants, starting from the first one that differs from the original, consume additional space on the host storage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working on Multiple Projects:&lt;/strong&gt; In scenarios where developers are simultaneously working on several projects, each project may have its own dedicated image. However, some tools used across these projects may be the same. Just like with image variants, &lt;strong&gt;Dockerfiles should be thoughtfully constructed to minimize storage consumption&lt;/strong&gt;. Once the first differing layer is encountered, subsequent layers are not shared, even if they are identical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Size constraints:&lt;/strong&gt; Huge Dockerfiles result in huge container images, which can easily end up hundreds of gigabytes. Developers working on multiple projects can quickly run out of available local storage. The size of the container images can also become problematic when they get pulled over metered connections, especially on CI/CD providers where this can happen quite often.&lt;/p&gt;

&lt;p&gt;In the following chapters, we'll explore potential solutions to these challenges and how to leverage dedicated tool images for a more efficient and scalable development environment.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solution: Dedicated Tool Images
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scalability and Maintenance:&lt;/strong&gt; Placing each separate tool into its own container resolves the scalability and maintenance issues. With &lt;strong&gt;separate containers for each individual tool&lt;/strong&gt;, the development environment becomes highly modular, making it easy to add or remove tools as needed without affecting the entire setup. This modularity simplifies the development environment's management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting:&lt;/strong&gt; Troubleshooting is greatly simplified with dedicated tool images. When an issue arises, you only need to inspect the Dockerfile of the specific malfunctioning tool. This pinpointed approach reduces the complexity of debugging and minimizes the potential for conflicts between tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Efficient Build Process:&lt;/strong&gt; By using separate tool images, you significantly reduce the number of image layers. This means that rebuilding images, even if lower layers were modified, is much faster. The build process becomes more efficient, making it easier to maintain large Dockerfiles and keep development environments up-to-date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adaptation and Variants:&lt;/strong&gt; Changing tools or creating new image variants becomes straightforward. You can swap out a tool image for a new one without affecting other tools. This flexibility allows for the quick creation of new development environments without multiplying storage consumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage Efficiency:&lt;/strong&gt; Dedicated tool images optimize storage usage. Only the layers that differ from the original image occupy extra space on the host. This minimizes the storage footprint and is especially useful when working on multiple projects or using variants of the same image.&lt;/p&gt;

&lt;p&gt;Overall, this method of utilizing dedicated tool images effectively resolves the limitations and challenges associated with the monocontainer approach. It provides a modular, efficient, and scalable way to manage development environments, making it easier to adapt to changing requirements while simplifying troubleshooting and minimizing storage consumption.&lt;/p&gt;
&lt;h2&gt;
  
  
  Separating the Tools for the Example Project
&lt;/h2&gt;

&lt;p&gt;In this chapter, we'll revisit the example project and explore how to separate the tools effectively. Understanding the communication between the tools is crucial to decide how they can be distributed into individual containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F87xc1dhupwxjfmi5czs0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F87xc1dhupwxjfmi5czs0.png" alt="Dev Env relations" width="800" height="704"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  CppUTest
&lt;/h2&gt;

&lt;p&gt;The CppUTest and the GNU Arm toolchain don't rely on each other. They operate on source files independently, making them suitable for separation. The Make tool directly calls CppUTest, so it must be present in the same image. Make is installed via the cmake package. Below is the Dockerfile for CppUTest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; debian:bullseye&lt;/span&gt;

&lt;span class="c"&gt;# Install the required packages.&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;g++&lt;span class="o"&gt;=&lt;/span&gt;4:10.2.1-1 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;cmake&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.18.4-2+deb11u1 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;libtool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2.4.6-15 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;autoconf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2.69-14 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1:2.30.2-1+deb11u2

&lt;span class="k"&gt;RUN &lt;/span&gt;git clone https://github.com/cpputest/cpputest

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /cpputest&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;autoreconf &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    ./configure &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    make tdd

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; CPPUTEST_HOME=/cpputest&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /work&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build command: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker build \-t axemsolutions/cpputest .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Build time: 2m 24s&lt;/p&gt;

&lt;h2&gt;
  
  
  GNU Arm Toolchain
&lt;/h2&gt;

&lt;p&gt;The Make tool directly calls the GNU Arm toolchain, so it must reside in the same image. Here's the Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; debian:bullseye&lt;/span&gt;

&lt;span class="c"&gt;# Install the required packages.&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;gdb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.1-1.7 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;wget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.21-1+deb11u1 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;bzip2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0.8-4 &lt;span class="se"&gt;\
&lt;/span&gt;                   &lt;span class="nv"&gt;make&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.3-4.1

&lt;span class="c"&gt;# Installing the gnu-arm-none-eabi toolchain&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /work&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xjf&lt;/span&gt; gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;rm &lt;/span&gt;gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;mv &lt;/span&gt;gcc-arm-none-eabi-10.3-2021.10 /opt/gcc-arm

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PATH="/opt/gcc-arm/bin:${PATH}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build command: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker build \-t axemsolutions/make\_gnu-arm .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Build time: 2m 14s&lt;/p&gt;

&lt;h2&gt;
  
  
  Stlink-org
&lt;/h2&gt;

&lt;p&gt;Stlink-org communicates with the GNU Arm toolchain (GDB client) over TCP/IP. This network connection can be established between separated containers, allowing Stlink-org to be placed in a separate container. Here's the Dockerfile for Stlink-org:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; debian:bullseye&lt;/span&gt;

&lt;span class="c"&gt;# Install the required packages.&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;stlink-tools&lt;span class="o"&gt;=&lt;/span&gt;1.6.1+ds-3

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /work&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build command: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker build \-t axemsolutions/stlink-org .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Build time: 7s&lt;/p&gt;

&lt;p&gt;The separated tool images significantly reduce build times, saving valuable time when frequent rebuilds are necessary. &lt;/p&gt;

&lt;p&gt;While the usage of these images is not detailed in this blog post, you can find comprehensive instructions in our &lt;strong&gt;Tutorial&lt;/strong&gt;. This tutorial covers setting up and compiling a project for the NUCLEO-F103RB, obtaining tool images from axem’s Docker Hub, and flashing and debugging the application on the target using VS Code and its Dev Containers extension.&lt;/p&gt;

&lt;h2&gt;
  
  
  The DEM Solution
&lt;/h2&gt;

&lt;p&gt;While separating tools into their individual containers offers numerous advantages, it can lead to a proliferation of container images, which can quickly become unmanageable. It becomes challenging to keep track of which images are needed for the different projects. To address this issue, we introduced a tool called DEM (Development Environment Manager). &lt;strong&gt;DEM enables the creation of development environments from tool images and allows them to be assigned to specific projects.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To learn more about DEM and its capabilities, please visit the project's &lt;a href="https://github.com/axem-solutions/dem" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; and explore its detailed &lt;a href="https://www.axemsolutions.io/dem_doc/index.html" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  The axem Open Tool Dockerfiles repo
&lt;/h2&gt;

&lt;p&gt;The approach of creating dedicated containers not only simplifies the management of development environments but also encourages the reuse of tool images. At axem, &lt;strong&gt;our team is dedicated to developing tool images that can serve as fundamental building blocks for constructing new development environments&lt;/strong&gt;. That's why we've made our repository of Dockerfiles open to the community.&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/axem-solutions/tool_dockerfiles" rel="noopener noreferrer"&gt;Open Tool Dockerfiles (OTD)&lt;/a&gt; is an open and collaborative repo for storing and sharing Dockerfiles, specifically tailored for embedded software development tools. Our mission is to create a community-driven repository where developers can freely contribute, access, and utilize containerized build systems, debuggers, toolchains and more. We welcome contributions from everyone, so feel free to add new Dockerfiles to the repository.&lt;/p&gt;

&lt;p&gt;The generated tool images will be easily accessible from our free and open-source registry called &lt;a href="https://hub.docker.com/u/axemsolutions" rel="noopener noreferrer"&gt;axem Open Registry (aOR)&lt;/a&gt;. This registry is designed to make the process of building development environments even more efficient, giving you the tools you need to succeed in your projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: A Containerized Future for Embedded Software Development
&lt;/h2&gt;

&lt;p&gt;In the realm of embedded software development, adapting to the growing complexities of projects is a key challenge. Monocontainers, once appealing, can become unwieldy and inefficient. Troubleshooting, adapting to new requirements, and working on multiple projects all pose challenges.&lt;/p&gt;

&lt;p&gt;The solution lies in dedicated tool images. &lt;strong&gt;By separating tools into isolated containers, we address scalability, maintenance, and troubleshooting issues.&lt;/strong&gt; The Development Environment Manager (DEM) streamlines environment management, while the axem Open Registry (aOR) offers a central repository for tool images.&lt;/p&gt;

&lt;p&gt;This transition from monocontainers to modular tool images, coupled with DEM and aOR, marks a significant leap in efficient embedded software development. It allows for increased agility, time savings, and seamless project work. Embracing containerization is the future, enabling developers to excel in the ever-evolving field of embedded software.   &lt;/p&gt;

</description>
      <category>containers</category>
      <category>productivity</category>
      <category>coding</category>
      <category>tooling</category>
    </item>
    <item>
      <title>STM32 Development Without an IDE</title>
      <dc:creator>janosmurai</dc:creator>
      <pubDate>Fri, 19 Jul 2024 08:19:10 +0000</pubDate>
      <link>https://dev.to/axem/stm32-development-without-an-ide-36do</link>
      <guid>https://dev.to/axem/stm32-development-without-an-ide-36do</guid>
      <description>&lt;p&gt;In this blog post, we'll showcase &lt;strong&gt;two methods for installing the essential tools to develop software for an STM32&lt;/strong&gt; target without depending on an Integrated Development Environment (IDE).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We'll begin by examining the process of collecting and installing the necessary tools directly onto your host PC.&lt;/li&gt;
&lt;li&gt;Next, we'll explore the creation of a containerized solution using the same toolset, leveraging &lt;a href="https://github.com/axem-solutions/dem" rel="noopener noreferrer"&gt;DEM&lt;/a&gt;, our open-source Development Environment Manager.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt;&lt;br&gt;
This post is primarily tailored for x86_64 Linux users. However, Windows users can also follow along using Windows Subsystem for Linux (WSL).&lt;/p&gt;
&lt;h2&gt;
  
  
  Development Environment vs IDE
&lt;/h2&gt;

&lt;p&gt;When starting development on a new target, the typical approach is to download the vendor-specific IDE, which comes with all the necessary tools preinstalled. While this method offers a quick start, it lacks flexibility. &lt;strong&gt;The IDE is a fixed environment, making it challenging to modify or update integrated tools later on.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, opting for a Development Environment (Dev Env) allows us to assemble the tools we need individually, providing greater control over the development process. &lt;strong&gt;Unlike an IDE, a Dev Env consists of standalone tools tailored to our requirements.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One significant advantage of using a Dev Env is the freedom to choose your preferred editor for coding. &lt;strong&gt;This flexibility empowers developers to work with the tools and workflows that best suit their needs.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  DEM
&lt;/h2&gt;

&lt;p&gt;We'll be utilizing DEM to create our containerized Dev Env. DEM, which stands for &lt;strong&gt;Development Environment Manager, facilitates the creation and management of Dev Envs based on a containerized toolset&lt;/strong&gt;. When working without an IDE, DEM serves as the glue between individual tools, enabling their assignment to the development project seamlessly.&lt;/p&gt;

&lt;p&gt;If you're interested in delving deeper into the advantages of containerization, you can explore our article on &lt;a href="https://axemsolutions.io/blog/optimized-development-environment-with-containerization.html" rel="noopener noreferrer"&gt;Maximizing efficiency&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The toolset
&lt;/h2&gt;

&lt;p&gt;To establish a functional Dev Env, we'll choose the following tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build system: &lt;strong&gt;make&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Toolchain: &lt;strong&gt;gnu-arm-none-eabi&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Debugger: &lt;strong&gt;stlink-org&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Dev Env creation - Two ways
&lt;/h2&gt;
&lt;h2&gt;
  
  
  I. Installing on the native host
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The build system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The make build system is typically available by default on most major Linux distributions, requiring no additional actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The toolchain&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit the official ARM website to download the GNU ARM toolchain.&lt;/li&gt;
&lt;li&gt;Navigate to the appropriate section for your host's compatibility.&lt;/li&gt;
&lt;li&gt;Download the archived file and extract it into the /opt/gnu directory using the command: &lt;code&gt;tar -xf arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz -C /opt/gnu/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add the path of the toolchain binaries to your PATH environment variable to enable systemwide usage.&lt;/li&gt;
&lt;li&gt;Verify the installation by running: &lt;code&gt;arm-none-eabi-gcc --version&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The debugger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The stlink-org is the open-source version of the STMicroelectronics STLINK Tools.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Follow the installation instructions outlined in the project's &lt;a href="https://github.com/stlink-org/stlink?tab=readme-ov-file#installation" rel="noopener noreferrer"&gt;README&lt;/a&gt; file.&lt;/li&gt;
&lt;li&gt;Verify the installation by running: &lt;code&gt;st-info –version&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  II. Simple, containerized installation
&lt;/h2&gt;

&lt;p&gt;To set up a containerized Dev Env, you'll need the following tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Docker container engine to run containers.&lt;/li&gt;
&lt;li&gt;The DEM to manage the Development Environment.&lt;/li&gt;
&lt;li&gt;Python 3.10 or higher to run DEM.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Refer to the &lt;a href="https://github.com/axem-solutions/dem?tab=readme-ov-file#installation" rel="noopener noreferrer"&gt;installation section of DEM’s README&lt;/a&gt; and follow the instructions.&lt;/p&gt;

&lt;p&gt;Confirm the successful installation of DEM by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dem –version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, proceed with creating a Dev Env named "stm32" (or any preferred name) using the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dem create stm32

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

&lt;/div&gt;



&lt;p&gt;DEM will prompt you to select the desired tools for inclusion in the Dev Env. Choose from the available tool images:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;axemsolutions/make_gnu-arm:13.2&lt;/li&gt;
&lt;li&gt;axemsolutions/stlink-org:1.8.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9i8u9dvyw6n3phbra1nv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9i8u9dvyw6n3phbra1nv.png" alt="Selecting tool images to create the Development Environment" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;
Selecting tool images to create the Development Environment



&lt;p&gt;Finally, install the newly created Dev Env with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dem install stm32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Containerized vs Native Dev Env
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Containerized Dev Env&lt;/th&gt;
&lt;th&gt;Native Dev Env&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A simple &lt;code&gt;dem install&lt;/code&gt; command. The tool container images can be used immediately.&lt;/td&gt;
&lt;td&gt;Manually, every time.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The toolset can be modified by simply adding/removing tools with DEM.&lt;/td&gt;
&lt;td&gt;Modifying the toolset involves many manual installation/uninstallation steps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The tools live in their own isolated environment.&lt;/td&gt;
&lt;td&gt;Tools can affect the behaviour of other tools and the host system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reproducibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tools are guaranteed to always work the same way in every host environment.&lt;/td&gt;
&lt;td&gt;Differences in the OS and library versions between two dev PCs can result in different outputs of the same tools.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Simple reproducibility with DEM
&lt;/h2&gt;

&lt;p&gt;A Dev Env can be assigned to a project with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dem assign {dev_env_name} {project_path}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command saves the selected Development Environment descriptor to the project's root directory. Consequently, the descriptor can be added to the version control system. &lt;strong&gt;Employing this technique guarantees that all project contributors utilize the exact same Development Environment throughout the project's lifecycle.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;p&gt;For readers interested in further exploration, &lt;strong&gt;we've prepared a step-by-step tutorial&lt;/strong&gt; on creating a project for an &lt;strong&gt;STM32F1 target&lt;/strong&gt; and establishing a containerized Development Environment (Dev Env). You can access the tutorial through the following link: &lt;a href="https://www.axemsolutions.io/tutorial/index.html" rel="noopener noreferrer"&gt;Tutorial on STM32F1 project creation and containerized Dev Env setup.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This additional resource offers detailed guidance and insights into practical implementation, complementing the information provided in this article.&lt;/p&gt;

</description>
      <category>stm32</category>
      <category>development</category>
      <category>software</category>
      <category>docker</category>
    </item>
    <item>
      <title>Creating and Exporting Project-Specific Configurations in VS Code</title>
      <dc:creator>Tamas</dc:creator>
      <pubDate>Fri, 20 Oct 2023 14:42:34 +0000</pubDate>
      <link>https://dev.to/axem/creating-and-exporting-project-specific-configurations-in-vs-code-3cpi</link>
      <guid>https://dev.to/axem/creating-and-exporting-project-specific-configurations-in-vs-code-3cpi</guid>
      <description>&lt;p&gt;Based on the 2023 &lt;a href="https://survey.stackoverflow.co/2023/#overview"&gt;Stackoverflow survey&lt;/a&gt; &lt;strong&gt;Visual Studio Code remains the preferred IDE&lt;/strong&gt; across all developers by 73.71%.&lt;br&gt;
VS Code is renowned for being a &lt;strong&gt;lightweight yet powerful code editor&lt;/strong&gt;, but its true potential shines when paired with the right extensions.&lt;br&gt;
In this article, we'll explore &lt;strong&gt;how to boost your VS Code experience&lt;/strong&gt;, particularly when you join a new project.&lt;/p&gt;

&lt;p&gt;Although we emphasize the developers’ freedom to have their own toolset of choice, in this article we focus on the advantages of the unified development environments. It can be valuable when the team members use the same extensions with common configurations. This method can &lt;strong&gt;shorten the onboarding process, provide standardized debug configurations and code formatting settings, and can make pair programming to be a smoother activity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The good news is that VS Code makes it easy to achieve this stable setup. You can export your installed plugin list to a file and effortlessly replicate it on another device.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Before we dive into the magic of sharing configurations, make sure you have VS Code installed and a few key extensions ready. These could include code linters, debugging tools, version control integrations, and language-specific extensions. You can explore and install these extensions directly from the VS Code marketplace.&lt;/p&gt;
&lt;h2&gt;
  
  
  Export your extensions with a simple command
&lt;/h2&gt;

&lt;p&gt;To display the list of all the extensions with their versions currently installed in your VS Code environment, open a terminal window and execute the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code --list-extensions --show-versions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the following to save a .list file containing only the names of your installed extensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code --list-extensions &amp;gt; your-extensions.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you would like to &lt;strong&gt;export your extensions&lt;/strong&gt; with versions, use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code --list-extensions --show-versions &amp;gt; your-extenstions.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This action will save a .list file containing the names and versions of your installed extensions to your computer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RfKaLE5F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u522swybq8a52a4df0o3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RfKaLE5F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u522swybq8a52a4df0o3.png" alt="Example: Exported extension file with versions" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;
Example: Exported extension file with versions






&lt;h2&gt;
  
  
  Sharing your VS Code extensions
&lt;/h2&gt;

&lt;p&gt;With your extensions exported, you're now ready to &lt;strong&gt;share it with your teammates or replicate it on another device.&lt;/strong&gt;&lt;br&gt;
Run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat your-extensions.list | xargs -L 1 code --install-extension
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By this command, &lt;strong&gt;VS Code automatically installs all extensions&lt;/strong&gt; from your your-extensions.list file. The operational process of this command is as follows:&lt;br&gt;
The ‘cat’ command will list your-extensions.list sequentially, meanwhile subsequently, the ‘xargs’ captures the current plugin name and triggers ‘code –install-extension’ command with that argument, and continues this process until it reaches the end of the .list file.&lt;/p&gt;

&lt;p&gt;As a plus, &lt;strong&gt;using the command line&lt;/strong&gt; to install VS Code extensions from a file offers a practical advantage. It &lt;strong&gt;seamlessly integrates into automated installer scripts&lt;/strong&gt; and enables you to experiment with your friend's or coworker's configurations, enhancing your overall user experience. Importantly, &lt;strong&gt;when you install plugins from an external file, your existing plugins remain unaffected.&lt;/strong&gt; You can easily update your plugins using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat your-extensions.list | xargs -L 1 code --force --install-extension
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Exporting your VS Code configuration
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;settings.json&lt;/em&gt; file is a configuration file in VS Code that &lt;strong&gt;allows you to customize the behavior of the editor and its extensions.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On Windows, the &lt;em&gt;settings.json&lt;/em&gt; file is typically located in &lt;em&gt;%APPDATA%\Code\User\settings.json.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;On macOS, it's in &lt;em&gt;~/Library/Application Support/Code/User/settings.json.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;On Linux, you can find it at &lt;em&gt;~/.config/Code/User/settings.json.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The file is written in JSON (JavaScript Object Notation) format. It consists of key-value pairs that configure various aspects of VS Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Customizations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can customize settings related to the editor's behavior, such as indentation, word wrap, and font size.&lt;/li&gt;
&lt;li&gt;You can configure settings for specific programming languages or file types.&lt;/li&gt;
&lt;li&gt;You can set up preferences for extensions you've installed, including their keybindings and behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing config for a different VS Code
&lt;/h2&gt;

&lt;p&gt;On the recipient's end, they can &lt;strong&gt;import&lt;/strong&gt; this &lt;em&gt;settings.json&lt;/em&gt; configuration file &lt;strong&gt;by copying and replacing&lt;/strong&gt; the original one &lt;strong&gt;or by merging&lt;/strong&gt; the two files together.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Warning:&lt;/em&gt; Always make backups of your &lt;em&gt;settings.json&lt;/em&gt; file before making significant changes, and refer to the official &lt;a href="https://code.visualstudio.com/docs/getstarted/settings"&gt;VS Code documentation&lt;/a&gt; for more details on configuration options and best practices.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Efficiency and consistency are the pillars of a productive coding environment&lt;/strong&gt;, especially in a collaborative setting. With VS Code's ability to export and import extension configurations, &lt;strong&gt;you can ensure that everyone on your team has access to the same tools and settings, saving valuable time and streamlining your workflow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So go ahead, empower your coding journey with this time-saving feature, and make the most out of the extensive VS Code extension library.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Visual Studio Code, VS Code, and the Visual Studio Code icon are trademarks of Microsoft Corporation. All rights reserved.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>Calling All Python Enthusiasts: Join Us in Contributing to Our Open-Source Project!</title>
      <dc:creator>Eszter Vezden</dc:creator>
      <pubDate>Fri, 20 Oct 2023 13:59:41 +0000</pubDate>
      <link>https://dev.to/axem/calling-all-python-enthusiasts-join-us-in-contributing-to-our-open-source-project-2igf</link>
      <guid>https://dev.to/axem/calling-all-python-enthusiasts-join-us-in-contributing-to-our-open-source-project-2igf</guid>
      <description>&lt;p&gt;Are you passionate about &lt;strong&gt;Python&lt;/strong&gt; and &lt;strong&gt;open-source development&lt;/strong&gt;? We're thrilled to invite you to contribute to our Python open-source project!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacktoberfest 2023&lt;/strong&gt; is officially underway, and our open-source tool, DEM is part of this fantastic event. 🚀&lt;/p&gt;

&lt;p&gt;The DEM is a command line tool that provides an easy, reproducible, and scalable way to set up Development Environments for embedded software development.&lt;/p&gt;

&lt;p&gt;Learn more about DEM &lt;a href="https://axemsolutions.io/dem_doc/"&gt;HERE&lt;/a&gt;.&lt;br&gt;
Check out our &lt;a href="https://github.com/axem-solutions/dem"&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Contribute?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enhance your skills in Python&lt;/li&gt;
&lt;li&gt;Learn more about containerization (especially Docker)&lt;/li&gt;
&lt;li&gt;Learn about development platforms&lt;/li&gt;
&lt;li&gt;Shape the future of embedded development tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack&lt;br&gt;
🐍 Python&lt;br&gt;
🐳 Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Are you interested?&lt;br&gt;
You can find our open issues &lt;a href="https://github.com/axem-solutions/dem/issues"&gt;HERE&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Don't forget to join our XM Community on &lt;a href="https://discord.com/invite/Nv6hSzXruK"&gt;Discord&lt;/a&gt; .&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>community</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Python contributors wanted</title>
      <dc:creator>janosmurai</dc:creator>
      <pubDate>Tue, 10 Oct 2023 12:23:24 +0000</pubDate>
      <link>https://dev.to/axem/python-contributors-wanted-m8m</link>
      <guid>https://dev.to/axem/python-contributors-wanted-m8m</guid>
      <description>&lt;p&gt;Hacktoberfest 2023 is officially underway, and our open-source tool, &lt;a href="https://github.com/axem-solutions/dem"&gt;DEM&lt;/a&gt; is part of this fantastic event. 🚀&lt;/p&gt;

&lt;p&gt;The DEM is a command line tool that provides an easy, reproducible, and scalable way to set up Development Environments for embedded software development. &lt;br&gt;
Find out more at our &lt;a href="https://github.com/axem-solutions/dem"&gt;GitHub repo&lt;/a&gt;!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are you looking for issues to implement completely new features? You are at the right place!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enhance your skills in Python&lt;/li&gt;
&lt;li&gt;Learn more about containerization (especially Docker)&lt;/li&gt;
&lt;li&gt;Learn about development platforms&lt;/li&gt;
&lt;li&gt;Shape the future of embedded development tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🐍 Python&lt;/li&gt;
&lt;li&gt;🐳 Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Are you interested?
&lt;/h2&gt;

&lt;p&gt;Join our &lt;a href="https://discord.com/invite/Nv6hSzXruK"&gt;Discord&lt;/a&gt; or send me a DM!&lt;/p&gt;

</description>
      <category>hacktoberfest23</category>
      <category>hacktoberfest</category>
      <category>python</category>
      <category>containerization</category>
    </item>
    <item>
      <title>Preptember - How to setup your project for Hacktoberfest</title>
      <dc:creator>janosmurai</dc:creator>
      <pubDate>Tue, 10 Oct 2023 09:02:48 +0000</pubDate>
      <link>https://dev.to/axem/preptember-how-to-setup-your-project-for-hacktoberfest-1bp3</link>
      <guid>https://dev.to/axem/preptember-how-to-setup-your-project-for-hacktoberfest-1bp3</guid>
      <description>&lt;p&gt;Every year in October &lt;strong&gt;open-source enthusiasts from all over the world gather together virtually to celebrate the community&lt;/strong&gt;, by contributing to software that is freely available to use, redistribute, and modify. Many of us rely on open-source projects in our everyday lives, which are maintained by passionate people, but what do they get in return?&lt;/p&gt;

&lt;p&gt;By Joining &lt;strong&gt;Hacktoberfest&lt;/strong&gt;, contributors can &lt;strong&gt;learn new technologies, showcase their knowledge, build their professional network, and give back to the community&lt;/strong&gt;.&lt;br&gt;
Hacktoberfest is DigitalOcean’s annual event that encourages people to contribute to open source throughout October. The &lt;a href="https://hacktoberfest.com/"&gt;core values&lt;/a&gt; are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everyone is welcome&lt;/li&gt;
&lt;li&gt;Quantity is fun, quality is key&lt;/li&gt;
&lt;li&gt;Short-term action, long-term impact&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DEM’s story
&lt;/h2&gt;

&lt;p&gt;Development Environments created for implementing embedded software often include multiple different software tools. A great way to keep the toolset under control for the whole project lifecycle is to &lt;a href="https://axemsolutions.io/blog/optimized-development-environment-with-containerization.html"&gt;apply containerization techniques&lt;/a&gt;. &lt;strong&gt;Although containerization has many benefits, working on multiple projects can easily lead to several different container images.&lt;/strong&gt;&lt;br&gt;
At axem, we also reached a point where it became quite difficult to keep track of the tool images required for the projects. Hence &lt;strong&gt;we created a script&lt;/strong&gt; that could be used to assign the images to the projects.&lt;br&gt;
As we saw that containerization started to become quite popular in the embedded field, &lt;strong&gt;we decided to open up the script for the community&lt;/strong&gt;. Our intention was to give back to those who helped us and countless others along the way. &lt;strong&gt;This was the beginning of the &lt;a href="https://axemsolutions.io/dem_doc/"&gt;DEM&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We believe in the positive impact of having an outsider’s opinion, but our project is quite young and in this phase, &lt;strong&gt;it is hard to encourage people to collaborate&lt;/strong&gt;. So we decided that we would like to nominate &lt;strong&gt;DEM as a project open for contribution in Hacktoberfest 2023&lt;/strong&gt;.&lt;br&gt;
Since opening the source, several new releases have been created from the DEM project, but all the implementations were done by the axem team, based on our inner processes. &lt;strong&gt;To be able to guide our new contributors properly, we had to make the DEM contributor-friendly&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing the DEM GitHub repository
&lt;/h2&gt;

&lt;p&gt;Nominating a project for Hacktoberfest doesn’t have any requirements, except maybe using the “hacktoberfest” topic and label in the repo. However, t*&lt;em&gt;here are some best practices to make your issues more appealing&lt;/em&gt;* to potential contributors. Here are our two cents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Contribution Guideline&lt;/strong&gt; that is easy to follow&lt;/li&gt;
&lt;li&gt;Create a welcoming &lt;strong&gt;Code of Conduct&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose some &lt;strong&gt;issues that look interesting&lt;/strong&gt;, have a well-defined scope and clear description, and apply the “hacktoberfest” label to them&lt;/li&gt;
&lt;li&gt;Create issue and PR &lt;strong&gt;templates&lt;/strong&gt; for maintainability&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;README&lt;/strong&gt;, highlight that the project is participating in the Hacktoberfest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you just started your own project, the &lt;a href="https://opensource.guide/"&gt;Open Source Guide&lt;/a&gt; is an excellent content on how to launch and grow an open-source project.&lt;/p&gt;

&lt;p&gt;In the next chapters, I provide more details for each point mentioned above. As the &lt;strong&gt;DEM is hosted on GitHub&lt;/strong&gt;, the descriptions will be specific to the GitHub platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Contribution Guideline
&lt;/h2&gt;

&lt;p&gt;A Contribution Guideline has several essential purposes like &lt;strong&gt;maintaining consistency, clarifying expectations, and ensuring quality control&lt;/strong&gt;.&lt;br&gt;
First, we need to &lt;strong&gt;consider the specific goals&lt;/strong&gt; of our project and &lt;strong&gt;decide on the types of contributions&lt;/strong&gt; we are looking for.&lt;/p&gt;

&lt;p&gt;In DEM we expect two kinds of contributions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Creating a new issue:&lt;/strong&gt; Here a contributor can file any feedback, bug report, or feature idea.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submitting a PR:&lt;/strong&gt; The implementation of a specific issue. Both code and no-code modifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After we defined the specific goals we had to decide on the format of the guideline. The &lt;strong&gt;most common format is&lt;/strong&gt; a Markdown (.md) file named &lt;strong&gt;‘CONTRIBUTING.md’&lt;/strong&gt;.&lt;br&gt;
Before creating this file we should be aware of the concept of special treatment for certain files within a GitHub repository. Some files are treated differently in a GitHub repository if they match a naming convention and are &lt;strong&gt;stored in either the root, the docs, or the .github directory&lt;/strong&gt;. An example is the 'CONTRIBUTING.md' file. This way GitHub will recognize the file as a contribution guideline. To create the file you can follow &lt;a href="https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/setting-guidelines-for-repository-contributors"&gt;GitHub’s step-by-step guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When filling in the details, for better understanding we broke down the guidelines into &lt;strong&gt;two main sections&lt;/strong&gt;. After a short introduction, we described how to create and work on an issue in the DEM project. In the second part, we explained how one can start to work with the source files and test their modifications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Code of Conduct
&lt;/h2&gt;

&lt;p&gt;By accepting outside contributors, the community grows with the new members. To establish a set of &lt;strong&gt;clear guidelines and expectations for behavior and interactions among community members&lt;/strong&gt; we created a Code of Conduct. &lt;strong&gt;Our goal is to make sure that every newcomer feels welcomed and appreciated&lt;/strong&gt;. Maintaining a safe space can be a daunting task for project maintainers. Everyone has their own value system, so establishing the ground rules can &lt;strong&gt;reduce the occurrence and intensity of conflicts&lt;/strong&gt;.&lt;br&gt;
Writing a Code of Conduct from scratch is a challenging task. Fortunately, GitHub provides a well-written template that project maintainers can customize for their use case.&lt;br&gt;
The Code of Conduct can be stored as another special file of GitHub, called the &lt;strong&gt;'CODE_OF_CONDUCT.md'&lt;/strong&gt;. Again, this file needs to be placed in either the root, the docs, or the .github directory, so GitHub will automatically recognize it and load it to the Code of Conduct label of the About section.&lt;/p&gt;

&lt;p&gt;You can find a step-by-step guide to create a CoC &lt;a href="https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/setting-guidelines-for-repository-contributors"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing issues for open-source contribution
&lt;/h2&gt;

&lt;p&gt;In Hacktoberfest, new contributors often embark on projects with which they may have little familiarity. Expecting them to understand the whole architecture, especially in the case of complex projects, is unrealistic. So &lt;strong&gt;it is the maintainers’ task to offer guidance and support&lt;/strong&gt; in navigating these challenges. To make the journey smoother for both contributors and project maintainers, consider these &lt;strong&gt;tips and tricks when selecting issues that are most appealing to potential contributors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue independence:&lt;/strong&gt; Issues should not be interdependent or block other high-priority tasks. Project management can quickly become complex if contributors must wait for other tasks to be completed. On the flip side, issues that are reliant on unresolved dependencies may deter potential contributors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Well-defined scope:&lt;/strong&gt; Contributors are more likely to engage with an issue if its scope is well-defined and easily graspable. Issues with ambiguous or broad objectives can be intimidating for newcomers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detailed issue description:&lt;/strong&gt; To facilitate understanding and engagement, it's crucial to craft detailed issue descriptions. A graphical representation like a flowchart or diagram can always help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utilize issue templates:&lt;/strong&gt; Issue templates can significantly enhance the contributor experience. Templates provide a structured framework for issue reporting, ensuring that essential details are not overlooked. They make the overview of issues cleaner and more organized, helping contributors focus on the task at hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Link relevant documentation:&lt;/strong&gt; Whenever possible, link relevant documentation to the issue. This includes references to project documentation, coding guidelines, and any relevant resources that can aid contributors in understanding the project's context and requirements. Accessible documentation encourages informed contributions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the list of issues is ready, the only thing left to do is to assign the &lt;strong&gt;“hacktoberfest” label&lt;/strong&gt; to them. You can also use the “good first issue” label to help new contributors to find issues, which are easy to start with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating templates
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub PR template
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;To maintain consistency and traceability&lt;/strong&gt; in our DEM repository, we have added a PR template. This template includes the following key sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checklist:&lt;/strong&gt; There are certain requirements that must be fulfilled before a modification can be applied. Contributors can use a checklist to ensure that these requirements are fulfilled, marking them as completed. GitHub tracks the checklist's status, providing a clear indicator of progress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Related issue:&lt;/strong&gt; Here, we encourage contributors to reference the issue that the PR addresses. This link enhances our project's traceability significantly. Both our project management tools, Jira and GitHub issues, display linked PRs in the issues' properties, streamlining our workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type of change:&lt;/strong&gt; To categorize PRs effectively, we've included properties related to the type of change being introduced. Contributors can specify whether the PR constitutes a bug fix, a new feature, a breaking change, or a documentation update.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description:&lt;/strong&gt; In this section, contributors provide an in-depth and detailed description of the proposed modifications. This description ensures that reviewers and other contributors have a comprehensive understanding of the changes being made&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test cases:&lt;/strong&gt; We request that contributors outline how they have tested their modifications. This transparency in testing methods helps maintain the project's reliability and quality assurance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshots:&lt;/strong&gt; Sometimes, visual aids in the form of screenshots can help the understanding of the behavior changes introduced by the PR. We encourage contributors to include such screenshots when applicable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can follow &lt;a href="https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository"&gt;this&lt;/a&gt; step-by-step guide on how to create a PR template.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Issue template
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;valuable way to contribute&lt;/strong&gt; to DEM is by providing feedback by creating issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bug report:&lt;/strong&gt; We greatly appreciate reporting any instances of faulty behavior. Your bug reports help us identify and address issues promptly, improving the project's overall reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation change request:&lt;/strong&gt; We try to keep the documentation as clear as possible and up-to-date. We welcome and encourage requests for documentation clarification. Your input helps us maintain accessible and accurate resources for all users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature request:&lt;/strong&gt; We value your innovative ideas for new features that could enhance DEM. Contributors are encouraged to share their feature requests, which contribute to the evolution and expansion of the project's capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report a security vulnerability:&lt;/strong&gt; While we have been fortunate not to encounter any security vulnerabilities thus far, we understand the importance of a secure environment. To address this concern, we have configured an email address to receive potential security vulnerability reports. We also provide guidance on how to file vulnerability reports using GitHub's built-in function, should the need ever arise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can apply GitHub’s &lt;a href="https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/about-issue-and-pull-request-templates"&gt;built in function&lt;/a&gt; to create issue templates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update the README
&lt;/h2&gt;

&lt;p&gt;Adding another label in the repo's About section may not sufficiently capture the attention of visitors. &lt;strong&gt;A well-crafted README on the other hand immediately conveys that the project is actively participating in Hacktoberfest.&lt;/strong&gt;&lt;br&gt;
In the DEM repository, we've added a general Hacktoberfest introduction, complete with links to the Contribution Guideline and the &lt;a href="https://discord.com/invite/Nv6hSzXruK"&gt;XM community&lt;/a&gt;. This approach ensures that visitors to the repository are promptly informed about our participation in this event and have easy access to relevant resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a community: XM
&lt;/h2&gt;

&lt;p&gt;Communication is key for every successful collaboration. &lt;strong&gt;Providing multiple channels for contributors&lt;/strong&gt; to reach out to each other and the maintainers can speed up the onboarding and help them to fit in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We set up 3 channels:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct messages:&lt;/strong&gt; We encourage contributors to reach out to us through direct messages on GitHub. Additionally, we have designated a specific email address that is actively monitored by all maintainers. This approach guarantees that contributors have accessible means to contact us directly for inquiries or assistance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Discussions:&lt;/strong&gt; Leveraging GitHub's built-in functionality, we offer a Q&amp;amp;A-like interface through GitHub Discussions. This platform serves as an open space for discussions, where contributors can seek answers to their queries, share insights, and engage with fellow collaborators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The XM community:&lt;/strong&gt; As part of axem's commitment to fostering an open and inclusive environment, we have established the XM community on &lt;a href="https://discord.com/invite/Nv6hSzXruK"&gt;Discord&lt;/a&gt;, dedicated to discussions related to &lt;strong&gt;embedded tooling and the ecosystem&lt;/strong&gt;. Within this community, we have created a dedicated section, known as a Thread in Discord terminology, specifically tailored for Hacktoberfest discussions. This space provides a dynamic and real-time platform for contributors to connect, share ideas, and collaborate effectively.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Spreading the word
&lt;/h2&gt;

&lt;p&gt;Nominating a repository in Hacktorberfest is as easy as adding the &lt;strong&gt;“hacktoberfest”&lt;/strong&gt; or &lt;strong&gt;“hacktoberfest2023”&lt;/strong&gt; topics in the &lt;em&gt;About&lt;/em&gt; section. This way the repository will be visible when filtering for these topics, alongside the more than 133 thousand other ones matching the criteria… &lt;strong&gt;So standing out is quite difficult. Here are some tips that we found useful:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the right labeling for your repository and the issues&lt;/li&gt;
&lt;li&gt;Share the repository in Hacktoberfest’s official Discord server&lt;/li&gt;
&lt;li&gt;Look for contributors in related communities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By implementing these strategies, you can increase your repository's visibility for potential contributors during Hacktoberfest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist
&lt;/h2&gt;

&lt;p&gt;As we get ready for DEM's first Hacktoberfest, we've learned &lt;strong&gt;valuable tips&lt;/strong&gt; for preparing an open-source project. These include &lt;strong&gt;clear guidelines, communication, and engagement&lt;/strong&gt;.&lt;br&gt;
For an overall project health check, you can use GitHub's "health checklist" found under Insights -&amp;gt; Community Standards. It helps assess our readiness and adherence to open-source best practices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--txtpxiKT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qgzpzkqh1g524itl2cr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--txtpxiKT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qgzpzkqh1g524itl2cr9.png" alt="Example: GitHub Community standards" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hacktoberfest is a celebration of the global open-source community&lt;/strong&gt;, and by opening our doors to contributions, we aim to give back to this incredible ecosystem while fostering a welcoming environment for newcomers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open source is about collaboration, knowledge sharing, and community building.&lt;/strong&gt; By taking these steps, we hope to make our DEM project a rewarding experience for both seasoned contributors and newcomers. As we embark on this Hacktoberfest journey, we look forward to witnessing the positive impact of collective effort, innovative ideas, and the spirit of open source. &lt;strong&gt;Together, we can build a stronger, more vibrant open-source ecosystem for everyone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wvorq_cz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q0zdt9h3elxfjy2dtg0b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wvorq_cz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q0zdt9h3elxfjy2dtg0b.gif" alt="Happy coding cat" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Illustrations were used from hacktoberfest.com&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>hacktoberfest23</category>
      <category>hacktoberfest</category>
      <category>python</category>
      <category>containers</category>
    </item>
    <item>
      <title>Join the Hottest Hacktoberfest Project of 2023 🚀</title>
      <dc:creator>Eszter Vezden</dc:creator>
      <pubDate>Wed, 04 Oct 2023 09:07:48 +0000</pubDate>
      <link>https://dev.to/axem/join-the-hottest-hacktoberfest-project-of-2023-587f</link>
      <guid>https://dev.to/axem/join-the-hottest-hacktoberfest-project-of-2023-587f</guid>
      <description>&lt;p&gt;&lt;strong&gt;axem&lt;/strong&gt; is excited to join the Hacktoberfest community for the very first time! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  About us:
&lt;/h2&gt;

&lt;p&gt;We're focused on simplifying embedded development with our project, DEM (Development Environment Manager).&lt;br&gt;
DEM is a command line tool that provides an easy, reproducible, and scalable way to set up &lt;strong&gt;containerized Development Environments&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful links:
&lt;/h2&gt;

&lt;p&gt;GitHub repository: &lt;a href="https://github.com/axem-solutions/dem"&gt;https://github.com/axem-solutions/dem&lt;/a&gt;&lt;br&gt;
And detailed documentation: &lt;a href="https://axemsolutions.io/dem_doc/"&gt;https://axemsolutions.io/dem_doc/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technology Used:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enhance your skills in Python&lt;/li&gt;
&lt;li&gt;Learn more about containerization&lt;/li&gt;
&lt;li&gt;Learn about development platforms&lt;/li&gt;
&lt;li&gt;Shape the future of embedded development tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Team axem: &lt;a href="https://discord.com/invite/Nv6hSzXruK"&gt;XM Discord server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're eager to receive your feedback and contributions to make DEM the go-to tool for embedded developers.&lt;br&gt;
Don't forget to Star the project 🌟&lt;/p&gt;

</description>
      <category>hacktoberfest23</category>
      <category>devops</category>
      <category>docker</category>
      <category>python</category>
    </item>
    <item>
      <title>Introducing XM: A New Embedded Tooling and DevOps Community</title>
      <dc:creator>Eszter Vezden</dc:creator>
      <pubDate>Wed, 04 Oct 2023 08:48:20 +0000</pubDate>
      <link>https://dev.to/axem/introducing-xm-a-new-embedded-tooling-and-devops-community-21fo</link>
      <guid>https://dev.to/axem/introducing-xm-a-new-embedded-tooling-and-devops-community-21fo</guid>
      <description>&lt;p&gt;I'm thrilled to announce the launch of XM, a vibrant new space dedicated to all things Embedded Tooling and DevOps. 🚀&lt;/p&gt;

&lt;p&gt;XM Community is about empowering embedded developers, fostering innovation, and sharing insights on cutting-edge tooling and DevOps practices.&lt;/p&gt;

&lt;p&gt;Whether you're a seasoned pro or just starting your journey, our community welcomes you to connect, learn, and grow together.&lt;/p&gt;

&lt;p&gt;Join the XM Community Discord server today and be part of a dynamic network of embedded enthusiasts, where knowledge flows, ideas thrive, and collaboration knows no bounds.&lt;/p&gt;

&lt;p&gt;Join here: &lt;a href="https://discord.gg/Nv6hSzXruK"&gt;XM Discord server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WOlqH0Jy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6yca6guauakud3rxxlh0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WOlqH0Jy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6yca6guauakud3rxxlh0.png" alt="XM: The New Embedded DevOps Community" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>embedded</category>
      <category>news</category>
      <category>community</category>
    </item>
    <item>
      <title>Creating an Optimized Development Environment beyond traditional IDEs</title>
      <dc:creator>Eszter Vezden</dc:creator>
      <pubDate>Wed, 13 Sep 2023 15:24:32 +0000</pubDate>
      <link>https://dev.to/axem/creating-an-optimized-development-environment-beyond-traditional-ides-51ip</link>
      <guid>https://dev.to/axem/creating-an-optimized-development-environment-beyond-traditional-ides-51ip</guid>
      <description>&lt;h2&gt;
  
  
  What is an IDE?
&lt;/h2&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Writing embedded software&lt;/strong&gt; for other architectures than our host usually &lt;strong&gt;requires a lot of different tools.&lt;/strong&gt;&lt;br&gt;
The tools used for a specific project can be grouped together and they form a Development Environment. To make it simpler to work with these tools, &lt;strong&gt;they are typically bundled together into an IDE (Integrated Development Environment).&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w2AlIPNs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ydev9c78pitundlookak.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w2AlIPNs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ydev9c78pitundlookak.png" alt="Example: Tools bundled into an IDE" width="581" height="460"&gt;&lt;/a&gt;&lt;/p&gt;
Example: Tools bundled into an IDE








&lt;h3&gt;
  
  
  Frequent problems
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
If you used IDEs before, you probably faced at least some of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The error-prone and time-consuming setup process&lt;/li&gt;
&lt;li&gt;Tools are hardcoded into IDEs&lt;/li&gt;
&lt;li&gt;More instances of the same tool&lt;/li&gt;
&lt;li&gt;Difficult IDE and tool version management&lt;/li&gt;
&lt;li&gt;The IDEs enforce the use of their UI &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  One of the biggest disadvantages of IDEs
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
From the list above the second is a crucial problem if you want to create a well-managed infrastructure. When working with IDEs, you cannot easily use the underlying integrated tools separately. They usually depend on the IDE or each other, so &lt;strong&gt;standalone usage can be problematic&lt;/strong&gt; and the whole IDE installation is required.&lt;/p&gt;




&lt;h3&gt;
  
  
  Problem #1: When navigating multiple projects
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Let's say at your company &lt;strong&gt;the developers have to work on different projects simultaneously, switching between tools even daily.&lt;/strong&gt; &lt;br&gt;
If they want to keep all the needed tools on their PCs at the same time, more issues can occur: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A lot of duplications - storage-consuming&lt;/li&gt;
&lt;li&gt;Tools can interfere&lt;/li&gt;
&lt;li&gt;Version management of the tools is crazy &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Re-installing an IDE&lt;/strong&gt; every time to switch tools &lt;strong&gt;is time-consuming&lt;/strong&gt; and let's face it: most developers don't like operational tasks. &lt;br&gt;
To avoid the re-installation of whole IDEs somehow we have to &lt;strong&gt;reduce the dependencies between the tools&lt;/strong&gt; and provide the possibility of standalone usage. &lt;/p&gt;




&lt;h3&gt;
  
  
  Problem #2: "It works on MY PC!"
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Even if you are not project-based, you probably heard your co-worker say, "I don't know what's wrong with your installation. It works on my PC!"&lt;br&gt;
&lt;strong&gt;When setting up your Development Environment the process is unpredictable.&lt;/strong&gt; Two of the annoying scenarios: &lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything works smoothly on the first try. (But you already sense something will go wrong and the worst is you don't even see what. You start praying to the gods of tech.)&lt;/li&gt;
&lt;li&gt;Random errors during development. It can be painful to discover after days of debugging that an environment variable had a different value for some obscure reason.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Isolating tools: Containerization
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
To eliminate these problems, the tools need to operate in their own isolated environments. A &lt;strong&gt;lightweight and fast solution&lt;/strong&gt; for isolation is containerization.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A container is a completely isolated hosting environment, specifically tailored for the needs of the application it runs.&lt;/strong&gt; The tools get built into their respective &lt;strong&gt;container images&lt;/strong&gt;, and the way they communicate with the host system can be controlled. Containerization also ensures there is no interference between the tools. &lt;strong&gt;With this concept, consistent and scalable customized Development Environments can be built easily.&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K1ApEU-x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kopkis8raobf6jukqfr2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K1ApEU-x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kopkis8raobf6jukqfr2.png" alt="Tools used standalone, isolated in containers" width="581" height="460"&gt;&lt;/a&gt;&lt;/p&gt;
Tools used standalone, isolated in containers






&lt;h3&gt;
  
  
  Virtual Machine vs. Container
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
To understand the containerization concept it can be useful to compare it to the well-known virtual machines:&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sH2znzx8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/biz4bxcrzwrgbq8z9126.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sH2znzx8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/biz4bxcrzwrgbq8z9126.png" alt="VM concept" width="786" height="340"&gt;&lt;/a&gt;&lt;/p&gt;
VM concept



&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4eePQ_hG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/990pjemw0umw1hm0t3fn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4eePQ_hG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/990pjemw0umw1hm0t3fn.png" alt="Container concept" width="786" height="340"&gt;&lt;/a&gt;&lt;/p&gt;
Container concept





&lt;ul&gt;
&lt;li&gt;A VM runs as a standalone OS on top of the host OS&lt;/li&gt;
&lt;li&gt;The container uses the shared resources of the host OS&lt;/li&gt;
&lt;li&gt;Different lifetime: a VM is persistent, &lt;strong&gt;a container only exists while needed&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Unveiling the Advantages
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Now that we have all the tools in containers on our PC, after setting up the communication between them we have an optimized Development Environment. &lt;strong&gt;The advantages of an optimized DevEnv:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy and quick setup process&lt;/li&gt;
&lt;li&gt;Tools are not hardcoded into IDEs anymore, standalone usage is possible&lt;/li&gt;
&lt;li&gt;Keeping one instance of a tool is enough&lt;/li&gt;
&lt;li&gt;The same tool with different versions can be present on our host&lt;/li&gt;
&lt;li&gt;The developer is free to choose her favorite editor&lt;/li&gt;
&lt;li&gt;No interference between the tools&lt;/li&gt;
&lt;li&gt;Communication between the tool and the host can be controlled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Containerization gives flexibility, portability, reproducibility, and scalability to embedded software development and is a key when creating optimized Development Environments.&lt;/strong&gt; &lt;/p&gt;




&lt;h2&gt;
  
  
  A little extra: Optimized Hybrid Development Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is a Hybrid Development Environment?
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt; &lt;br&gt;
We call a Development Environment &lt;strong&gt;Hybrid when the tools part of the DevEnv are not running in the same place&lt;/strong&gt;. For example, a debugger is running on an SBC, or a build system is running in a cloud environment.&lt;/p&gt;




&lt;h3&gt;
  
  
  Containerization in a Hybrid Development Environment
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
After creating an optimized Development Environment, it's worth checking what &lt;strong&gt;other benefits can containerization bring to the table&lt;/strong&gt;.&lt;br&gt;
By combining a Hybrid DevEnv with containerization the following environment can be built easily:&lt;br&gt;
&lt;br&gt; &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z1j_hSXL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ng6be5xe749mu59bnw1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z1j_hSXL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ng6be5xe749mu59bnw1m.png" alt="Example: A Hybrid Development Environment with containerized tools" width="581" height="460"&gt;&lt;/a&gt;&lt;/p&gt;
Example: A Hybrid Development Environment with containerized tools



&lt;p&gt;&lt;br&gt; &lt;br&gt;
In this case, the client side of the chosen editor is running on the developer's PC, while the editor's server side, the build system, and the toolchain are deployed in the &lt;strong&gt;cloud&lt;/strong&gt;. The project also has a Debugger or Flasher running on an &lt;strong&gt;SBC&lt;/strong&gt;, depending on the state of development.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
This example makes &lt;strong&gt;one of the greatest advantages of containerization clear: Containerized tools can move across physical and cloud environments easily&lt;/strong&gt;. As the embedded development landscape continues to evolve, containerization is likely to become an even more significant player in enabling efficient and effective development practices for embedded systems.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>discuss</category>
      <category>embedded</category>
    </item>
    <item>
      <title>Seamless embedded software development - The Benefits of Internal Developer Platforms</title>
      <dc:creator>janosmurai</dc:creator>
      <pubDate>Mon, 17 Jul 2023 17:09:17 +0000</pubDate>
      <link>https://dev.to/axem/seamless-embedded-software-development-the-benefits-of-internal-developer-platforms-m0a</link>
      <guid>https://dev.to/axem/seamless-embedded-software-development-the-benefits-of-internal-developer-platforms-m0a</guid>
      <description>&lt;p&gt;Embedded software development plays a crucial role in powering modern technology, enabling the functionality and intelligence of various devices and systems. As the complexity of embedded software continues to grow, &lt;strong&gt;companies in the industry are recognizing the importance of streamlining their development processes to improve their efficiency.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One effective method of achieving this is through the &lt;strong&gt;integration of the many development tools&lt;/strong&gt; (e.g. build systems, toolchains, debuggers, etc.) into a manageable service, called an &lt;a href="https://internaldeveloperplatform.org/what-is-an-internal-developer-platform/"&gt;Internal Developer Platform (IDP)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The history of IDPs can be traced back to the growing complexity of software development processes within organizations. As software systems became more intricate and interdependent, the need for efficient collaboration, streamlined workflows, and standardized tools became evident. Internal Developer Platforms emerged as a solution to these challenges, providing &lt;strong&gt;a dedicated environment for developers to create, test, and deploy software&lt;/strong&gt; applications.&lt;/p&gt;

&lt;p&gt;Over time, these platforms evolved to offer enhanced capabilities, such as automated CI/CD pipelines, integrated development environments (IDEs), and shared libraries, enabling organizations to &lt;strong&gt;improve&lt;/strong&gt; productivity, &lt;strong&gt;accelerate&lt;/strong&gt; development cycles, and &lt;strong&gt;maintain&lt;/strong&gt; consistency across their software projects.&lt;/p&gt;

&lt;p&gt;This article delves into the importance of embedded software development organizations developing their IDPs and highlights several compelling reasons to do so. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boosting efficiency by reducing reliance on other teams&lt;/li&gt;
&lt;li&gt;Standardized tools for standardized processes&lt;/li&gt;
&lt;li&gt;Easy CI/CD management&lt;/li&gt;
&lt;li&gt;Quick adaptation to changes&lt;/li&gt;
&lt;li&gt;Safeguarding intellectual property through enhanced security measures&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Boosted Efficiency
&lt;/h2&gt;

&lt;p&gt;Minimizing distractions allows individuals to fully concentrate on tasks and optimize their productivity. An Internal Developer Platform consists of &lt;strong&gt;standardized Development Environments&lt;/strong&gt; that can be &lt;strong&gt;self-served&lt;/strong&gt; by software development team members. By providing the required tools on hand, IDPs can &lt;strong&gt;reduce the time spent on communication with IT/Ops&lt;/strong&gt; and can enable teams to &lt;strong&gt;get up to speed more quickly.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Standardization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;In safety-critical fields&lt;/strong&gt; where embedded software is often used, complying with rigorous quality standards is mandatory. IDPs facilitate the establishment of &lt;strong&gt;standardized development processes&lt;/strong&gt; across an organization by ensuring the consistency of the Development Environments. They can enforce quality control measures such as code reviews and automated testing, leading to higher software reliability.&lt;br&gt;
The standards apply not only to the production code but also to the development tools. IDPs can ensure the utilization of the specified &lt;strong&gt;compliant tools&lt;/strong&gt; throughout the development lifecycle, by providing them &lt;strong&gt;from a central, managed catalog.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Continuous Integration and Deployment (CI/CD)
&lt;/h2&gt;

&lt;p&gt;Continuous Integration (CI) is already widely used in embedded software projects and Continuous Delivery (CD) is becoming more and more common for devices that can be updated online. CI/CD ensures &lt;strong&gt;faster delivery, reliable software releases, and better feedback&lt;/strong&gt; for the developers. &lt;strong&gt;IDPs provide the necessary infrastructure&lt;/strong&gt; and tools to implement the CI/CD pipelines. Integrating automated build processes, testing frameworks, and deployment pipelines into the IDP makes software delivery efficient and reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scalability and Adaptability
&lt;/h2&gt;

&lt;p&gt;As embedded software projects grow in complexity, having a development platform that can scale accordingly becomes essential. &lt;strong&gt;IDPs can be customized and extended&lt;/strong&gt; to accommodate the evolving needs of software development teams, ensuring they can meet the demands of their projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security and Intellectual Property Protection
&lt;/h2&gt;

&lt;p&gt;Embedded software development often involves sensitive intellectual property (IP) and security concerns. With an IDP, companies can establish &lt;strong&gt;secure development environments with role-based access controls (RBAC)&lt;/strong&gt; to protect their valuable assets. &lt;strong&gt;IDPs can also incorporate security analysis tools and vulnerability assessments&lt;/strong&gt;, ensuring that software is developed with security best practices in mind. Having a &lt;strong&gt;central tool catalog&lt;/strong&gt; can also decrease security risks because the used tools are not downloaded from unknown sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can DEM power your IDP?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://axemsolutions.io/dem_doc/"&gt;Containerizing your development tools&lt;/a&gt; can help you maintain reliable and scalable environments. Storing the container images in a central catalog enforces integrity. An IDP based on containerized Development Environments can &lt;strong&gt;ensure that the right tools are used in every environment&lt;/strong&gt;, like the developer’s PC or the CI/CD server. To simplify the process of obtaining tools for a specific project and maintaining a &lt;strong&gt;consistent Development Environment through the whole project life cycle&lt;/strong&gt;, our open-source tool, the &lt;a href="https://axemsolutions.io/dem_doc/"&gt;Development Environment Manager (DEM)&lt;/a&gt; comes in handy. With DEM, developers can set up a Development or CI/CD Environment &lt;strong&gt;with a single command&lt;/strong&gt; and eliminate the notorious “It worked on my PC!” situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Points to Remember
&lt;/h2&gt;

&lt;p&gt;Internal Developer Platforms offer embedded software development teams a range of advantages that contribute to &lt;strong&gt;improved collaboration, faster development cycles, higher quality software, and reduced time-to-market.&lt;/strong&gt; If the developers can focus on their actual tasks instead of tweaking the infrastructure, they can &lt;strong&gt;stay in flow&lt;/strong&gt; much longer, which leads to &lt;strong&gt;less frustration&lt;/strong&gt;. Improved developer experience can have &lt;strong&gt;significant positive impacts on productivity, morale, and also reduce fluctuation&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>embedded</category>
      <category>devops</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
