<?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: Uilian Ries</title>
    <description>The latest articles on DEV Community by Uilian Ries (@uilianries).</description>
    <link>https://dev.to/uilianries</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F46510%2F75f97ee8-b3ac-45b3-832c-3fbb25120a4c.jpeg</url>
      <title>DEV Community: Uilian Ries</title>
      <link>https://dev.to/uilianries</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uilianries"/>
    <language>en</language>
    <item>
      <title>Getting prepared for LPI certifications with LPI Lab</title>
      <dc:creator>Uilian Ries</dc:creator>
      <pubDate>Sat, 28 Mar 2026 19:58:38 +0000</pubDate>
      <link>https://dev.to/defumaklabs/getting-prepared-for-lpi-certifications-with-lpi-lab-48cm</link>
      <guid>https://dev.to/defumaklabs/getting-prepared-for-lpi-certifications-with-lpi-lab-48cm</guid>
      <description>&lt;p&gt;I'm glad to introduce the LPI Lab, the ultimate app designed to help you master your Linux Professional Institute (LPI) exams. Whether you're aiming for Linux Essentials, LPIC-1, or LPIC-2 certifications, LPI Lab is your daily go-to tool for comprehensive and effective preparation.&lt;/p&gt;

&lt;p&gt;The idea for LPI Lab came from a real need during my own certification journey. While studying for LPIC-1, I relied on official documentation, man pages, and books. Those resources are essential, but I felt there was still something missing: a fast and convenient way to practice every day, especially during small breaks in a busy routine.&lt;/p&gt;

&lt;p&gt;That’s exactly why LPI Lab was built: to make certification prep more practical and help learners feel ready to pass on their first attempt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features at a Glance
&lt;/h3&gt;

&lt;p&gt;Here’s a quick overview of what LPI Lab offers to support your certification journey:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Practice Mode&lt;/strong&gt;: Customize your study sessions with specific question counts and time limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulation Mode&lt;/strong&gt;: Experience the real exam environment with timed, realistic conditions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Questions&lt;/strong&gt;: Tackle multiple question types with instant feedback and detailed explanations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Support&lt;/strong&gt;: Full coverage for Linux Essentials (010-160), LPIC-1 (101-500, 102-500), and LPIC-2 (201-450, 202-450).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Access&lt;/strong&gt;: All practice questions are available offline, ensuring you never have to stop learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Roadmap for 2026
&lt;/h3&gt;

&lt;p&gt;Thinking about the next steps and evolution of the app, a roadmap has been prepared to introduce new features, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LPIC-3&lt;/strong&gt;: Full support for all 4 most advanced exams from LPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Essential&lt;/strong&gt;: Second new exam covering the Essentials certifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Language Support&lt;/strong&gt;: Add Spanish and Portuguese, including for all questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Tracking&lt;/strong&gt;: Interactive graphs showing your score improvement over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To obtain more details, check the &lt;a href="https://lpilab.defumak.xyz/roadmap.html" rel="noopener noreferrer"&gt;Complete Roadmap&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Get Started Today
&lt;/h3&gt;

&lt;p&gt;Ready to take your Linux skills to the next level? Download LPI Lab from the Google Play Store and start your journey towards becoming a certified Linux professional.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=xyz.defumak.lpilab&amp;amp;pcampaignid=web_share" rel="noopener noreferrer"&gt;Download LPI Lab on Google Play&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more information, visit the official website: &lt;a href="https://liblab.defumak.xyz" rel="noopener noreferrer"&gt;LPI Lab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's achieve our certification goals together!&lt;/p&gt;

