<?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: Siswoyo Siswoyo</title>
    <description>The latest articles on DEV Community by Siswoyo Siswoyo (@siswoyo).</description>
    <link>https://dev.to/siswoyo</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%2F3383512%2F8cf08f72-65c5-45dd-a648-557d465fed7b.jpg</url>
      <title>DEV Community: Siswoyo Siswoyo</title>
      <link>https://dev.to/siswoyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/siswoyo"/>
    <language>en</language>
    <item>
      <title>Apache JMeter – Overview and Practical Guide</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Wed, 17 Dec 2025 07:15:33 +0000</pubDate>
      <link>https://dev.to/siswoyo/apache-jmeter-overview-and-practical-guide-4h7l</link>
      <guid>https://dev.to/siswoyo/apache-jmeter-overview-and-practical-guide-4h7l</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbk901s4vn4rnknffdzz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbk901s4vn4rnknffdzz7.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Apache JMeter?
&lt;/h2&gt;

&lt;p&gt;Apache JMeter is an open‑source performance and load testing tool written in Java. It is widely used to test the performance, scalability, and reliability of applications such as web apps, APIs, microservices, databases, and messaging systems. JMeter simulates real user traffic by generating concurrent requests and measuring how the system behaves under different loads.&lt;/p&gt;

&lt;p&gt;Originally designed for web applications, JMeter has evolved into a full‑featured testing platform supporting REST, SOAP, JDBC, FTP, TCP, JMS, Kafka (via plugins), and more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Use JMeter?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open Source &amp;amp; Free&lt;/strong&gt; – No licensing cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross‑Platform&lt;/strong&gt; – Runs on Windows, macOS, and Linux&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highly Extensible&lt;/strong&gt; – Large ecosystem of plugins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable Testing&lt;/strong&gt; – Supports distributed (master–slave) testing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Friendly&lt;/strong&gt; – Can be run in headless (CLI) mode&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Load testing REST and SOAP APIs&lt;/li&gt;
&lt;li&gt;Stress testing e‑commerce applications&lt;/li&gt;
&lt;li&gt;Performance testing microservices&lt;/li&gt;
&lt;li&gt;Database performance testing (JDBC)&lt;/li&gt;
&lt;li&gt;Message queue testing (RabbitMQ, Kafka, JMS)&lt;/li&gt;
&lt;li&gt;Regression performance testing before release&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Core JMeter Concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Test Plan
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Test Plan&lt;/strong&gt; is the top‑level container that defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What to test&lt;/li&gt;
&lt;li&gt;How many users to simulate&lt;/li&gt;
&lt;li&gt;How requests are executed&lt;/li&gt;
&lt;li&gt;What data to collect&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Thread Group (Virtual Users)
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Thread Group&lt;/strong&gt; represents virtual users (threads).&lt;br&gt;
Key parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Number of Threads (Users)&lt;/strong&gt; – Total concurrent users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ramp‑Up Period (seconds)&lt;/strong&gt; – Time to start all users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loop Count&lt;/strong&gt; – How many times each user runs the test&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users: 100&lt;/li&gt;
&lt;li&gt;Ramp‑up: 10 seconds → ~10 users start per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Sampler
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Sampler&lt;/strong&gt; defines the actual request sent to the server.&lt;br&gt;
Common samplers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP Request (REST, Web)&lt;/li&gt;
&lt;li&gt;JDBC Request (Database)&lt;/li&gt;
&lt;li&gt;JMS Publisher / Subscriber&lt;/li&gt;
&lt;li&gt;TCP Sampler&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4. Config Elements
&lt;/h3&gt;

&lt;p&gt;Used to define shared configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP Request Defaults&lt;/li&gt;
&lt;li&gt;HTTP Header Manager&lt;/li&gt;
&lt;li&gt;CSV Data Set Config (for test data)&lt;/li&gt;
&lt;li&gt;User Defined Variables&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  5. Timers
&lt;/h3&gt;

&lt;p&gt;Timers control delays between requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Constant Timer&lt;/li&gt;
&lt;li&gt;Uniform Random Timer&lt;/li&gt;
&lt;li&gt;Gaussian Random Timer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Used to simulate real user behavior.&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Assertions
&lt;/h3&gt;

&lt;p&gt;Assertions validate responses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response code (200, 201, etc.)&lt;/li&gt;
&lt;li&gt;Response body contains expected text&lt;/li&gt;
&lt;li&gt;JSON / XPath assertions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assertions help ensure correctness, not just speed.&lt;/p&gt;
&lt;h3&gt;
  
  
  7. Listeners
&lt;/h3&gt;

&lt;p&gt;Listeners collect and display test results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View Results Tree (debugging)&lt;/li&gt;
&lt;li&gt;Summary Report&lt;/li&gt;
&lt;li&gt;Aggregate Report&lt;/li&gt;
&lt;li&gt;Response Time Graph&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Avoid heavy listeners during large tests.&lt;/p&gt;


&lt;h2&gt;
  
  
  Key Performance Metrics in JMeter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Load Time&lt;/strong&gt; – Total time to complete the request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect Time&lt;/strong&gt; – Time to establish connection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency&lt;/strong&gt; – Time until first byte is received&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throughput&lt;/strong&gt; – Requests per second&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Rate&lt;/strong&gt; – Percentage of failed requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response Size&lt;/strong&gt; – Bytes sent/received&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics help identify bottlenecks.&lt;/p&gt;


&lt;h2&gt;
  
  
  Example: E‑Commerce Load Test Scenario
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User browses product list&lt;/li&gt;
&lt;li&gt;User views product detail&lt;/li&gt;
&lt;li&gt;User adds item to cart&lt;/li&gt;
&lt;li&gt;User checks out&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Thread Group Strategy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 users (baseline)&lt;/li&gt;
&lt;li&gt;50 users (normal load)&lt;/li&gt;
&lt;li&gt;100 users (peak load)&lt;/li&gt;
&lt;li&gt;500 users (stress test)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Assertions&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP 200 on browse&lt;/li&gt;
&lt;li&gt;Cart response contains product ID&lt;/li&gt;
&lt;li&gt;Checkout returns order ID&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Running JMeter Tests
&lt;/h2&gt;
&lt;h3&gt;
  
  
  GUI Mode (Development Only)
&lt;/h3&gt;

&lt;p&gt;Used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating test plans&lt;/li&gt;
&lt;li&gt;Debugging requests&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Non‑GUI Mode (Production / CI)
&lt;/h3&gt;

&lt;p&gt;Recommended for load testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jmeter &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; test.jmx &lt;span class="nt"&gt;-l&lt;/span&gt; result.jtl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lower memory usage&lt;/li&gt;
&lt;li&gt;Faster execution&lt;/li&gt;
&lt;li&gt;CI/CD compatible&lt;/li&gt;
&lt;/ul&gt;

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




&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;CSV files&lt;/strong&gt; for test data (users, tokens)&lt;/li&gt;
&lt;li&gt;Disable heavy listeners for large loads&lt;/li&gt;
&lt;li&gt;Run JMeter in &lt;strong&gt;non‑GUI mode&lt;/strong&gt; for real tests&lt;/li&gt;
&lt;li&gt;Monitor server resources (CPU, memory, DB)&lt;/li&gt;
&lt;li&gt;Start with small load, increase gradually&lt;/li&gt;
&lt;li&gt;Separate functional testing from performance testing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Limitations of JMeter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not a browser (no real JavaScript rendering)&lt;/li&gt;
&lt;li&gt;High load requires tuning or distributed setup&lt;/li&gt;
&lt;li&gt;GUI mode consumes high memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For frontend performance, combine with tools like browser‑based testing.&lt;/p&gt;




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