</description>
      <category>lpi</category>
      <category>lpic</category>
      <category>linux</category>
      <category>android</category>
    </item>
    <item>
      <title>Faker C++: Generate Realistic Fake Data for Testing and Development</title>
      <dc:creator>Uilian Ries</dc:creator>
      <pubDate>Thu, 04 Jul 2024 12:51:28 +0000</pubDate>
      <link>https://dev.to/uilianries/faker-c-generate-realistic-fake-data-for-testing-and-development-2eh2</link>
      <guid>https://dev.to/uilianries/faker-c-generate-realistic-fake-data-for-testing-and-development-2eh2</guid>
      <description>&lt;p&gt;Hey there, C++ developers! 👋 Are you tired of creating mock data for your tests and prototypes? Say hello to Faker C++, a powerful library designed to generate realistic fake data for C++ applications. Let's dive into what makes this library special and how it can supercharge your development workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Faker C++?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/cieslarmichal/faker-cxx"&gt;Faker C++&lt;/a&gt; is a C++ library inspired by the popular &lt;a href="https://fakerjs.dev/"&gt;Faker.js&lt;/a&gt;, aimed at providing developers with a robust tool for generating fake (but realistic) data. Whether you're building test suites, populating databases, or creating demos, Faker C++ has got you covered. It's open source and under MIT license.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;📚 Realistic Data Generation: Generate various types of data including names, addresses, emails, dates, and more.&lt;/li&gt;
&lt;li&gt;🛠 Modular Design: Choose from a wide range of modules like Internet, Location, String, Date, and more to generate specific types of data.&lt;/li&gt;
&lt;li&gt;🚀 Easy Integration: Seamlessly integrate with CMake, and it supports major compilers like MSVC, GCC, Clang, and Apple Clang.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Example
&lt;/h2&gt;

&lt;p&gt;Here's a taste of what you can do with Faker C++:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.cpp&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstdlib&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"faker-cxx/Internet.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"faker-cxx/Location.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"faker-cxx/String.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Internet&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Internet&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;streetAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;streetAddress&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;streetAddress&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;EXIT_SUCCESS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Consuming and using Faker C++
&lt;/h2&gt;

&lt;p&gt;Let's see how to install and link to faker library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing with Conan 2.x
&lt;/h3&gt;

&lt;p&gt;Faker C++ can be easily installed and integrated into your projects using Conan. Here's how you can do it:&lt;/p&gt;

&lt;p&gt;First, make sure you have Conan 2.x installed. If not, you can install it using pip:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;conan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install faker-cxx, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conan &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; conancenter &lt;span class="nt"&gt;--requires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"faker-cxx/[*]"&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;missing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will fetch the latest version of faker-cxx and build it if necessary.&lt;/p&gt;

&lt;p&gt;If you want to use faker-cxx in your CMake project, you can create a &lt;code&gt;conanfile.txt&lt;/code&gt; in your project root with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[requires]&lt;/span&gt;
&lt;span class="err"&gt;faker-cxx/&lt;/span&gt;&lt;span class="nn"&gt;[*]&lt;/span&gt;

&lt;span class="nn"&gt;[generators]&lt;/span&gt;
&lt;span class="err"&gt;CMakeDeps&lt;/span&gt;
&lt;span class="err"&gt;CMakeToolchain&lt;/span&gt;

&lt;span class="nn"&gt;[layout]&lt;/span&gt;
&lt;span class="err"&gt;cmake_layout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using this conanfile.txt, Conan will provide faker-cxx CMake files under the folder &lt;code&gt;build/Release/generators/&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Consuming Faker C++
&lt;/h3&gt;

&lt;p&gt;Once you've set up Faker C++ and compiled your code, you can run your example to generate and display fake data.&lt;/p&gt;

&lt;p&gt;First, let's configure the &lt;code&gt;CMakeLists.txt&lt;/code&gt;, in order to link:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.15)
project(example)

find_package(faker-cxx REQUIRED)
add_executable(example main.cpp)
target_link_libraries(example faker-cxx::faker-cxx)
target_compile_features(example cxx_std_20)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we configure and build our example using Faker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cmake &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-B&lt;/span&gt; build &lt;span class="nt"&gt;-DCMAKE_TOOLCHAIN_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;build/Release/generators/conan_toolchain.cmake &lt;span class="nt"&gt;-DCMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Release
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can run our example using fake data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;build/example

11e9c8cc-04f8-49b2-ae28-afd6c5724e6d
CurtisShields@gmail.com
w&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;Ba.u3!N@&lt;span class="p"&gt;;&lt;/span&gt;Pz8
Shawnee
341 Meredith Hill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This output showcases a UUID, email address, password, city, and street address, all generated randomly by Faker C++. You can use similar functions to generate various other types of fake data as per your project’s requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Modules
&lt;/h2&gt;

&lt;p&gt;Faker C++ comes with a plethora of modules, each designed to generate specific types of data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🖥️ Internet: emails, usernames, passwords, IP addresses.&lt;/li&gt;
&lt;li&gt;🏢 Location: countries, cities, zip codes, street addresses.&lt;/li&gt;
&lt;li&gt;🎨 String: UUIDs, alphanumeric, numeric, hexadecimal strings.&lt;/li&gt;
&lt;li&gt;📖 Date: past and future dates.&lt;/li&gt;
&lt;li&gt;🐼 Animal: bears, birds, cats, dogs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And many more including modules for Commerce, Company, Finance, Food, Music, Sport, Vehicle, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community and Contributions
&lt;/h2&gt;

&lt;p&gt;Faker C++ is an open-source project and welcomes contributions! Whether you're fixing bugs, adding new features, or improving documentation, your help is appreciated. Check out our &lt;a href="https://github.com/cieslarmichal/faker-cxx/blob/main/CONTRIBUTING.md"&gt;Contributing&lt;/a&gt; Guide for more details. Join our &lt;a href="https://discord.gg/h2ur8H6mK6"&gt;Discord server&lt;/a&gt; to connect with other contributors.&lt;/p&gt;

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

&lt;p&gt;Faker C++ aims to be the go-to library for generating fake data in C++ projects. It's designed to make your testing and development process smoother and more efficient. Give it a try in your next project and let us know what you think!&lt;br&gt;
Check out the full documentation to explore all the capabilities of Faker C++. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>fakedata</category>
      <category>datageneration</category>
    </item>
    <item>
      <title>Building a Linux distro for OrangePi with Buildroot</title>
      <dc:creator>Uilian Ries</dc:creator>
      <pubDate>Sat, 03 Apr 2021 17:49:07 +0000</pubDate>
      <link>https://dev.to/uilianries/building-a-linux-distro-for-orangepi-with-buildroot-5549</link>
      <guid>https://dev.to/uilianries/building-a-linux-distro-for-orangepi-with-buildroot-5549</guid>
      <description>&lt;p&gt;&lt;em&gt;"If you wish to make an apple pie from scratch, you must first invent the universe."&lt;/em&gt; (Carl Sagan)&lt;/p&gt;

&lt;p&gt;Or, If you want to blink a led, you must first build your system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Introduction
&lt;/h4&gt;

&lt;p&gt;Building an embedded system, be it Linux or another kernel, from scratch, can be a difficult and time-consuming task in many cases. For such situations there are tools that automate the process of generating toolchains, dependencies and patches. Among them is &lt;a href="https://buildroot.org/" rel="noopener noreferrer"&gt;Buildroot&lt;/a&gt;, developed by the same maintainers of &lt;a href="https://www.uclibc.org/" rel="noopener noreferrer"&gt;uClibc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On this post we will build an entire Linux distro for Orange Pi Zero, using Buildroot to save our time. To check if all worked, we will also access board's UART by its serial interface and connect to Wi-Fi.&lt;/p&gt;

&lt;h4&gt;
  
  
  Orange Pi Zero
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="http://www.orangepi.org/orangepizero/" rel="noopener noreferrer"&gt;Orange PI Zero&lt;/a&gt; is another cheap single-board, similar to Raspberry Zero W.&lt;/p&gt;