&lt;p&gt;Apache JMeter is a powerful and flexible tool for performance testing. When used correctly, it helps teams understand system limits, prevent production failures, and improve application reliability. It is especially effective for API‑based systems, microservices, and backend performance validation.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://jmeter.apache.org/" rel="noopener noreferrer"&gt;https://jmeter.apache.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>backenddevelopment</category>
    </item>
    <item>
      <title>Install ISPConfig with Nginx Webserver on Ubuntu 22.04</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Tue, 04 Nov 2025 04:08:03 +0000</pubDate>
      <link>https://dev.to/siswoyo/install-ispconfig-with-nginx-webserver-on-ubuntu-2204-492f</link>
      <guid>https://dev.to/siswoyo/install-ispconfig-with-nginx-webserver-on-ubuntu-2204-492f</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;ISPConfig is a very popular open‑source hosting control panel that lets&lt;br&gt;
you manage websites, email accounts, DNS records, FTP, and more. Using&lt;br&gt;
Nginx as the web server is typically more performant than Apache for&lt;br&gt;
many scenarios (especially static content, reverse‑proxying etc). This&lt;br&gt;
guide shows how to install ISPConfig 3 + Nginx on Ubuntu 22.04, starting&lt;br&gt;
from a fresh system.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: This setup assumes a fresh, clean OS install with&lt;br&gt;
minimal/no prior custom configuration. Doing this on a server with&lt;br&gt;
many existing services/configs may lead to conflicts.&lt;br&gt;
(&lt;a href="https://www.howtoforge.com/ispconfig-autoinstall-debian-ubuntu/" rel="noopener noreferrer"&gt;howtoforge.com&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin: - A server running Ubuntu 22.04 (64‑bit) with internet&lt;br&gt;
access. - A hostname set correctly (see below). - A public IP address,&lt;br&gt;
reachable, DNS configured (so your hostname resolves). - Ports such as&lt;br&gt;
HTTP (80), HTTPS (443), and the ISPConfig panel port (8080) must not be&lt;br&gt;
blocked. - You'll be logged in as root (or using sudo). - The OS should&lt;br&gt;
be essentially "clean" (no major services already installed or&lt;br&gt;
customised that the auto‑installer will clobber).&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Log in to the server
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Step 2: Configure the hostname and hosts file
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Pick a fully qualified domain name (FQDN) for your server such as&lt;br&gt;
&lt;code&gt;server1.example.com&lt;/code&gt;. Do &lt;strong&gt;not&lt;/strong&gt; just use &lt;code&gt;example.com&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit &lt;code&gt;/etc/hosts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/hosts
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;and ensure you have a line like:&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.1.1   server1.example.com   server1
&lt;/code&gt;&lt;/pre&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/hostname&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/hostname
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Put only the short hostname (e.g., &lt;code&gt;server1&lt;/code&gt;).&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Reboot the server:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl reboot
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;After reboot, verify:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;hostname
hostname&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Ensure your DNS provider has an A (and/or AAAA) record for&lt;br&gt;&lt;br&gt;
&lt;code&gt;server1.example.com&lt;/code&gt; pointing to your server's public IP.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 3: Update the system
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Run the auto‑installer for ISPConfig with Nginx
&lt;/h2&gt;

&lt;p&gt;Now is the key part: installing ISPConfig and choosing Nginx as the web&lt;br&gt;
server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-O&lt;/span&gt; - https://get.ispconfig.org | sh &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--use-nginx&lt;/span&gt; &lt;span class="nt"&gt;--use-ftp-ports&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;40110-40210 &lt;span class="nt"&gt;--unattended-upgrades&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What the arguments mean
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;--use-nginx&lt;/code&gt; → use Nginx instead of Apache.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;--use-ftp-ports=40110-40210&lt;/code&gt; → set passive FTP port range for
Pure‑FTPd.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;--unattended-upgrades&lt;/code&gt; → enables automatic updates/upgrades.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  After installation completes
&lt;/h3&gt;

&lt;p&gt;You'll see the generated passwords, e.g.:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[INFO] Your ISPConfig admin password is: &amp;lt;password&amp;gt;
[INFO] Your MySQL root password is: &amp;lt;password&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ensure you record these.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Setting up the firewall
&lt;/h2&gt;

&lt;p&gt;Allow necessary ports through UFW or within ISPConfig UI → System →&lt;br&gt;
Firewall.&lt;/p&gt;

&lt;p&gt;TCP ports:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20,21,22,25,80,443,40110:40210,110,143,465,587,993,995,53,8080,8081
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;UDP:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;53
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Step 6: Finalizing
&lt;/h2&gt;

&lt;p&gt;Log into ISPConfig panel:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://server1.example.com:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Login user: &lt;code&gt;admin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgh1ets4rwrfmp2xv2bj4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgh1ets4rwrfmp2xv2bj4.png" alt=" " width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 7: Adding Your Website
&lt;/h2&gt;

&lt;p&gt;Once you are inside the ISPConfig panel, you can start adding new&lt;br&gt;
websites under &lt;strong&gt;Sites → Add new site&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before you add a website: - Ensure your domain name (e.g.,&lt;br&gt;
&lt;code&gt;example.com&lt;/code&gt;) is &lt;strong&gt;already pointing&lt;/strong&gt; to your server's public IP&lt;br&gt;
address. - You can check your DNS propagation and record setup using&lt;br&gt;
&lt;a href="https://dnschecker.org/" rel="noopener noreferrer"&gt;https://dnschecker.org/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If your domain is not yet propagated or pointing to the correct IP, the&lt;br&gt;
site might not load correctly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Steps to add a site:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Go to &lt;strong&gt;Sites → Add new website&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Enter your domain name (e.g., &lt;code&gt;example.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Choose the IP address of your server (you can leave it as * if you want ISPConfig to use all available IPs).&lt;/li&gt;
&lt;li&gt; Set PHP version, SSL (Let's Encrypt), and other options.&lt;/li&gt;
&lt;li&gt; Save your configuration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After saving, ISPConfig will create the Nginx virtual host configuration&lt;br&gt;
automatically.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 8: Advanced options
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;--channel=&amp;lt;stable|dev&amp;gt;&lt;/code&gt; → choose branch&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;--lang=en|de&lt;/code&gt; → choose language&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;--use-php=7.4,8.1&lt;/code&gt; → install specific PHP versions&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;--no-mail&lt;/code&gt; → skip mail server&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;--no-dns&lt;/code&gt; → skip DNS server&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;--debug&lt;/code&gt; → detailed log in
&lt;code&gt;/tmp/ispconfig-ai/var/log/ispconfig.log&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example for minimal install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-O&lt;/span&gt; - https://get.ispconfig.org | sh &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--use-nginx&lt;/span&gt; &lt;span class="nt"&gt;--no-dns&lt;/span&gt; &lt;span class="nt"&gt;--no-mail&lt;/span&gt; &lt;span class="nt"&gt;--use-ftp-ports&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;40110-40210 &lt;span class="nt"&gt;--unattended-upgrades&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 9: Troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Rerun with &lt;code&gt;--debug&lt;/code&gt; if installation fails.&lt;/li&gt;
&lt;li&gt;  Check &lt;code&gt;/tmp/ispconfig-ai/var/log/ispconfig.log&lt;/code&gt; for details.&lt;/li&gt;
&lt;li&gt;  Ensure fresh OS install to avoid config conflicts.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;You can now manage websites, email, DNS, databases, and FTP through&lt;br&gt;
ISPConfig 3 with Nginx on Ubuntu 22.04.&lt;/p&gt;

&lt;p&gt;Before adding sites, make sure your domain and public IP setup are&lt;br&gt;
verified using &lt;a href="https://dnschecker.org/" rel="noopener noreferrer"&gt;DNSChecker.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Reference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ispconfig.org/blog/ispconfig-installation-on-ubuntu-22-04/" rel="noopener noreferrer"&gt;https://www.ispconfig.org/blog/ispconfig-installation-on-ubuntu-22-04/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.howtoforge.com/ispconfig-autoinstall-debian-ubuntu/" rel="noopener noreferrer"&gt;https://www.howtoforge.com/ispconfig-autoinstall-debian-ubuntu/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>nginx</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>The `tree` Command in Ubuntu</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Fri, 10 Oct 2025 08:30:57 +0000</pubDate>
      <link>https://dev.to/siswoyo/the-tree-command-in-ubuntu-42g8</link>
      <guid>https://dev.to/siswoyo/the-tree-command-in-ubuntu-42g8</guid>
      <description>&lt;h2&gt;
  
  
  📌 Introduction
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;tree&lt;/code&gt; command in Ubuntu is a powerful utility that displays the contents of directories in a &lt;strong&gt;tree-like structure&lt;/strong&gt;. Instead of listing files and directories in a flat list (like &lt;code&gt;ls&lt;/code&gt; does), it visually represents the hierarchy of directories, making it easier to understand the structure of a file system.&lt;/p&gt;

&lt;p&gt;This is especially useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Viewing project structures
&lt;/li&gt;
&lt;li&gt;Exploring configuration files
&lt;/li&gt;
&lt;li&gt;Understanding nested directories at a glance
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📥 Installation
&lt;/h2&gt;

&lt;p&gt;By default, &lt;code&gt;tree&lt;/code&gt; may not be installed on Ubuntu. You can install it using:&lt;br&gt;
&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;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;tree &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To confirm installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tree &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📂 Basic Usage
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Display current directory structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Show full path of files and directories&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   tree &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Limit depth of directory tree&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   tree &lt;span class="nt"&gt;-L&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(This shows only two levels deep.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Show hidden files (dotfiles)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   tree &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Print size of files&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   tree &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 Common Options
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show all files including hidden ones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List directories only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-L n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Limit depth of directory tree to &lt;code&gt;n&lt;/code&gt; levels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print full path for each file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show file size in bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-h&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show file size in human-readable format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--du&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show cumulative directory sizes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List only files matching a pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-I&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exclude files matching a pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔍 Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Display only directories up to 3 levels&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   tree &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Show file sizes in human-readable format&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   tree &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Exclude specific directories (e.g., &lt;code&gt;.git&lt;/code&gt;)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   tree &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="s2"&gt;".git"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Display project structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   tree &lt;span class="nt"&gt;-L&lt;/span&gt; 2 &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="s2"&gt;"node_modules"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📑 Example Output
&lt;/h2&gt;

&lt;p&gt;If you run &lt;code&gt;tree -L 2&lt;/code&gt; inside a project folder, you may get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── README.md
├── package.json
├── public
│   ├── index.html
│   └── favicon.ico
└── src
    ├── App.js
    ├── index.js
    └── components
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;The &lt;code&gt;tree&lt;/code&gt; command in Ubuntu is an essential tool for visualizing directory structures. With its various options, it allows developers, system administrators, and everyday users to quickly understand and navigate complex file systems.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://manpages.ubuntu.com/manpages/jammy/man1/tree.1.html" rel="noopener noreferrer"&gt;https://manpages.ubuntu.com/manpages/jammy/man1/tree.1.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Control Your Android on PC with Vysor</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Wed, 10 Sep 2025 05:03:50 +0000</pubDate>
      <link>https://dev.to/siswoyo/control-your-android-on-pc-with-vysor-h07</link>
      <guid>https://dev.to/siswoyo/control-your-android-on-pc-with-vysor-h07</guid>
      <description>&lt;p&gt;Managing your Android device directly from your PC can greatly improve productivity, especially if you’re multitasking between your phone and computer. &lt;strong&gt;Vysor&lt;/strong&gt; is a powerful tool that lets you mirror and control your Android device from your Windows, macOS, Linux, or even Chrome browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Vysor?
&lt;/h2&gt;

&lt;p&gt;Vysor is a screen mirroring application developed by Koushik Dutta. It allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View your Android screen on your PC.&lt;/li&gt;
&lt;li&gt;Control your phone using your keyboard and mouse.&lt;/li&gt;
&lt;li&gt;Take screenshots and record your screen.&lt;/li&gt;
&lt;li&gt;Drag and drop files between your PC and Android device (Pro feature).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s especially useful for developers, customer support agents, or anyone who wants to interact with their phone without constantly switching devices.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple Setup&lt;/strong&gt; – Install the app on both your PC and Android device and connect via USB or Wi-Fi.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform Support&lt;/strong&gt; – Works on Windows, macOS, Linux, and even Chrome.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard &amp;amp; Mouse Control&lt;/strong&gt; – Type messages, play games, and navigate apps seamlessly.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Sharing&lt;/strong&gt; – Drag and drop files (Pro version).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen Recording&lt;/strong&gt; – Record your Android screen directly from your PC.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Use Vysor
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install Vysor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Download and install Vysor on your PC from the official website: &lt;a href="https://www.vysor.io" rel="noopener noreferrer"&gt;https://www.vysor.io&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;Install the &lt;strong&gt;Vysor app&lt;/strong&gt; from the Google Play Store on your Android device.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  2. Install ADB Drivers (Windows Users)
&lt;/h3&gt;

&lt;p&gt;To let your PC communicate with your Android phone, you need &lt;strong&gt;ADB (Android Debug Bridge) drivers&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download the &lt;strong&gt;Universal ADB Driver&lt;/strong&gt;: &lt;a href="https://adb.clockworkmod.com" rel="noopener noreferrer"&gt;https://adb.clockworkmod.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Run the installer and follow the on-screen instructions.
&lt;/li&gt;
&lt;li&gt;Once installed, reconnect your Android device via USB.
&lt;/li&gt;
&lt;li&gt;Your PC should now recognize the phone when using Vysor.
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;💡 &lt;strong&gt;Note for Mac/Linux users:&lt;/strong&gt; You don’t need to install extra drivers; ADB works out of the box.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Enable USB Debugging
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;On your Android device, go to &lt;strong&gt;Settings &amp;gt; About Phone &amp;gt; Tap “Build Number” 7 times&lt;/strong&gt; to enable Developer Options.
&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; Developer Options &amp;gt; Enable USB Debugging&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Confirm the USB Debugging prompt when connecting your device to the PC.
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  4. Connect Your Device
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Plug your Android device into your PC using a USB cable (Wi-Fi connection available in the Pro version).
&lt;/li&gt;
&lt;li&gt;Open Vysor on your PC, and your device should appear in the list.
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;View&lt;/strong&gt; to start mirroring your Android screen.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PC&lt;/p&gt;

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

&lt;p&gt;Android&lt;/p&gt;

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

&lt;h3&gt;
  
  
  5. Control Your Device
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use your keyboard to type messages.
&lt;/li&gt;
&lt;li&gt;Navigate apps with your mouse.
&lt;/li&gt;
&lt;li&gt;Enjoy seamless control without constantly switching between devices.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free vs Pro
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free version&lt;/strong&gt;: Includes screen mirroring and basic controls with ads.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro version&lt;/strong&gt;: Removes ads, adds Wi-Fi connectivity, full-screen mode, drag-and-drop, and HD quality.
&lt;/li&gt;
&lt;li&gt;You can check the latest pricing and subscription options here: &lt;a href="https://www.vysor.io/#pricing" rel="noopener noreferrer"&gt;Vysor Pricing&lt;/a&gt; – around &lt;strong&gt;$2.50/mo&lt;/strong&gt;, &lt;strong&gt;$10/yr&lt;/strong&gt;, or &lt;strong&gt;$40 lifetime&lt;/strong&gt; as listed on their site.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benefits of Using Vysor
&lt;/h2&gt;

&lt;p&gt;✅ Boosts productivity for developers and office users.&lt;br&gt;
✅ Easy for tech support to guide customers remotely.&lt;br&gt;
✅ Great for presentations and demos.&lt;br&gt;
✅ Makes mobile gaming easier on a larger screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.vysor.io" rel="noopener noreferrer"&gt;Vysor Official Website&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/koush/vysor.io" rel="noopener noreferrer"&gt;Vysor GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;👉 With &lt;strong&gt;Vysor + ADB drivers&lt;/strong&gt;, you can fully control your Android from your PC with ease. Perfect for work, support, or entertainment.&lt;/p&gt;

</description>
      <category>android</category>
      <category>developers</category>
    </item>
    <item>
      <title>Homelab: A Complete Overview</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Tue, 02 Sep 2025 16:33:01 +0000</pubDate>
      <link>https://dev.to/siswoyo/homelab-a-complete-overview-4098</link>
      <guid>https://dev.to/siswoyo/homelab-a-complete-overview-4098</guid>
      <description>&lt;h2&gt;
  
  
  📌 What is a Homelab?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;homelab&lt;/strong&gt; is a personal environment where you experiment with technology, servers, and networking outside of production systems. It’s commonly used by IT enthusiasts, developers, and system administrators to &lt;strong&gt;learn, test, and self-host services&lt;/strong&gt; at home.  &lt;/p&gt;

&lt;p&gt;Homelabs can range from a simple single-PC setup to a rack of enterprise-grade servers.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Why Build a Homelab?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Learning &amp;amp; Experimentation&lt;/strong&gt;
Practice new technologies like Docker, Kubernetes, virtualization, and networking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill Development&lt;/strong&gt;
Gain hands-on experience for IT certifications and real-world problem-solving.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Hosting&lt;/strong&gt;
Run your own cloud services such as Nextcloud, media servers, VPN, or password managers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation Practice&lt;/strong&gt;
Experiment with tools like Ansible, Terraform, and CI/CD pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Savings&lt;/strong&gt;
Repurpose old hardware instead of relying on expensive cloud providers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Common Homelab Components
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Hardware
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Old desktop PCs or laptops&lt;/li&gt;
&lt;li&gt;Mini PCs (Intel NUC, Raspberry Pi)&lt;/li&gt;
&lt;li&gt;Used enterprise servers (Dell PowerEdge, HP ProLiant)&lt;/li&gt;
&lt;li&gt;Network equipment (routers, switches, firewalls)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Virtualization &amp;amp; Containers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proxmox&lt;/strong&gt; – open-source virtualization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VMware ESXi&lt;/strong&gt; – enterprise-grade hypervisor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; – container platform for apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes / K3s&lt;/strong&gt; – container orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Networking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;VLANs, VPNs, firewalls&lt;/li&gt;
&lt;li&gt;Pi-hole for DNS-level ad blocking&lt;/li&gt;
&lt;li&gt;pfSense or OPNsense for routing &amp;amp; security&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Services to Run
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Media servers&lt;/strong&gt;: Plex, Jellyfin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File storage&lt;/strong&gt;: Nextcloud, Syncthing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps tools&lt;/strong&gt;: GitLab, Jenkins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Grafana, Prometheus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home automation&lt;/strong&gt;: Home Assistant&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Example Homelab Setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt;: Old Dell PowerEdge with 32GB RAM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtualization&lt;/strong&gt;: Proxmox for managing VMs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containers&lt;/strong&gt;: Docker running Nextcloud, Plex, Grafana&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network&lt;/strong&gt;: pfSense firewall + Pi-hole DNS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: RAID-configured NAS for backups&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Tips for Building Your Homelab
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start small&lt;/strong&gt; – repurpose an old laptop or Raspberry Pi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document everything&lt;/strong&gt; – keep notes on configs and setups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use automation&lt;/strong&gt; – learn Ansible/Terraform to manage infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup frequently&lt;/strong&gt; – test disaster recovery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it secure&lt;/strong&gt; – use strong passwords, VPN, and firewalls.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📚 Resources to Get Started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/homelab/" rel="noopener noreferrer"&gt;r/homelab on Reddit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pve.proxmox.com/wiki/Main_Page" rel="noopener noreferrer"&gt;Proxmox Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/awesome-selfhosted/awesome-selfhosted" rel="noopener noreferrer"&gt;Self-Hosted on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linuxserver.io/" rel="noopener noreferrer"&gt;Linux Server IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ A homelab is not just a playground—it’s a &lt;strong&gt;personal cloud&lt;/strong&gt;, &lt;strong&gt;learning lab&lt;/strong&gt;, and &lt;strong&gt;automation hub&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>developers</category>
      <category>ansible</category>
      <category>jenkins</category>
    </item>
    <item>
      <title>Transaction Numbers in a System</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Mon, 01 Sep 2025 18:11:43 +0000</pubDate>
      <link>https://dev.to/siswoyo/transaction-numbers-in-a-system-20n8</link>
      <guid>https://dev.to/siswoyo/transaction-numbers-in-a-system-20n8</guid>
      <description>&lt;p&gt;When designing a system that handles financial or operational transactions (e.g., orders, invoices, payments, shipments), one of the most important considerations is how &lt;strong&gt;transaction numbers&lt;/strong&gt; are generated and managed.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Transaction Numbers Are Important
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Uniqueness&lt;/strong&gt; → Every transaction must be identifiable without confusion.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceability&lt;/strong&gt; → Makes it easy to track and audit transactions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt; → When multiple services or systems are involved, transaction numbers must remain consistent.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Reference&lt;/strong&gt; → Customers and staff often need a simple reference number for communication.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Approaches to Transaction Numbers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Auto-Increment Serial (Sequential Numbers)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;TRX-000001&lt;/code&gt;, &lt;code&gt;TRX-000002&lt;/code&gt;, &lt;code&gt;TRX-000003&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Simple and human-friendly.
&lt;/li&gt;
&lt;li&gt;Easy to track the count of transactions.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Cons&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Hard to merge across multiple systems (risk of duplicate numbers).
&lt;/li&gt;
&lt;li&gt;Predictable numbers can expose business volume.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. UUID (Universally Unique Identifier)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;d290f1ee-6c54-4b01-90e6-d701748f0851&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Guaranteed uniqueness across systems and services.
&lt;/li&gt;
&lt;li&gt;No collision issues when merging data.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Cons&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Not user-friendly.
&lt;/li&gt;
&lt;li&gt;Longer to store and index in databases.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Hybrid Format (Prefix + Date + Sequence / UUID)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;INV-20250819-0012&lt;/code&gt; or &lt;code&gt;PAY-2025-08-19-XYZ123&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Human-readable with context (date, type).
&lt;/li&gt;
&lt;li&gt;Sequence helps ordering within a day.
&lt;/li&gt;
&lt;li&gt;Can still incorporate randomness or UUID for uniqueness.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Cons&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Slightly more complex to implement.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;internal system identifiers&lt;/strong&gt;: use &lt;strong&gt;UUIDs&lt;/strong&gt; to ensure uniqueness, especially in distributed or microservice architectures.
&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;user-facing transaction numbers&lt;/strong&gt;: generate a &lt;strong&gt;readable sequence with prefixes and dates&lt;/strong&gt; (e.g., &lt;code&gt;ORD-20250819-0456&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Store both values:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary Key / Internal ID&lt;/strong&gt; → UUID
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public Transaction Number&lt;/strong&gt; → Sequential or Hybrid format
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example: Dual Identifier Approach
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Example Value&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;transaction_id&lt;/code&gt; (UUID)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a9c3b5f4-2e4b-4ef9-a2af...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Internal system reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;transaction_no&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ORD-20250819-0456&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User-facing, easy to reference&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This way, the system remains &lt;strong&gt;scalable, merge-friendly, and user-friendly&lt;/strong&gt;.  &lt;/p&gt;

&lt;h2&gt;
  
  
  SQL Schema Example
&lt;/h2&gt;

&lt;p&gt;Below is a PostgreSQL example showing how to implement this approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;transaction_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;gen_random_uuid&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;-- Internal unique ID&lt;/span&gt;
    &lt;span class="n"&gt;transaction_no&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;-- Public transaction number&lt;/span&gt;
    &lt;span class="n"&gt;transaction_type&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                     &lt;span class="c1"&gt;-- e.g. ORDER, PAYMENT, INVOICE&lt;/span&gt;
    &lt;span class="n"&gt;transaction_date&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'PENDING'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Example: Insert with a generated transaction number&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transaction_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ORD-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;'YYYYMMDD'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LPAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'transaction_seq'&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="s1"&gt;'ORDER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'550e8400-e29b-41d4-a716-446655440000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;150000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Sequence for daily increment&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;SEQUENCE&lt;/span&gt; &lt;span class="n"&gt;transaction_seq&lt;/span&gt; &lt;span class="k"&gt;START&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Example: Insert with a generated transaction number&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transaction_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ORD-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;'YYYYMMDD'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LPAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'transaction_seq'&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="s1"&gt;'ORDER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'550e8400-e29b-41d4-a716-446655440000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;150000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Relationships with Other Tables
&lt;/h2&gt;

&lt;p&gt;When designing related tables, always use transaction_id (UUID) as the foreign key.&lt;br&gt;
Each related table should also have its own unique reference number (payment_no, shipment_no).&lt;/p&gt;

&lt;h2&gt;
  
  
  Payments Table
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;payments&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;payment_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;gen_random_uuid&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;-- Internal unique ID&lt;/span&gt;
    &lt;span class="n"&gt;payment_no&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;-- Public payment number&lt;/span&gt;
    &lt;span class="n"&gt;transaction_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payment_date&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;payment_method&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Sequence for payments&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;SEQUENCE&lt;/span&gt; &lt;span class="n"&gt;payment_seq&lt;/span&gt; &lt;span class="k"&gt;START&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Example insert&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;payments&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payment_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'PAY-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;'YYYYMMDD'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LPAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'payment_seq'&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="s1"&gt;'a9c3b5f4-2e4b-4ef9-a2af-123456789abc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'CREDIT_CARD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;150000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Shipments Table
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;shipments&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;shipment_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;gen_random_uuid&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;-- Internal unique ID&lt;/span&gt;
    &lt;span class="n"&gt;shipment_no&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;-- Public shipment number&lt;/span&gt;
    &lt;span class="n"&gt;transaction_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;courier&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tracking_no&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;shipped_date&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Sequence for shipments&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;SEQUENCE&lt;/span&gt; &lt;span class="n"&gt;shipment_seq&lt;/span&gt; &lt;span class="k"&gt;START&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Example insert&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;shipments&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shipment_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;courier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tracking_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shipped_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SHP-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TO_CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;'YYYYMMDD'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LPAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'shipment_seq'&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="s1"&gt;'a9c3b5f4-2e4b-4ef9-a2af-123456789abc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'DHL'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'DHL123456789'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;NOW&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;
  
  
  Why Use UUID for Relations but Public Numbers for Reference?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;UUID (transaction_id, payment_id, shipment_id) → Used for database relations, stable and permanent.&lt;/li&gt;
&lt;li&gt;Public numbers (transaction_no, payment_no, shipment_no) → Used for communication with users, human-friendly, and can include business context (prefix, date, sequence).&lt;/li&gt;
&lt;li&gt;This ensures data integrity inside the system while providing clear references outside the system.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>systemdesign</category>
      <category>systems</category>
      <category>sql</category>
    </item>
    <item>
      <title>How to Create a Bootable USB Windows 10 Using Rufus</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Wed, 27 Aug 2025 16:44:36 +0000</pubDate>
      <link>https://dev.to/siswoyo/how-to-create-a-bootable-usb-windows-10-using-rufus-1876</link>
      <guid>https://dev.to/siswoyo/how-to-create-a-bootable-usb-windows-10-using-rufus-1876</guid>
      <description>&lt;p&gt;Creating a bootable USB drive is one of the easiest and most reliable ways to install or reinstall Windows 10. With the help of &lt;strong&gt;Rufus&lt;/strong&gt;, a lightweight and free utility, you can prepare a USB stick to install Windows quickly.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ What You Need
&lt;/h2&gt;

&lt;p&gt;Before starting, make sure you have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A USB flash drive (at least &lt;strong&gt;8 GB&lt;/strong&gt; in size).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Windows 10 ISO file&lt;/strong&gt; (you can download it from the &lt;a href="https://www.microsoft.com/software-download/windows10" rel="noopener noreferrer"&gt;Microsoft website&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The latest version of &lt;strong&gt;Rufus&lt;/strong&gt; (&lt;a href="https://rufus.ie/" rel="noopener noreferrer"&gt;download here&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Steps to Create Bootable USB with Rufus
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Download and Install Rufus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Visit the &lt;a href="https://rufus.ie/" rel="noopener noreferrer"&gt;Rufus official website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Download the latest version (portable, no installation required).&lt;/li&gt;
&lt;li&gt;Open the program by double-clicking &lt;strong&gt;Rufus.exe&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Insert Your USB Drive
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Plug your USB flash drive into your computer.&lt;/li&gt;
&lt;li&gt;Rufus will automatically detect it under &lt;strong&gt;Device&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Note:&lt;/strong&gt; All data on the USB will be erased. Backup your important files first.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Select Windows 10 ISO File
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Under &lt;strong&gt;Boot selection&lt;/strong&gt;, click &lt;strong&gt;SELECT&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Browse and choose the Windows 10 ISO file you downloaded.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Configure Partition Scheme
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Partition scheme:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Choose &lt;strong&gt;MBR&lt;/strong&gt; if installing on BIOS/Legacy systems.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;GPT&lt;/strong&gt; if installing on UEFI systems.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;File system:&lt;/strong&gt; Leave as &lt;strong&gt;NTFS&lt;/strong&gt; (default).&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Cluster size:&lt;/strong&gt; Leave as default.&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Start Creating Bootable USB
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Once settings are ready, click &lt;strong&gt;START&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Rufus may prompt to download additional files—accept if needed.&lt;/li&gt;
&lt;li&gt;A warning will appear that all data on the USB will be destroyed. Click &lt;strong&gt;OK&lt;/strong&gt; to proceed.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Wait for Completion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rufus will format the USB and copy all Windows installation files.&lt;/li&gt;
&lt;li&gt;The process may take several minutes depending on USB speed.&lt;/li&gt;
&lt;li&gt;When the status bar turns &lt;strong&gt;green&lt;/strong&gt; and says &lt;em&gt;READY&lt;/em&gt;, your bootable USB is done.&lt;/li&gt;
&lt;/ul&gt;

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




&lt;h2&gt;
  
  
  🚀 How to Use the Bootable USB
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Insert the USB drive into the target computer.&lt;/li&gt;
&lt;li&gt;Restart the computer and enter the &lt;strong&gt;boot menu&lt;/strong&gt; (usually by pressing &lt;strong&gt;F2, F12, ESC, or DEL&lt;/strong&gt;, depending on manufacturer).&lt;/li&gt;
&lt;li&gt;Select your USB drive as the boot device.&lt;/li&gt;
&lt;li&gt;Follow the on-screen instructions to install Windows 10.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Using Rufus makes creating a bootable USB for Windows 10 simple and fast. With just a few steps—selecting your USB, choosing the ISO, and starting the process—you’ll be ready to install or repair Windows 10 on any computer.&lt;/p&gt;

</description>
      <category>microsoft</category>
    </item>
    <item>
      <title>🎂 Happy Belated Birthday, Linux! 🐧💻</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Tue, 26 Aug 2025 13:20:30 +0000</pubDate>
      <link>https://dev.to/siswoyo/happy-belated-birthday-linux-17o0</link>
      <guid>https://dev.to/siswoyo/happy-belated-birthday-linux-17o0</guid>
      <description>&lt;p&gt;On &lt;strong&gt;25 August 1991&lt;/strong&gt;, a young Finnish computer science student named &lt;strong&gt;Linus Torvalds&lt;/strong&gt; posted a short message on the MINIX newsgroup. In it, he introduced his new project: a free operating system kernel. At the time, he called it &lt;em&gt;“just a hobby, won’t be big and professional like GNU.”&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;That “hobby” turned into &lt;strong&gt;Linux&lt;/strong&gt; — and the world of technology has never been the same.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🌱 The Beginning
&lt;/h2&gt;

&lt;p&gt;Torvalds’ announcement on &lt;strong&gt;25 August 1991&lt;/strong&gt; sparked something special. By releasing his source code and inviting collaboration, he planted the seed for a project that would grow into a global movement. Developers everywhere joined in, contributing ideas, fixes, and improvements.  &lt;/p&gt;

&lt;p&gt;This &lt;strong&gt;open and collaborative model&lt;/strong&gt; became the DNA of Linux, and it remains its strength to this day.  &lt;/p&gt;




&lt;h2&gt;
  
  
  📜 Key Milestones in Linux History
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;25 Aug 1991&lt;/strong&gt; – Linus Torvalds announces Linux to the world.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1992&lt;/strong&gt; – Linux adopts the GNU General Public License (GPL), ensuring it remains free and open-source.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1996&lt;/strong&gt; – &lt;strong&gt;Tux the Penguin&lt;/strong&gt;, designed by Larry Ewing, becomes the official Linux mascot.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2000s&lt;/strong&gt; – Linux becomes the backbone of the internet, powering the majority of servers.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2008&lt;/strong&gt; – Android, built on the Linux kernel, begins transforming the mobile industry.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Today&lt;/strong&gt; – Linux powers &lt;strong&gt;96% of the top 1 million servers&lt;/strong&gt;, &lt;strong&gt;all of the world’s top 500 supercomputers&lt;/strong&gt;, and is at the heart of cloud platforms, containers, and IoT.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌍 The Impact of Linux
&lt;/h2&gt;

&lt;p&gt;Linux is more than an operating system — it’s a &lt;strong&gt;philosophy and a community&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Freedom&lt;/strong&gt; – Anyone can study, modify, and share it.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration&lt;/strong&gt; – Thousands of contributors worldwide continue to evolve it.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Innovation&lt;/strong&gt; – From smartphones to space missions, Linux makes the impossible possible.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without Linux, the internet, mobile computing, AI research, and even cloud platforms would look completely different.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 Celebrating Linux Today
&lt;/h2&gt;

&lt;p&gt;Though we’re a little late to say it:  &lt;/p&gt;

&lt;p&gt;🎉 &lt;strong&gt;Happy Belated Birthday, Linux!&lt;/strong&gt; 🐧  &lt;/p&gt;

&lt;p&gt;More than three decades later, Linux remains a symbol of openness, stability, and progress. From students learning their first command line to engineers deploying global infrastructure — Linux belongs to everyone.  &lt;/p&gt;

&lt;p&gt;Here’s to the next chapter of innovation and community-driven growth. 💻✨  &lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>Choosing `UUID` for Unique IDs in a Multi-System Environment</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Sat, 23 Aug 2025 11:42:41 +0000</pubDate>
      <link>https://dev.to/siswoyo/choosing-uuid-for-unique-ids-in-a-multi-system-environment-15e1</link>
      <guid>https://dev.to/siswoyo/choosing-uuid-for-unique-ids-in-a-multi-system-environment-15e1</guid>
      <description>&lt;p&gt;When designing a database schema, the choice of unique identifier is critical for &lt;strong&gt;scalability&lt;/strong&gt;, &lt;strong&gt;data integration&lt;/strong&gt;, and &lt;strong&gt;future-proofing&lt;/strong&gt;. While databases traditionally use &lt;code&gt;SERIAL&lt;/code&gt; (auto-increment integers), in modern distributed and service-oriented architectures, &lt;strong&gt;&lt;code&gt;UUID&lt;/code&gt; (Universally Unique Identifier)&lt;/strong&gt; is often the better choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Not &lt;code&gt;SERIAL&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;SERIAL&lt;/code&gt; or &lt;code&gt;BIGSERIAL&lt;/code&gt; column generates sequential IDs (&lt;code&gt;1, 2, 3...&lt;/code&gt;). This works fine for a single, isolated database but creates challenges when scaling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ID collisions during merges&lt;/strong&gt;: Two different systems may both have a record with &lt;code&gt;id = 100&lt;/code&gt;. Merging them becomes complex.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable IDs&lt;/strong&gt;: The sequence can reveal the number of records (e.g., knowing you have 50,000 customers).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharding and replication issues&lt;/strong&gt;: Multiple services writing to their own databases may generate overlapping IDs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Use &lt;code&gt;UUID&lt;/code&gt; Everywhere?
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;UUID&lt;/code&gt; is a 128-bit identifier that is &lt;strong&gt;globally unique&lt;/strong&gt;. Using UUIDs for both &lt;strong&gt;master tables&lt;/strong&gt; (e.g., &lt;code&gt;customers&lt;/code&gt;, &lt;code&gt;products&lt;/code&gt;) and &lt;strong&gt;transaction tables&lt;/strong&gt; (e.g., &lt;code&gt;orders&lt;/code&gt;, &lt;code&gt;invoices&lt;/code&gt;) brings key benefits:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Advantages
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seamless data merging&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Whether merging customers or orders across services, IDs will never clash. This simplifies integration projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supports distributed systems&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Microservices, event-driven architectures, and multi-database systems can generate IDs independently without coordination.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Future-proofing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Even if today you only have one database, tomorrow you might need to replicate, shard, or consolidate with another system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
UUIDs are non-sequential, making it harder for outsiders to guess the number of records or enumerate IDs.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ⚠️ Trade-offs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Larger storage size (16 bytes vs. 4 bytes for integers).&lt;/li&gt;
&lt;li&gt;Slightly slower indexing and joins.&lt;/li&gt;
&lt;li&gt;Harder to read/debug manually (though often hidden behind APIs).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example Schema
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Master Table: Customers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="nv"&gt;"uuid-ossp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;uuid_generate_v4&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Transaction Table: Orders
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;uuid_generate_v4&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;order_date&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Decision
&lt;/h2&gt;

&lt;p&gt;If your system &lt;strong&gt;might merge data across multiple databases, services, or environments,&lt;/strong&gt;&lt;br&gt;
then the &lt;strong&gt;consistent choice is to use UUID for all primary keys&lt;/strong&gt; — both &lt;strong&gt;master data&lt;/strong&gt; and &lt;strong&gt;transactional data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This avoids conflicts, simplifies future integrations, and aligns with best practices for distributed systems.&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>microservices</category>
      <category>eventdriven</category>
    </item>
    <item>
      <title>10 DEV.to Features Every Member Should Know</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Tue, 19 Aug 2025 20:16:05 +0000</pubDate>
      <link>https://dev.to/siswoyo/10-devto-features-every-member-should-know-l48</link>
      <guid>https://dev.to/siswoyo/10-devto-features-every-member-should-know-l48</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to"&gt;DEV.to&lt;/a&gt; is more than just a blogging platform — it’s a thriving community for developers to share knowledge, learn, and grow. Whether you’re new to DEV or have been around for a while, here are &lt;strong&gt;10 essential features&lt;/strong&gt; every member should know about:  &lt;/p&gt;




&lt;h2&gt;
  
  
  1. 📝 Write &amp;amp; Publish Articles
&lt;/h2&gt;

&lt;p&gt;The core of DEV is writing. You can share tutorials, case studies, opinions, or personal stories. DEV supports &lt;strong&gt;Markdown&lt;/strong&gt;, making it simple to format your posts with code snippets, images, and embeds.  &lt;/p&gt;




&lt;h2&gt;
  
  
  2. 🏷️ Use Tags Effectively
&lt;/h2&gt;

&lt;p&gt;Tags are powerful for discoverability. When writing, you can add up to &lt;strong&gt;4 tags&lt;/strong&gt; that describe your article. Popular tags like  &lt;code&gt;#javascript&lt;/code&gt;, &lt;code&gt;#python&lt;/code&gt;, &lt;code&gt;#webdev&lt;/code&gt;, and &lt;code&gt;#programming&lt;/code&gt; can help reach the right audience.  &lt;/p&gt;




&lt;h2&gt;
  
  
  3. 💬 Engage Through Comments
&lt;/h2&gt;

&lt;p&gt;DEV isn’t just about writing — it’s about &lt;strong&gt;conversation&lt;/strong&gt;. Engage with readers and writers in the comments. Meaningful discussions often add as much value as the article itself.  &lt;/p&gt;




&lt;h2&gt;
  
  
  4. 🔖 Save Posts with Reading List
&lt;/h2&gt;

&lt;p&gt;Found something interesting but no time to read? Hit &lt;strong&gt;“Save”&lt;/strong&gt; and add it to your &lt;strong&gt;Reading List&lt;/strong&gt;. You can access it anytime from your profile to keep track of useful resources.  &lt;/p&gt;




&lt;h2&gt;
  
  
  5. ❤️ Reactions &amp;amp; Unicorns
&lt;/h2&gt;

&lt;p&gt;Besides a standard &lt;strong&gt;like (❤️)&lt;/strong&gt;, DEV offers fun reactions like &lt;strong&gt;unicorns 🦄&lt;/strong&gt; for magical posts and &lt;strong&gt;raised hands 🙌&lt;/strong&gt; for agreement. These small touches make engagement more expressive.  &lt;/p&gt;




&lt;h2&gt;
  
  
  6. 🌱 Follow Authors &amp;amp; Tags
&lt;/h2&gt;

&lt;p&gt;Build your feed by following your favorite &lt;strong&gt;authors&lt;/strong&gt; and &lt;strong&gt;tags&lt;/strong&gt;. This personalizes your experience so you see content that matches your interests and career growth goals.  &lt;/p&gt;




&lt;h2&gt;
  
  
  7. 📊 Analytics for Writers
&lt;/h2&gt;

&lt;p&gt;When you publish, you can track how your article performs through &lt;strong&gt;built-in analytics&lt;/strong&gt;. View stats like page views, reactions, and comment activity to understand what resonates with readers.&lt;/p&gt;

&lt;p&gt;👉 You can access analytics by going to your &lt;strong&gt;Dashboard → Posts → “Stats”&lt;/strong&gt; on any article.  &lt;/p&gt;




&lt;h2&gt;
  
  
  8. 🤝 Connecting with Other Members
&lt;/h2&gt;

&lt;p&gt;DEV encourages &lt;strong&gt;open and public interactions&lt;/strong&gt;. You can connect with others in two simple ways:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comments&lt;/strong&gt; → Share your thoughts, ask questions, or start conversations directly under posts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profile links&lt;/strong&gt; → Many members include links to their GitHub, Twitter, portfolio, or email on their profiles if they’re open to external connections.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach keeps discussions transparent while still giving you ways to network with developers outside the platform.  &lt;/p&gt;




&lt;h2&gt;
  
  
  9. 🚀 Forem &amp;amp; Open Source Nature
&lt;/h2&gt;

&lt;p&gt;DEV is powered by &lt;strong&gt;Forem&lt;/strong&gt;, an open-source platform. This means the community can contribute improvements, request features, or even spin up their own communities using the same software.  &lt;/p&gt;




&lt;h2&gt;
  
  
  10. 🎯 DEV Challenges
&lt;/h2&gt;

&lt;p&gt;One of the most exciting ways to participate on DEV is through &lt;strong&gt;DEV Challenges&lt;/strong&gt;. These are themed, community-wide prompts where you can share articles, tutorials, or projects around a specific topic.  &lt;/p&gt;

&lt;p&gt;Here’s why Challenges are worth exploring:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Learn by doing&lt;/strong&gt; → Each challenge gives you a theme or problem to solve, encouraging you to experiment with new technologies or practices.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boost your visibility&lt;/strong&gt; → Challenge submissions often get featured and attract more reactions, comments, and followers than standard posts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect with the community&lt;/strong&gt; → Since many people contribute, challenges spark discussions and let you see diverse approaches to the same topic.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gain recognition&lt;/strong&gt; → Some challenges are sponsored and include special shoutouts, badges, or even small prizes for participants.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You can find active and past challenges directly on &lt;a href="https://dev.to/challenges"&gt;DEV’s Challenge page&lt;/a&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Final Thoughts
&lt;/h2&gt;

&lt;p&gt;DEV.to is more than a blogging site — it’s a &lt;strong&gt;learning hub, networking space, and open-source project&lt;/strong&gt;. By using these 10 features, you’ll get the most out of your experience, whether you’re here to learn, share, or connect.  &lt;/p&gt;

</description>
      <category>devto</category>
      <category>opensource</category>
      <category>developers</category>
      <category>programming</category>
    </item>
    <item>
      <title>Implementing SSL with acme.sh on Ubuntu</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Mon, 18 Aug 2025 11:34:10 +0000</pubDate>
      <link>https://dev.to/siswoyo/implementing-ssl-with-acmesh-on-ubuntu-391e</link>
      <guid>https://dev.to/siswoyo/implementing-ssl-with-acmesh-on-ubuntu-391e</guid>
      <description>&lt;p&gt;This guide explains how to install and configure &lt;strong&gt;acme.sh&lt;/strong&gt; for SSL certificate management using Let's Encrypt, integrate it with &lt;strong&gt;Nginx&lt;/strong&gt;, set up automatic renewal with &lt;code&gt;cron&lt;/code&gt;, and perform manual renewal if needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Install acme.sh
&lt;/h2&gt;

&lt;p&gt;acme.sh is a pure shell script for managing SSL certificates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://get.acme.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add it to your shell environment:&lt;br&gt;
&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;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;acme.sh &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣ Issue an SSL Certificate&lt;br&gt;
Using Webroot Mode (Recommended for Nginx)&lt;br&gt;
Replace yourdomain.com with your actual domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;acme.sh &lt;span class="nt"&gt;--issue&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yourdomain.com &lt;span class="nt"&gt;-d&lt;/span&gt; www.yourdomain.com &lt;span class="nt"&gt;-w&lt;/span&gt; /var/www/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certificates are stored in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.acme.sh/yourdomain.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ Install the Certificate to Nginx&lt;br&gt;
&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;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/nginx/ssl/yourdomain.com
acme.sh &lt;span class="nt"&gt;--install-cert&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yourdomain.com &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--key-file&lt;/span&gt;       /etc/nginx/ssl/yourdomain.com/key.pem &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fullchain-file&lt;/span&gt; /etc/nginx/ssl/yourdomain.com/fullchain.pem &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--reloadcmd&lt;/span&gt;     &lt;span class="s2"&gt;"systemctl reload nginx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4️⃣ Configure Nginx to Use SSL&lt;br&gt;
Edit your Nginx config file (e.g., /etc/nginx/sites-available/yourdomain.conf):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;yourdomain.com&lt;/span&gt; &lt;span class="s"&gt;www.yourdomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Redirect HTTP to HTTPS&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;yourdomain.com&lt;/span&gt; &lt;span class="s"&gt;www.yourdomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;     &lt;span class="n"&gt;/etc/nginx/ssl/yourdomain.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/nginx/ssl/yourdomain.com/key.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&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;p&gt;Test and reload Nginx:&lt;br&gt;
&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;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5️⃣ Set Up Auto-Renewal with crontab&lt;br&gt;
acme.sh usually sets this up automatically. Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0 0 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="s2"&gt;"~/.acme.sh"&lt;/span&gt;/acme.sh &lt;span class="nt"&gt;--cron&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; &lt;span class="s2"&gt;"~/.acme.sh"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If not present, add manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crontab &lt;span class="nt"&gt;-e&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0 0 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; ~/.acme.sh/acme.sh &lt;span class="nt"&gt;--cron&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; ~/.acme.sh &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6️⃣ Manually Renew Certificates&lt;br&gt;
Renew a Single Domain&lt;br&gt;
Force renewal before expiration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;acme.sh &lt;span class="nt"&gt;--renew&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yourdomain.com &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload Nginx:&lt;br&gt;
&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;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renew All Certificates&lt;br&gt;
To renew all certificates managed by acme.sh at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;acme.sh &lt;span class="nt"&gt;--renew-all&lt;/span&gt; &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload Nginx after renewal:&lt;br&gt;
&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;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;7️⃣ Useful Commands&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List all issued certificates:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;acme.sh &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Revoke a certificate:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;acme.sh &lt;span class="nt"&gt;--revoke&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Remove a certificate from acme.sh:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;acme.sh &lt;span class="nt"&gt;--remove&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;8️⃣ Troubleshooting&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open required ports:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 80
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Check Nginx logs:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Verify DNS points to your server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ With this setup, SSL will be automatically renewed via cron, integrated with Nginx, and can be manually renewed anytime — either for one domain or all at once.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ssl</category>
      <category>nginx</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Best Practices for Creating Error Code Patterns</title>
      <dc:creator>Siswoyo Siswoyo</dc:creator>
      <pubDate>Fri, 08 Aug 2025 13:13:58 +0000</pubDate>
      <link>https://dev.to/siswoyo/best-practices-for-creating-error-code-patterns-25nk</link>
      <guid>https://dev.to/siswoyo/best-practices-for-creating-error-code-patterns-25nk</guid>
      <description>&lt;p&gt;Error codes play a crucial role in helping developers, users, and systems understand what went wrong in an application. A well-structured error code pattern improves clarity, debugging, maintainability, and support.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Why Use a Standard Error Code Pattern?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔍 &lt;strong&gt;Easier Debugging&lt;/strong&gt;: Quickly identify the origin and nature of an error.&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Better Monitoring &amp;amp; Alerts&lt;/strong&gt;: Group and analyze issues across services.&lt;/li&gt;
&lt;li&gt;🤝 &lt;strong&gt;Improved Developer Experience&lt;/strong&gt;: Easier to document, troubleshoot, and integrate.&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Structured Documentation&lt;/strong&gt;: Helps technical writers and QA teams.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧱 Structure of an Error Code
&lt;/h2&gt;

&lt;p&gt;A best practice for error code formatting follows a &lt;strong&gt;modular pattern&lt;/strong&gt;, for example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; &lt;code&gt;ORD-API-001&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ORD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain/Service Code (e.g., Order Service)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;API&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error Category (e.g., API validation, authentication)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sequential or categorized numeric code for easy identification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔖 Recommended Naming Convention
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;3 uppercase letters&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ORD&lt;/code&gt;, &lt;code&gt;USR&lt;/code&gt;, &lt;code&gt;DLV&lt;/code&gt;, &lt;code&gt;PRD&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Related to the business domain or microservice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Category&lt;/td&gt;
&lt;td&gt;2–4 uppercase letters&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;API&lt;/code&gt;, &lt;code&gt;USC&lt;/code&gt;, &lt;code&gt;DLV&lt;/code&gt;, &lt;code&gt;GRPC&lt;/code&gt;, &lt;code&gt;DB&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Classifies type of error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;3 digits&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;001&lt;/code&gt; to &lt;code&gt;999&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Incremental or logical grouping&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🗂️ Suggested Error Categories
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category Code&lt;/th&gt;
&lt;th&gt;Category Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;API&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API Errors&lt;/td&gt;
&lt;td&gt;Errors related to HTTP requests (validation, auth, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User Service Errors&lt;/td&gt;
&lt;td&gt;Specific to user profile, login, registration, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DLV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delivery/Validation&lt;/td&gt;
&lt;td&gt;Errors in delivery services, logistics validation, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GRPC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;gRPC Communication&lt;/td&gt;
&lt;td&gt;Errors related to gRPC service-to-service communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Database Errors&lt;/td&gt;
&lt;td&gt;Database read/write, connection, schema validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Integration Errors&lt;/td&gt;
&lt;td&gt;External API failures, payment gateway, 3rd-party service issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SYS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System Errors&lt;/td&gt;
&lt;td&gt;Unexpected exceptions, resource limits, timeout&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧾 Full Error Code Examples
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error Code&lt;/th&gt;
&lt;th&gt;Message&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ORD-API-001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Invalid order payload&lt;/td&gt;
&lt;td&gt;The request body failed schema validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ORD-GRPC-002&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Failed to fetch pricing from PRD&lt;/td&gt;
&lt;td&gt;gRPC call to pricing service failed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USR-USC-003&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User email already exists&lt;/td&gt;
&lt;td&gt;Business logic validation for duplicate users&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧩 Optional Enhancements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Localization Support
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USR-USC-003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User email already exists"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message_i18n"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Email sudah digunakan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"L'e-mail existe déjà"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Standard Error Response Format
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ORD-API-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid order payload"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"details"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"issue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Must be greater than 0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-08-07T17:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧪 Tips for Designing and Maintaining Error Codes&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tip&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅ Prefix with domain/service name&lt;/td&gt;
&lt;td&gt;Keep things traceable across microservices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Centralize error definitions&lt;/td&gt;
&lt;td&gt;Use a shared config file or database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Avoid magic numbers&lt;/td&gt;
&lt;td&gt;Use enums or constants in code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Version your error codes&lt;/td&gt;
&lt;td&gt;Allow backward compatibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Group related codes&lt;/td&gt;
&lt;td&gt;Group 100–199 for validation, 200–299 for business logic, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌ Don’t expose internal exceptions&lt;/td&gt;
&lt;td&gt;Convert to user-friendly messages and codes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌ Don’t reuse error codes&lt;/td&gt;
&lt;td&gt;Ensure one code maps to one error type only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;📚 Summary&lt;br&gt;
A well-designed error code pattern helps your application scale, improves DX (developer experience), and reduces debugging time. Always keep error codes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Predictable&lt;/li&gt;
&lt;li&gt;Descriptive&lt;/li&gt;
&lt;li&gt;Consistent&lt;/li&gt;
&lt;li&gt;Extensible&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>microservices</category>
      <category>restapi</category>
      <category>backenddevelopment</category>
    </item>
  </channel>
</rss>