&lt;p&gt;It's equipped with Allwinner H2 SoC, which provides a Quad-core Cortex-A7 processor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cnx-software.com%2Fwp-content%2Fuploads%2F2019%2F07%2FOrange-Pi-Zero-LTS-Allwinner-H2-SBC-Large.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cnx-software.com%2Fwp-content%2Fuploads%2F2019%2F07%2FOrange-Pi-Zero-LTS-Allwinner-H2-SBC-Large.jpg" alt="Orange Pi Zero - Top view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The Linux Embedded System
&lt;/h4&gt;

&lt;p&gt;Before proceeding, let's look at the basic architecture of an embedded system based on Linux:&lt;/p&gt;

&lt;p&gt;It can be divided in few layers:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimgur.com%2FYBpzogL.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimgur.com%2FYBpzogL.png" alt="System Layers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 The hardware is the physical part, where your device will be used to run the operating system and its applications.&lt;/p&gt;

&lt;p&gt;👢 The bootloader is responsible for basic hardware initialization, through a configuration word, in addition to passing parameters, loading and executing the Linux Kernel.&lt;/p&gt;

&lt;p&gt;🐧 The Kernel is the core of the system, performs device management, task scheduling and abstracts communication with the user. In this case we will use Linux as the target Kernel.&lt;/p&gt;

&lt;p&gt;🐚 RootFS is where the user space is located, all applications (e.g shell, init, ..) and libraries (e.g. libc, zlib, openssl..) are stored there.&lt;/p&gt;

&lt;p&gt;🔧 Toolchain is a set of tools to generate the system binaries, like the compiler, kernel header files, libc version and C headers.&lt;/p&gt;

&lt;p&gt;Although many embedded platforms already offer Linux images ready to be used, such as &lt;a href="https://www.raspberrypi.org/" rel="noopener noreferrer"&gt;Raspberry Pi&lt;/a&gt;, these images usually have a large number of packages already installed, making the product stuffed.&lt;/p&gt;

&lt;p&gt;Buildroot is a tool designed for Linux, with the objective of generating an embedded Linux system through cross-compilation, all in a simplified and fast way. It is capable of generating all the components presented above, in a very friendly way, using a set of Makefiles that can be managed through a graphical interface.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to install Buildroot
&lt;/h4&gt;

&lt;p&gt;Buildroot is not an application, but a repository, so that, we can use its &lt;a href="https://buildroot.org/download.html" rel="noopener noreferrer"&gt;download page&lt;/a&gt; or &lt;a href="https://github.com/buildroot/buildroot" rel="noopener noreferrer"&gt;Github repository&lt;/a&gt; for cloning.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

wget https://buildroot.org/downloads/buildroot-2021.02.tar.gz
&lt;span class="nb"&gt;tar &lt;/span&gt;zxf buildroot-2021.02.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;buildroot-2021.02/


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

&lt;/div&gt;
&lt;h4&gt;
  
  
  How to build the Linux image
&lt;/h4&gt;

&lt;p&gt;First step is configuring Buildroot to use the default configuration for Orange Pi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; You may not use root privileges for building operations. &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make orangepi_zero_defconfig 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Based on Orange Pi Zero default configuration, Buildroot will generate the file &lt;strong&gt;.config&lt;/strong&gt;, used to build our entire system.&lt;/p&gt;

&lt;p&gt;In addition to Orange Pi, Buildroot also supports other platforms. Pre-supported configurations are listed in the &lt;em&gt;configs/&lt;/em&gt; directory, but it is possible to list all of them using the command: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make list-defconfigs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As you can see, Buildroot supports a large range of platforms, including Freescale, Banana Pi, Raspberry Pi and others.&lt;/p&gt;

&lt;p&gt;Before building our image, let's take a look on Buildroot menu using its ncurses interface.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make menuconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now you should have the follow interface:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimgur.com%2FViESXPH.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimgur.com%2FViESXPH.png" alt="Buildroot Menuconfig"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This menu helps us to customize our platform, currently it shows our &lt;strong&gt;.config&lt;/strong&gt; definitions. We can change toolchain, Kernel version, libc flavor, applications, libraries for rootfs, init system, bootloader project, and more.&lt;/p&gt;

&lt;p&gt;We will keep it as it is. If you change anything by mistake, just exit without saving, or run &lt;code&gt;defconfig&lt;/code&gt; command again to regenerate a default configuration file.&lt;/p&gt;

&lt;p&gt;Now let's build our system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; This part takes around &lt;strong&gt;2 hours&lt;/strong&gt; and requires &lt;strong&gt;7 GB&lt;/strong&gt; on your disk and &lt;strong&gt;internet connection&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Buildroot will download all projects from sources, cross-build them to Orange Pi architecture and compile to a minimal image. To build the image, run:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After some ☕ and if everything went correctly, you will have the follow file:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; output/images/sdcard.img 
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 uilian uilian 71M mar 27 17:54 sdcard.img


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

&lt;/div&gt;

&lt;p&gt;Besides other files, here we are only interested on &lt;em&gt;sdcard.img&lt;/em&gt;. That small file, contains all we need to run our platform, bootloader, kernel and rootfs.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to prepare the SD Card
&lt;/h4&gt;

&lt;p&gt;We will need a micro SD card to store our image. Its capacity should be bigger than our image. After connecting the SD card to your computer, we will need to discover where it is mounted:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo fdisk -l
Disk /dev/mmcblk0: 942 MiB, 987758592 bytes, 1929216 sectors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It is mounted under &lt;em&gt;/dev/mmcblk0&lt;/em&gt;, but may vary according your Linux distro.&lt;/p&gt;

&lt;p&gt;To write our Linux system image in the SD card we will run &lt;a href="https://linux.die.net/man/1/dd" rel="noopener noreferrer"&gt;dd&lt;/a&gt; command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dd if=output/images/sdcard.img of=/dev/mmcblk0 bs=4M status=progress conv=fdatasync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Done, we need to insert the micro SD card in our Orange Pi and turn on. The first boot takes more time, led D7 should light up after few seconds.&lt;/p&gt;

&lt;p&gt;If your board doesn't start, make sure your power supply provides 5VDC 2A and your card is well inserted.&lt;/p&gt;

&lt;h4&gt;
  
  
  Serial connection
&lt;/h4&gt;

&lt;p&gt;Now is time to use the UART interface for communication. For that, we will need a USB/UART converter. It's a very cheap board with many variations available.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimgur.com%2F4vLBHJq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimgur.com%2F4vLBHJq.jpg" alt="UART USB Converter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this step, it's important use the correct connection order.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Rx (receptor) from converter must be connected to Tx (transmitter) on the Orange Pi board.&lt;/li&gt;
&lt;li&gt;The Tx (receptor) from converter must be connected to Rx (transmitter) on the Orange Pi board.&lt;/li&gt;
&lt;li&gt;The GND (Ground), must be connected to GND from both sides.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimgur.com%2FzjW7ZR9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimgur.com%2FzjW7ZR9.png" alt="UART pinout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To detect where your converter is connected, after connecting it to your USB, let's take a look on USB devices.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lsusb
Bus 002 Device 012: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC

dmesg | grep FTDI
[49255.816532] ftdi_sio 2-1:1.0: FTDI USB Serial Device converter detected
[49255.816940] usb 2-1: FTDI USB Serial Device converter now attached to ttyUSB0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now we know that the UART converter is linked to &lt;em&gt;/dev/ttyUSB0&lt;/em&gt;. It may vary according your Linux distro.&lt;/p&gt;

&lt;p&gt;For this tutorial, I'll use &lt;a href="https://linux.die.net/man/8/picocom" rel="noopener noreferrer"&gt;picocom&lt;/a&gt;, but you can use what you prefer.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo picocom -b 115200 -f n /dev/ttyUSB0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  Orange Pi Login
&lt;/h4&gt;

&lt;p&gt;After accessing the Orange Pi by its serial connection and turning it on, we will observe its initialization from the beginning.&lt;/p&gt;

&lt;p&gt;The boot process is long, here we will list only few parts to give an idea about its output.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

U-Boot SPL 2020.10 (Mar 27 2021 - 17:53:25 -0300)
DRAM: 256 MiB
Trying to boot from MMC1

U-Boot 2020.10 (Mar 27 2021 - 17:53:25 -0300) Allwinner Technology

CPU:   Allwinner H3 (SUN8I 1680)
Model: Xunlong Orange Pi Zero
DRAM:  256 MiB
MMC:   mmc@1c0f000: 0, mmc@1c10000: 1
...
Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
...
Welcome to Buildroot for the Orange Pi Zero
OrangePi_Zero login:


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

&lt;/div&gt;

&lt;p&gt;The bootloader U-Boot recognizes the board, showing its hardware properties. After that, it starts the Linux kernel, passing a configuration word. Once loaded, Linux looks for the program &lt;em&gt;init&lt;/em&gt;, which should start all user space services, session and so on.&lt;/p&gt;

&lt;p&gt;The default username for login is &lt;strong&gt;root&lt;/strong&gt;. No password is required, but if you want to add one, you may use &lt;a href="https://linux.die.net/man/1/passwd" rel="noopener noreferrer"&gt;passwd&lt;/a&gt; command.&lt;/p&gt;

&lt;h4&gt;
  
  
  Wi-Fi Connection
&lt;/h4&gt;

&lt;p&gt;The Orange Pi Zero offer Wireless hardware support and the basic Buildroot configuration already integrates it. Let's configure our board to work with our Wi-Fi.&lt;/p&gt;

&lt;p&gt;We will use &lt;a href="https://linux.die.net/man/8/wpa_supplicant" rel="noopener noreferrer"&gt;wpa_supplicant&lt;/a&gt; program. First, we need to update its configuration file. On the Orange Pi terminal, let's execute:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vi /etc/wpa_supplicant.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Replace the default &lt;code&gt;network&lt;/code&gt; session by:&lt;/p&gt;

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

network={
    ssid="MY HOME NETWORK NAME"
    psk="MY HOME PASSWORD"
    id_str="home"
}


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

&lt;/div&gt;

&lt;p&gt;Where you should replace &lt;code&gt;SSID&lt;/code&gt; and &lt;code&gt;PSK&lt;/code&gt; according your wireless network. Once configured, you have to start the client.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wpa_supplicant -B -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now you should be authenticated and connected to your Wi-Fi, but no IP address is obtained yet. To request a new address by DHCP, we will use &lt;a href="https://udhcp.busybox.net/README.udhcpc" rel="noopener noreferrer"&gt;udhcpc&lt;/a&gt; command.&lt;/p&gt;

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

udhcpc -i wlan0
udhcpc: started, v1.33.0
udhcpc: sending discover
udhcpc: sending select for 192.168.0.18
udhcpc: lease of 192.168.0.18 obtained, lease time 3600
deleting routers
adding dns 1.1.1.1
adding dns 8.8.8.8


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

&lt;/div&gt;

&lt;p&gt;And we check just running a simple ping test.&lt;/p&gt;


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

&lt;p&gt;ping -I wlan0 8.8.8.8&lt;br&gt;
PING 8.8.8.8 (8.8.8.8): 56 data bytes&lt;br&gt;
64 bytes from 8.8.8.8: seq=0 ttl=113 time=34.668 ms&lt;br&gt;
64 bytes from 8.8.8.8: seq=1 ttl=113 time=26.845 ms&lt;/p&gt;

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

&lt;/div&gt;
&lt;h4&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;Building a Linux system from scratch can be quite a challenge without having the right tools to assist. As we have seen, Buildroot is an important means when it comes to integrating all layers that form a complete image.&lt;/p&gt;

&lt;p&gt;As next challenge, you can customize your image through &lt;code&gt;menuconfig&lt;/code&gt;, adding packages and generating a new image.&lt;/p&gt;

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

</description>
      <category>linux</category>
      <category>embedded</category>
      <category>buildroot</category>
      <category>orangepi</category>
    </item>
  </channel>
</rss>
