<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>mwum</title>
    <link>https://www.mwum.com/</link>
    <atom:link href="https://www.mwum.com/en/rss.xml" rel="self" type="application/rss+xml" />
    <description>mwum&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <managingEditor>me@mwum.com</managingEditor>
    <webMaster>me@mwum.com</webMaster>
    <copyright>©2013 mwum CC BY-SA 4.0</copyright>
    <lastBuildDate>Sun, 15 Feb 2026 01:24:07 +0800</lastBuildDate>
      <item>
        <title>RG40XX V: Full ROCKNIX Installation and Usage Notes</title>
        <link>https://www.mwum.com/en/rg40xx-v-rocknix-installation-and-usage-notes/</link>
        <pubDate>Sun, 17 Aug 2025 18:21:14 +0800</pubDate>
        <guid isPermaLink="true">https://www.mwum.com/en/rg40xx-v-rocknix-installation-and-usage-notes/</guid>
        <description>&lt;p&gt;I previously wrote about installing different systems on the RG35XX Plus in &lt;a href=&#34;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;    &#xA;      /en/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/&#xA;    &#xA;  &#xA;&#xA;&#34;&gt;RG35XX Plus Open-Source Handheld OS Installation Attempts and Usage Guide&lt;/a&gt;. At that time, &lt;a href=&#34;https://rocknix.org/&#34;&gt;ROCKNIX&lt;/a&gt; didn&amp;rsquo;t support the RG35XX Plus. I&amp;rsquo;ve now bought a new device, the RG40XX V, so let&amp;rsquo;s install ROCKNIX and have some fun.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installing-rocknix&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installing-rocknix&#34;&gt;Installing ROCKNIX&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Download the system image: &lt;a href=&#34;https://github.com/ROCKNIX/distribution/releases/tag/20250517&#34;&gt;https://github.com/ROCKNIX/distribution/releases/tag/20250517&lt;/a&gt;.&lt;br&gt;&#xA;Since this is an RG40XX V device, download &lt;code&gt;ROCKNIX-H700.aarch64-20250517.img.gz&lt;/code&gt; (images differ by device)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Flash the image to an SD card. I&amp;rsquo;ll use &lt;a href=&#34;https://etcher.balena.io/&#34;&gt;Etcher&lt;/a&gt; (other tools like &lt;a href=&#34;https://rufus.ie/&#34;&gt;Rufus&lt;/a&gt; or the &lt;code&gt;dd&lt;/code&gt; command work too)&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/etcher-select.webp&#34; alt=&#34;etcher-select&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/etcher-flashing.webp&#34; alt=&#34;etcher-flashing&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;If your device is from the H700 series (my RG40XX V is), there is one extra step. Because hardware differs between models in this series, you must manually select the correct device tree file:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;In the SD card&amp;rsquo;s root directory, open the &lt;code&gt;device_trees&lt;/code&gt; folder and find the device tree file for your device. For the RG40XX V, use &lt;code&gt;sun50i-h700-anbernic-rg40xx-v.dtb&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Copy this file to the SD card&amp;rsquo;s root directory and rename it to &lt;code&gt;dtb.img&lt;/code&gt; (all lowercase)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Eject the SD card, insert it into the powered-off device, then power it on&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The installation is quick — a bit over two minutes in my case&lt;br&gt;&#xA;&lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/rocknix-homepage-nintendo.webp&#34; alt=&#34;rocknix-homepage-nintendo&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;usage-notes&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#usage-notes&#34;&gt;Usage Notes&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;These notes are based on the &lt;a href=&#34;https://github.com/ROCKNIX/distribution-nightly/releases/tag/nightly-20250815&#34;&gt;nightly-20250815&lt;/a&gt; testing build rather than the 20250517 stable release. The stable image has a few issues on the RG40XX V (for example, it doesn&amp;rsquo;t support HDMI output), while the nightly does. I need HDMI for some screenshots, so the nightly was more convenient.&lt;/p&gt;&#xA;&lt;p&gt;The official docs are already very thorough — for example, &lt;a href=&#34;https://rocknix.org/play/add-games/&#34;&gt;how to add games&lt;/a&gt;, &lt;a href=&#34;https://rocknix.org/configure/networking/&#34;&gt;networking&lt;/a&gt;, &lt;a href=&#34;https://rocknix.org/configure/cloud-sync/&#34;&gt;cloud sync&lt;/a&gt;, &lt;a href=&#34;https://rocknix.org/devices/anbernic/rg40xx-v/&#34;&gt;RG40XX V specifics (like hotkeys)&lt;/a&gt;, etc. This post just jots down a few items I might forget, things that aren&amp;rsquo;t super obvious, or special cases.&lt;/p&gt;&#xA;&lt;h3 id=&#34;ssh--samba&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ssh--samba&#34;&gt;SSH &amp;amp; Samba&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;SSH is enabled by default. You can log in with &lt;code&gt;ssh root@&amp;lt;device_ip_address&amp;gt;&lt;/code&gt; and the password is &lt;code&gt;rocknix&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Samba is also enabled by default. Connect via &lt;code&gt;smb://&amp;lt;device_ip_address&amp;gt;&lt;/code&gt;; no username or password is required — anonymous login works.&lt;/p&gt;&#xA;&lt;h3 id=&#34;hdmi&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#hdmi&#34;&gt;HDMI&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;The official docs note that some devices behave better if you plug in the display before powering on, rather than after.&lt;/p&gt;&#xA;&lt;p&gt;There is no HDMI section in the system settings UI, but if you want to configure things like output resolution, the official docs provide a &lt;a href=&#34;https://rocknix.org/configure/hdmi/&#34;&gt;method&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Create an autostart script:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir /storage/.config/autostart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vim /storage/.config/autostart/090-sway-hdmi-resolution&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;File contents:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;output HDMI-A-1 resolution 1280x720&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /storage/.config/sway/config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;Make it executable:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod +x /storage/.config/autostart/090-sway-hdmi-resolution&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;emulationstation&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#emulationstation&#34;&gt;EmulationStation&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;The ROCKNIX front-end UI is based on the Batocera EmulationStation fork &lt;a href=&#34;https://github.com/ROCKNIX/emulationstation-next&#34;&gt;EmulationStation NEXT&lt;/a&gt;, customized and maintained by ROCKNIX.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-isnt-the-platform-i-want-visible-on-the-home-screen&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#why-isnt-the-platform-i-want-visible-on-the-home-screen&#34;&gt;Why Isn’t the Platform I Want Visible on the Home Screen?&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Right after first boot, only PICO-8 and ScummVM are visible.&lt;br&gt;&#xA;&lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/rocknix-navigation-bar.webp&#34; alt=&#34;rocknix-navigation-bar&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;EmulationStation scans the paths defined in &lt;code&gt;/storage/.emulationstation/es_systems.cfg&lt;/code&gt;. If a platform&amp;rsquo;s scan results are empty, that system won&amp;rsquo;t appear on the home list. For example, here&amp;rsquo;s a snippet from the config for NES:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;system&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;nes&lt;span class=&#34;nt&#34;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;fullname&amp;gt;&lt;/span&gt;Nintendo Entertainment System&lt;span class=&#34;nt&#34;&gt;&amp;lt;/fullname&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;manufacturer&amp;gt;&lt;/span&gt;Nintendo&lt;span class=&#34;nt&#34;&gt;&amp;lt;/manufacturer&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;release&amp;gt;&lt;/span&gt;1985&lt;span class=&#34;nt&#34;&gt;&amp;lt;/release&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;hardware&amp;gt;&lt;/span&gt;console&lt;span class=&#34;nt&#34;&gt;&amp;lt;/hardware&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;path&amp;gt;&lt;/span&gt;/storage/roms/nes&lt;span class=&#34;nt&#34;&gt;&amp;lt;/path&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;extension&amp;gt;&lt;/span&gt;.nes .unif .unf .zip .7z&lt;span class=&#34;nt&#34;&gt;&amp;lt;/extension&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;command&amp;gt;&lt;/span&gt;/usr/bin/runemu.sh %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers=&amp;#34;%CONTROLLERSCONFIG%&amp;#34;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;platform&amp;gt;&lt;/span&gt;nes&lt;span class=&#34;nt&#34;&gt;&amp;lt;/platform&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;theme&amp;gt;&lt;/span&gt;nes&lt;span class=&#34;nt&#34;&gt;&amp;lt;/theme&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;emulators&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;emulator&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;retroarch&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;cores&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;core&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;default=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;nestopia&lt;span class=&#34;nt&#34;&gt;&amp;lt;/core&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;core&amp;gt;&lt;/span&gt;fceumm&lt;span class=&#34;nt&#34;&gt;&amp;lt;/core&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;core&amp;gt;&lt;/span&gt;quicknes&lt;span class=&#34;nt&#34;&gt;&amp;lt;/core&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;core&amp;gt;&lt;/span&gt;mesen&lt;span class=&#34;nt&#34;&gt;&amp;lt;/core&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/cores&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;/emulator&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;emulator&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;mednafen&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;cores&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;lt;core&amp;gt;&lt;/span&gt;nes&lt;span class=&#34;nt&#34;&gt;&amp;lt;/core&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;lt;/cores&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;/emulator&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/emulators&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/system&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you place valid ROMs under &lt;code&gt;/storage/roms/nes&lt;/code&gt;, the NES platform will appear on the home screen.&lt;/p&gt;&#xA;&lt;div class=&#34;img-row-gap&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;    &#xA;    &lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/rocknix-homepage-nintendo.webp&#34; alt=&#34;rocknix-homepage-nintendo&#34;&gt;&#xA;    &#xA;    &lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/rocknix-navigation-bar-with-nintendo.webp&#34; alt=&#34;rocknix-navigation-bar-with-nintendo&#34;&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;manually-adding-game-metadata&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#manually-adding-game-metadata&#34;&gt;Manually Adding Game Metadata&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;ROCKNIX can pull game metadata from &lt;a href=&#34;https://screenscraper.fr/&#34;&gt;ScreenScraper&lt;/a&gt; — things like cover art and release dates. If scraping fails, you can add metadata manually.&lt;/p&gt;&#xA;&lt;p&gt;As an example, let&amp;rsquo;s add a NES game called &amp;ldquo;爆笑三国&amp;rdquo; (this is a Chinese game title). Put the ROM &lt;code&gt;爆笑三国.zip&lt;/code&gt; under &lt;code&gt;/storage/roms/nes&lt;/code&gt;, then add two asset files &lt;code&gt;boxfront.jpg&lt;/code&gt; and &lt;code&gt;logo.png&lt;/code&gt;. Your folder structure should look like this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/storage/roms/nes&#xA;|-- assets&#xA;|   `-- 爆笑三国&#xA;|       |-- boxfront.jpg&#xA;|       `-- logo.png&#xA;|-- gamelist.xml&#xA;`-- 爆笑三国.zip&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;gamelist.xml&lt;/code&gt; is the metadata file used by EmulationStation. Here&amp;rsquo;s an example (you can add more fields like rating, players, etc.):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;gameList&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;game&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;path&amp;gt;&lt;/span&gt;./爆笑三国.zip&lt;span class=&#34;nt&#34;&gt;&amp;lt;/path&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;爆笑三国&lt;span class=&#34;nt&#34;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;developer&amp;gt;&lt;/span&gt;外星科技&lt;span class=&#34;nt&#34;&gt;&amp;lt;/developer&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;releasedate&amp;gt;&lt;/span&gt;1994&lt;span class=&#34;nt&#34;&gt;&amp;lt;/releasedate&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;desc&amp;gt;&lt;/span&gt;《爆笑三国》是由外星科技开发的一款以三国历史为背景的战棋类游戏，发行于 FC（红白机）平台。游戏采用幽默诙谐的风格，重新演绎三国历史，增添了许多搞笑元素。玩家将扮演刘备、关羽、张飞等知名武将，体验丰富多样的职业系统和转职机制。游戏中包含多种职业，如步兵、骑兵、弓兵和文官等，每个职业都有独特的技能和转职路线，增加了游戏的策略深度和可玩性。此外，游戏还原了诸多经典的三国战役，并通过搞笑的剧情对白，为玩家带来轻松愉快的游戏体验。凭借其独特的风格和丰富的玩法，《爆笑三国》在众多 FC 游戏中脱颖而出，成为玩家们津津乐道的经典之作。&lt;span class=&#34;nt&#34;&gt;&amp;lt;/desc&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;image&amp;gt;&lt;/span&gt;./assets/爆笑三国/boxfront.jpg&lt;span class=&#34;nt&#34;&gt;&amp;lt;/image&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;lt;marquee&amp;gt;&lt;/span&gt;./assets/爆笑三国/logo.png&lt;span class=&#34;nt&#34;&gt;&amp;lt;/marquee&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/game&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/gameList&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Below: left is before adding metadata; right is after.&lt;/p&gt;&#xA;&lt;div class=&#34;img-row-gap&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;    &#xA;    &lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/rocknix-nintendo.webp&#34; alt=&#34;rocknix-nintendo&#34;&gt;&#xA;    &#xA;    &lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/rocknix-nintendo-meta-ok.webp&#34; alt=&#34;rocknix-nintendo-meta-ok&#34;&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;system-online-update-support&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#system-online-update-support&#34;&gt;System Online Update Support&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;ROCKNIX is an immutable system, which makes implementing system updates easier and more reliable at the technical level.&lt;/p&gt;&#xA;&lt;p&gt;Just download the update from the system settings and reboot — that&amp;rsquo;s it. If your device doesn&amp;rsquo;t have internet access, you can also update manually. See the &lt;a href=&#34;https://rocknix.org/play/update/#option-2-manual-update&#34;&gt;official docs&lt;/a&gt; for details.&lt;/p&gt;&#xA;&lt;div class=&#34;img-row-gap&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;    &#xA;    &lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/rocknix-system-update-prompt.webp&#34; alt=&#34;rocknix-system-update-prompt&#34;&gt;&#xA;    &#xA;    &lt;img src=&#34;/rg40xx-v-rocknix-installation-and-usage-notes/rocknix-updates-and-downloads.webp&#34; alt=&#34;rocknix-updates-and-downloads&#34;&gt;&#xA;&lt;/div&gt;&#xA;&#xA;</description>
      </item>
      <item>
        <title>Traefik in Practice: Automatically Provision HTTPS Certificates and Proxy Docker Services</title>
        <link>https://www.mwum.com/en/traefik-auto-https-docker/</link>
        <pubDate>Mon, 14 Jul 2025 09:23:00 +0800</pubDate>
        <guid isPermaLink="true">https://www.mwum.com/en/traefik-auto-https-docker/</guid>
        <description>&lt;p&gt;&lt;img src=&#34;/traefik-auto-https-docker/traefik-architecture.webp&#34; alt=&#34;traefik-architecture&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Traefik is a reverse proxy software that has stronger automation capabilities compared to traditional tools. For example, it can automatically detect changes in backend services, update routing configurations in real-time without restarting; it also has built-in support for ACME, which can automatically request and renew HTTPS certificates.&lt;/p&gt;&#xA;&lt;p&gt;This article focuses on the integration of Traefik and Docker and implements automatic HTTPS configuration, other functions are not involved.&lt;br&gt;&#xA;The reference is the official documentation: &lt;a href=&#34;https://doc.traefik.io/traefik/v3.4/user-guides/docker-compose/acme-dns/&#34;&gt;https://doc.traefik.io/traefik/v3.4/user-guides/docker-compose/acme-dns/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Different from the official documentation, we place Traefik and backend services in different compose files and connect them to a shared network through an external network, which decouples the services more. It also better demonstrates Traefik&amp;rsquo;s ability to automatically detect and create routes. For example, if the Traefik service starts first, it begins listening to Docker container events, if it detects a backend service configured with Traefik labels, it can automatically create routes; conversely, if the backend service starts first and Traefik starts later, Traefik will scan the running containers once, find the matching containers, and automatically create routes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;create-a-shared-network&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#create-a-shared-network&#34;&gt;Create a Shared Network&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;As mentioned above, we use a shared network to use Traefik. Run the following command to create it:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker network create traefik-proxy&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;configure-and-run-traefik-service&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#configure-and-run-traefik-service&#34;&gt;Configure and Run Traefik Service&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Create a &lt;code&gt;docker-compose.yaml&lt;/code&gt; file:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik:v3.4&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;unless-stopped&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;443:443&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Comment out these two lines, they are only used during development and debugging&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# - &amp;#34;--log.level=DEBUG&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# - &amp;#34;--api.insecure=true&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Indicates Traefik will listen to Docker container events and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# automatically discover services&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--providers.docker=true&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# By default, containers are not exposed,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# only containers explicitly labeled with &amp;#34;traefik.enable=true&amp;#34; will be proxied.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--providers.docker.exposedbydefault=false&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Listen on port 443 to receive HTTPS requests&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--entryPoints.websecure.address=:443&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Enable the resolver named dnsresolver_cf,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# which automatically requests HTTPS certificates using DNS challenge.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--certificatesresolvers.dnsresolver_cf.acme.dnschallenge=true&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Specify which provider dnsresolver_cf uses, here we use Cloudflare,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# so Traefik will use Cloudflare&amp;#39;s API to complete DNS verification and&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# obtain Let&amp;#39;s Encrypt certificates. More providers can be found at:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# https://doc.traefik.io/traefik/v3.4/https/acme/#providers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--certificatesresolvers.dnsresolver_cf.acme.dnschallenge.provider=cloudflare&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Specify the storage location for dnsresolver_cf&amp;#39;s certificates&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;--certificatesresolvers.dnsresolver_cf.acme.storage=/letsencrypt/cf.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Environment variables required by the Cloudflare provider,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# this token is obtained from the Cloudflare dashboard,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# and needs permissions for Zone:Zone:Read, Zone:DNS:Edit.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Certificate storage location&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;./letsencrypt:/letsencrypt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Must mount this, this is the Unix Socket interface of the Docker daemon,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Traefik uses it to listen to container events.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;/var/run/docker.sock:/var/run/docker.sock:ro&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik-proxy&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik-proxy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;external&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik-proxy&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file. Because we use the &lt;code&gt;CF_DNS_API_TOKEN&lt;/code&gt; environment variable, we need to create this file in the same folder as &lt;code&gt;docker-compose.yaml&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CF_DNS_API_TOKEN=your_token&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Finally, run the Traefik service with the following command:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker compose up -d&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;configure-and-run-whoami&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#configure-and-run-whoami&#34;&gt;Configure and Run whoami&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;whoami is the backend service mentioned above, it is a simple HTTP server.&lt;/p&gt;&#xA;&lt;p&gt;Create a &lt;code&gt;docker-compose.yaml&lt;/code&gt; file:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;whoami&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik/whoami&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;unless-stopped&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Because we configured &amp;#34;--providers.docker.exposedbydefault=false&amp;#34;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# this service needs to be explicitly exposed.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Define the router rule: when the Host in the request is&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# whoami.mwum.com (change to your own domain),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# trigger this router. The router name is whoami, which can be changed,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# but note that the entrypoints / tls configuration below must match.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik.http.routers.whoami.rule=Host(`whoami.mwum.com`)&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Route the websecure entrypoint configured by&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# &amp;#34;--entryPoints.websecure.address=:443&amp;#34; to the whoami service&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik.http.routers.whoami.entrypoints=websecure&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# The certresolver here corresponds to the one enabled by&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# &amp;#34;--certificatesresolvers.dnsresolver_cf.acme.dnschallenge=true&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik.http.routers.whoami.tls.certresolver=dnsresolver_cf&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik-proxy&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;traefik-proxy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;external&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik-proxy&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run the whoami service with the following command:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker compose up -d&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;further-explanation-of-traefiks-automatic-discovery&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#further-explanation-of-traefiks-automatic-discovery&#34;&gt;Further Explanation of Traefik&amp;rsquo;s Automatic Discovery&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Now we can access the whoami service via HTTPS at https://whoami.mwum.com/.&lt;/p&gt;&#xA;&lt;p&gt;Notice that we didn&amp;rsquo;t configure anything related to whoami in the Traefik service definition, this would be unimaginable with a traditional reverse proxy. In Docker, we use labels to declaratively tell Traefik whether to proxy a service, which host to match, how to route traffic, and which certificate resolver to use. And Traefik is able to automatically discover the whoami service.&lt;/p&gt;&#xA;&lt;p&gt;You might also wonder: since we didn&amp;rsquo;t expose any ports for whoami, how does Traefik know where to forward the traffic?&lt;/p&gt;&#xA;&lt;p&gt;We can run the following command on the whoami service to see:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ docker compose ps&#xA;     Name         Command   State   Ports&#xA;------------------------------------------&#xA;whoami_whoami_1   /whoami   Up      80/tcp&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;whoami does not expose any ports externally, only exposes port 80 inside the container. We also did not configure Traefik to listen to any port of the whoami service, but Traefik by default automatically reads the &lt;code&gt;EXPOSE&lt;/code&gt; port of the whoami service as the backend address for the target service.&lt;/p&gt;&#xA;</description>
      </item>
      <item>
        <title>Exploring Different OS Installations and Usage Guides on RG35XX Plus Open Source Handheld</title>
        <link>https://www.mwum.com/en/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/</link>
        <pubDate>Mon, 03 Jun 2024 01:42:00 +0800</pubDate>
        <guid isPermaLink="true">https://www.mwum.com/en/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/</guid>
        <description>&lt;p&gt;Currently, I find muOS more suitable for me (&lt;a href=&#34;#installing-muos-2405-beans-os&#34;&gt;click to jump directly to the muOS section&lt;/a&gt;). It boots quickly, has a simple yet comprehensive OS, and offers a community. I expect to use this OS more in the future, and I will continue to share my experiences as I go.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installing-official-stock-os&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installing-official-stock-os&#34;&gt;Installing Official Stock OS&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;installation-steps&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installation-steps&#34;&gt;Installation Steps&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Download the OS from: &lt;a href=&#34;https://win.anbernic.com/download/&#34;&gt;https://win.anbernic.com/download/&lt;/a&gt;, on the page, find the corresponding machine and download the file. For example, I downloaded &amp;ldquo;cxm_rg35xx-p-en16gb-240409_2024-04-16_1111.zip&amp;rdquo;. After extracting it twice, you get &amp;ldquo;RG35XX+-P-EN16GB-OS240409.IMG&amp;rdquo; (about 16GB), which is the OS image we need&lt;/li&gt;&#xA;&lt;li&gt;Write the OS image to a TF card using tools like &lt;a href=&#34;https://etcher.balena.io/&#34;&gt;Etcher&lt;/a&gt; or &lt;a href=&#34;https://rufus.ie/&#34;&gt;Rufus&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Insert the TF card into the TF1 slot of the handheld and power it on&lt;/li&gt;&#xA;&lt;li&gt;Enter the OS, where the left side shows the new icon style, and the right side shows the old icon style. You can change the style in the settings&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/stock-main-menu-with-icon-style-2.webp&#34; alt=&#34;stock-main-menu-with-icon-style-2&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/stock-main-menu-with-icon-style-1.webp&#34; alt=&#34;stock-main-menu-with-icon-style-1&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The official 16GB OS cannot be expanded. Even if you use a 64GB TF card, you can only use 16GB, and the space for storing ROMs is only 4.5GB, as shown below:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/dev/disk6 (internal, physical):&#xA;   #:                       TYPE NAME                    SIZE       IDENTIFIER&#xA;   0:      GUID_partition_scheme                        *63.9 GB    disk6&#xA;   1:       Microsoft Basic Data NO NAME                 4.5 GB     disk6s1&#xA;   2:       Microsoft Basic Data Volumn                  33.6 MB    disk6s2&#xA;   3:       Microsoft Basic Data                         16.8 MB    disk6s3&#xA;   4:       Microsoft Basic Data                         67.1 MB    disk6s4&#xA;   5:       Microsoft Basic Data                         8.6 GB     disk6s5&#xA;   6:       Microsoft Basic Data                         2.3 GB     disk6s6&#xA;                    (free space)                         48.3 GB    -&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The official source also provides a 64GB OS image &amp;ldquo;RG35XX+-P-EN64GB-240409&amp;rdquo; includes many ROMs. Using this image can make full use of a 64GB TF card, and you can replace the ROMs with the ones you need. Alternatively, you can install unofficial OSes, at least the ones I installed support automatic space expansion, making full use of the TF card&amp;rsquo;s capacity.&lt;/p&gt;&#xA;&lt;h3 id=&#34;usage-records-and-guides&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#usage-records-and-guides&#34;&gt;Usage Records and Guides&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;It takes 17 seconds from completely powering off the handheld to fully starting up and being operational.&lt;/p&gt;&#xA;&lt;p&gt;The handheld can insert two TF cards, we can also put game ROMs on the second card by:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Shutting down the handheld&lt;/li&gt;&#xA;&lt;li&gt;Formatting the second TF card to FAT32 or exFAT&lt;/li&gt;&#xA;&lt;li&gt;Inserting it into the TF2 slot&lt;/li&gt;&#xA;&lt;li&gt;Powering on the handheld, it will generate some directories in the second card, such as the &amp;ldquo;Roms&amp;rdquo; directory. Under this directory, a bunch of different platform directories will be created for easy categorization. Of course, we can also organize them in our own way, just manually select the path when using the emulator&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;installing-stock-mod4-os&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installing-stock-mod4-os&#34;&gt;Installing Stock MOD4 OS&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;installation-steps-1&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installation-steps-1&#34;&gt;Installation Steps&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Download the OS from: &lt;a href=&#34;https://www.reddit.com/r/RG35XX_Plus/comments/1cdixev/modified_stock_firmware_mod4/&#34;&gt;https://www.reddit.com/r/RG35XX_Plus/comments/1cdixev/modified_stock_firmware_mod4/&lt;/a&gt;, click &amp;ldquo;&amp;raquo; Download Here &amp;laquo;&amp;rdquo; at the end of the post to access the download page. For example, I downloaded &amp;ldquo;RG35XXP-EN240409-MOD4-fixed.7z&amp;rdquo; and extracted it to get the OS image &amp;ldquo;RG35XXP-EN240409-MOD4.IMG&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;Write the OS image to a TF card using tools like &lt;a href=&#34;https://etcher.balena.io/&#34;&gt;Etcher&lt;/a&gt; or &lt;a href=&#34;https://rufus.ie/&#34;&gt;Rufus&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Insert the TF card into the TF1 slot of the handheld and power it on&lt;/li&gt;&#xA;&lt;li&gt;Enter the OS, which looks the same as the official Stock OS because only functional improvements were made&lt;br&gt;&#xA;&lt;img src=&#34;/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/stock-mod4-main-menu.webp&#34; alt=&#34;stock-mod4-main-menu&#34;&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;usage-records-and-guides-1&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#usage-records-and-guides-1&#34;&gt;Usage Records and Guides&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;It takes 17 seconds from completely powering off the handheld to fully starting up and being operational.&lt;/p&gt;&#xA;&lt;p&gt;This OS, created by &lt;a href=&#34;https://www.reddit.com/user/TomDuhamel/&#34;&gt;TomDuhamel&lt;/a&gt;, is based on the official Stock OS with several improvements:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Added FTP server:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Enable Wi-Fi in the system settings, connect, and note the assigned IP. Use an FTP tool to connect to &lt;code&gt;ftp://&amp;lt;Your IP&amp;gt;&lt;/code&gt;, with both username and password as &lt;code&gt;game&lt;/code&gt;. Alternatively, use the command line:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt; ftp &amp;lt;Your IP&amp;gt;&#xA;Connected to &amp;lt;Your IP&amp;gt;.&#xA;220 (vsFTPd 3.0.3)&#xA;Name (&amp;lt;Your IP&amp;gt;:&amp;lt;Your Name&amp;gt;): game&#xA;331 Please specify the password.&#xA;Password:&#xA;230 Login successful.&#xA;Remote system type is UNIX.&#xA;Using binary mode to transfer files.&#xA;&#xA;ftp&amp;gt; cd mmc/Roms/FC&#xA;250 Directory successfully changed.&#xA;&#xA;ftp&amp;gt; put tstd2.nes&#xA;local: tstd2.nes remote: tstd2.nes&#xA;229 Entering Extended Passive Mode (|||13755|)&#xA;150 Ok to send data.&#xA;100%     |*******************************|   640 KiB    4.03 MiB/s    00:00 ETA&#xA;226 Transfer complete.&#xA;655376 bytes sent in 00:00 (3.44 MiB/s)&#xA;&#xA;ftp&amp;gt; bye&#xA;221 Goodbye.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Added network time update function:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Naturally, you need to enable Wi-Fi to use it&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Supports automatic partition expansion:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;On the first boot, a new &amp;ldquo;Games&amp;rdquo; partition is created at the end of the card and expanded to use all available TF card space&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/dev/disk6 (internal, physical):&#xA;#:                       TYPE NAME                    SIZE       IDENTIFIER&#xA;0:      GUID_partition_scheme                        *63.9 GB    disk6&#xA;1:           Linux Filesystem                         33.6 MB    disk6s1&#xA;2:       Microsoft Basic Data Volumn                  33.6 MB    disk6s2&#xA;3:       Microsoft Basic Data                         16.8 MB    disk6s3&#xA;4:       Microsoft Basic Data                         67.1 MB    disk6s4&#xA;5:       Microsoft Basic Data                         8.6 GB     disk6s5&#xA;6:       Microsoft Basic Data                         524.3 MB   disk6s6&#xA;7:       Microsoft Basic Data Games                   54.6 GB    disk6s7&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;installing-batocera-v40-beta-os&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installing-batocera-v40-beta-os&#34;&gt;Installing Batocera v40 Beta OS&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;installation-steps-2&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installation-steps-2&#34;&gt;Installation Steps&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Download the OS from: &lt;a href=&#34;https://github.com/rg35xx-cfw/rg35xx-cfw.github.io/releases/tag/rg35xx_plus_h_batocera_20240306&#34;&gt;https://github.com/rg35xx-cfw/rg35xx-cfw.github.io/releases/tag/rg35xx_plus_h_batocera_20240306&lt;/a&gt;, download &amp;ldquo;batocera-h5-rg35xx-plus-40-20240306.img.gz&amp;rdquo; and extract it to get the OS image &amp;ldquo;batocera-h5-rg35xx-plus-40-20240306.img&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;Write the OS image to a TF card using tools like &lt;a href=&#34;https://etcher.balena.io/&#34;&gt;Etcher&lt;/a&gt; or &lt;a href=&#34;https://rufus.ie/&#34;&gt;Rufus&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Insert the TF card into the TF1 slot of the handheld and power it on&lt;/li&gt;&#xA;&lt;li&gt;Enter the OS, which gives a great first impression with its beautiful interface&lt;br&gt;&#xA;&lt;img src=&#34;/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/batocera-main-menu.webp&#34; alt=&#34;batocera-main-menu&#34;&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;There is a lot of available space, a 64GB card still has 59.5GB of free space:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/dev/disk6 (internal, physical):&#xA;   #:                       TYPE NAME                    SIZE       IDENTIFIER&#xA;   0:      GUID_partition_scheme                        *63.9 GB    disk6&#xA;   1:           Linux Filesystem                         21.0 MB    disk6s1&#xA;   2:           Linux Filesystem                         16.8 MB    disk6s2&#xA;   3:       Microsoft Basic Data BATOCERA                4.3 GB     disk6s3&#xA;   4:       Microsoft Basic Data SHARE                   59.5 GB    disk6s4&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;usage-records-and-guides-2&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#usage-records-and-guides-2&#34;&gt;Usage Records and Guides&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It takes 26 seconds from completely powering off the handheld to fully starting up and being operational&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The OS has SMB sharing enabled by default, which can be used to upload ROMs, back up saves, etc. The username and password are &lt;code&gt;root/linux&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;We can also enable Syncthing for real-time synchronization of ROMs and saves. To enable it, press the START button to enter MAIN MENU → select SYSTEM SETTINGS → scroll down to SERVICES → enable SYNCTHING&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;installing-muos-2405-beans-os&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installing-muos-2405-beans-os&#34;&gt;Installing muOS 2405 BEANS OS&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;installation-steps-3&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installation-steps-3&#34;&gt;Installation Steps&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Download the OS from: &lt;a href=&#34;https://muos.dev/release/plush/2405&#34;&gt;https://muos.dev/release/plush/2405&lt;/a&gt;, download &amp;ldquo;muOS-RG35XX-2405-BEANS.zip&amp;rdquo; and extract it to get the image &amp;ldquo;muOS-RG35XX-2405-BEANS.img&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;Write the OS image to a TF card using tools like &lt;a href=&#34;https://etcher.balena.io/&#34;&gt;Etcher&lt;/a&gt; or &lt;a href=&#34;https://rufus.ie/&#34;&gt;Rufus&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Insert the TF card into the TF1 slot of the handheld and power it on&lt;/li&gt;&#xA;&lt;li&gt;After a while, you will enter the &amp;ldquo;DEVICE TYPE&amp;rdquo; page, select &amp;ldquo;RG35XX - PLUS&amp;rdquo; → go to the &amp;ldquo;TIMEZONE&amp;rdquo; page and choose a corresponding timezone → go to the &amp;ldquo;DATE AND TIME&amp;rdquo; page and set the correct time → press &amp;ldquo;B&amp;rdquo; to save → enter the long OS installation process → after installation, the OS will automatically boot&lt;/li&gt;&#xA;&lt;li&gt;Enter the OS, where the left side shows the new Beans theme and the right side shows the Classic theme. More themes are available in the settings&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/muos-beans-theme-main-menu.webp&#34; alt=&#34;muos-beans-theme-main-menu&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/rg35xx-plus-open-source-handheld-os-installation-and-usage-guide/muos-classic-theme-main-menu.webp&#34; alt=&#34;muos-classic-theme-main-menu&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;There is also a lot of available space, a 64GB card still has 59.6GB of free space:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/dev/disk6 (internal, physical):&#xA;   #:                       TYPE NAME                    SIZE       IDENTIFIER&#xA;   0:      GUID_partition_scheme                        *63.9 GB    disk6&#xA;   1:                        EFI                         2.1 MB     disk6s1&#xA;   2:                        EFI BOOT                    33.6 MB    disk6s2&#xA;   3:                        EFI                         16.8 MB    disk6s3&#xA;   4:                        EFI                         67.1 MB    disk6s4&#xA;   5:                        EFI                         4.0 GB     disk6s5&#xA;   6:                        EFI                         134.2 MB   disk6s6&#xA;   7:       Microsoft Basic Data ROMS                    59.6 GB    disk6s7&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;usage-records-and-guides-3&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#usage-records-and-guides-3&#34;&gt;Usage Records and Guides&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It takes 9 seconds from completely powering off the handheld to fully starting up and being operational. The boot speed is impressively fast&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;To enable &amp;ldquo;Wi-Fi&amp;rdquo;&lt;/strong&gt;: Configuration → Wi-Fi Network → click &amp;ldquo;Enabled&amp;rdquo; → move to &amp;ldquo;Identifier&amp;rdquo; and press &amp;ldquo;X&amp;rdquo; to enter the search page → select a Wi-Fi network → move to &amp;ldquo;Password&amp;rdquo; and enter the password → move to &amp;ldquo;Connect&amp;rdquo; and click → after a successful connection, the &amp;ldquo;Status&amp;rdquo; at the bottom will show: Connected - &amp;lt;Your IP&amp;gt;, remember your IP&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;To enable &amp;ldquo;SFTP + Filebrowser&amp;rdquo;&lt;/strong&gt;: Configuration → Web Services → SFTP + Filebrowser → click &amp;ldquo;Enabled&amp;rdquo;,&lt;br&gt;&#xA;the SFTP port is 2022, you can connect using an SFTP client with both username and password as &lt;code&gt;muos&lt;/code&gt;,&lt;br&gt;&#xA;the WebUI port is 9090, you can enter &lt;code&gt;&amp;lt;Your IP&amp;gt;:9090&lt;/code&gt; in your computer&amp;rsquo;s browser to access the file management page, with both username and password as &lt;code&gt;muos&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;To enable &amp;ldquo;Syncthing&amp;rdquo;&lt;/strong&gt;: Configuration → Web Services → Syncthing → click &amp;ldquo;Enabled&amp;rdquo;,&lt;br&gt;&#xA;after enabling, enter &lt;code&gt;&amp;lt;Your IP&amp;gt;:7070&lt;/code&gt; in your computer’s browser to access the muOS Syncthing management page&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;How to manage game ROMs&lt;/strong&gt;: According to the official website, the only firm rule is that they &lt;strong&gt;must&lt;/strong&gt; be located in &lt;strong&gt;sub-folders&lt;/strong&gt; under the &lt;strong&gt;ROMS folder&lt;/strong&gt;, here is an example from the official website:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.&#xA;└─ ROMS&#xA;   ├── SEGA&#xA;   │    ├── Master System&#xA;   │    │   └── &amp;lt;game files here&amp;gt;&#xA;   │    └── Mega Drive&#xA;   │        └── &amp;lt;game files here&amp;gt;&#xA;   ├── Nintendo Entertainment Sytem&#xA;   │   └── &amp;lt;game files here&amp;gt;&#xA;   └── SNES&#xA;       └── &amp;lt;game files here&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Hotkeys&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Type&lt;/th&gt;&#xA;          &lt;th&gt;Hotkey&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Brightness&lt;/td&gt;&#xA;          &lt;td&gt;MENU + Volume&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Screenshot&lt;/td&gt;&#xA;          &lt;td&gt;L2 + R2 (press simultaneously)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Sleep Suspend&lt;/td&gt;&#xA;          &lt;td&gt;Hold POWER for 1 seconds&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Power on&lt;/td&gt;&#xA;          &lt;td&gt;Hold POWER for 5 seconds&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Power off&lt;/td&gt;&#xA;          &lt;td&gt;Hold POWER for 5 seconds&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Return to content root directory&lt;/td&gt;&#xA;          &lt;td&gt;START (in content directory)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Re-select RetroArch core&lt;/td&gt;&#xA;          &lt;td&gt;SELECT (with a specific game selected)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Open RetroArch menu&lt;/td&gt;&#xA;          &lt;td&gt;MENU + X (in RetroArch)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Close RetroArch&lt;/td&gt;&#xA;          &lt;td&gt;SELECT + START (in RetroArch)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fast forward&lt;/td&gt;&#xA;          &lt;td&gt;MENU + R1 (in RetroArch)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Slow motion&lt;/td&gt;&#xA;          &lt;td&gt;MENU + L1 (in RetroArch)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Load state&lt;/td&gt;&#xA;          &lt;td&gt;MENU + R2 (in RetroArch)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Save state&lt;/td&gt;&#xA;          &lt;td&gt;MENU + L2 (in RetroArch)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      </item>
      <item>
        <title>How to Correctly Set Retro Game Resolution: Pixel-Perfect Display from Theory to Practice</title>
        <link>https://www.mwum.com/en/how-to-set-retro-game-resolution-correctly/</link>
        <pubDate>Sun, 02 Jun 2024 22:09:00 +0800</pubDate>
        <guid isPermaLink="true">https://www.mwum.com/en/how-to-set-retro-game-resolution-correctly/</guid>
        <description>&lt;h2 id=&#34;theory-what-is-pixel-perfect-display-and-why-its-important&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#theory-what-is-pixel-perfect-display-and-why-its-important&#34;&gt;Theory: What is Pixel-Perfect Display and Why It&amp;rsquo;s Important&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;For retro games, such as those on NES and GBA platforms, the resolution settings and the physical resolution of the gaming device are crucial. These games were designed to strictly adhere to their original resolutions, unlike modern games that accommodate various display resolutions.&lt;/p&gt;&#xA;&lt;p&gt;To achieve the original visual experience of the games, we need pixel-perfect display, where each pixel in the original game corresponds to one or more pixels on the screen. For example, displaying the game at twice its original resolution means one pixel in the game corresponds to four pixels on the screen. This prevents pixel blurring and distortion while maintaining the aspect ratio of the original game, ensuring the image is not stretched or compressed disproportionately. If your gaming device has a sufficiently high resolution, such as 1080P or higher, maintaining the aspect ratio is even more important. This ensures the image is not disproportionately stretched or compressed, and the high resolution means that even if the pixels are not displayed pixel-perfectly, the visual impact is limited or even minimal. This is similar to how a high enough resolution can make jagged edges unnoticeable, but incorrect aspect ratio can make the image look awkward.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s take a practical example. The image below shows the resolutions of some retro gaming platforms and handhelds. If we want to play NES games on the RG35XXP, we can run NES games at the maximum integer multiple resolution, which in this case is 2x resolution. To get a more authentic gaming experience, we shouldn&amp;rsquo;t run the NES game in full screen on the RG35XXP because the NES game&amp;rsquo;s aspect ratio is 16:15, while the RG35XXP&amp;rsquo;s aspect ratio is 4:3. If we run the game in full screen, the game image will be disproportionately stretched to 4:3. Running the game at 2x resolution while maintaining the aspect ratio will leave black bars on the left and right sides of the RG35XXP screen but will provide a better display effect.&lt;/p&gt;&#xA;&lt;p&gt;The image is in SVG format. Open the image in a new tab and zoom in for a better display effect.&lt;br&gt;&#xA;&lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retro-game-platforms-and-handheld-resolutions.svg&#34; alt=&#34;Resolutions of Retro Gaming Platforms and Handhelds&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Therefore, the choice of gaming device is also crucial. It&amp;rsquo;s generally better to choose a device based on the platform you want to play on. For instance, if you use a 16:9 device to play a 16:15 game, large black bars will appear on both sides of the screen. This example only considers aspect ratio, but choosing a gaming device also requires considering the pixel-perfect display issue.&lt;/p&gt;&#xA;&lt;h2 id=&#34;practice-using-retroarch-on-rg35xxp-to-set-nes-games-for-pixel-perfect-display&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#practice-using-retroarch-on-rg35xxp-to-set-nes-games-for-pixel-perfect-display&#34;&gt;Practice: Using RetroArch on RG35XXP to Set NES Games for Pixel-Perfect Display&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;When you start the game, it defaults to full-screen display, which stretches the image to some extent and is not pixel-perfect. Although the default shader sharpens the image, it can&amp;rsquo;t match the clarity of pixel-perfect display. Below are three images we will use as typical examples for comparison. We can observe the text on the right side of the game screen to see the differences more easily:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Comparison of the first and second images: The sharpening has some effect. The text &amp;ldquo;谋略&amp;rdquo; in the second image appears more smudged, while the first image is clearer, and the text thickness is more uniform&lt;/li&gt;&#xA;&lt;li&gt;Comparison of the first, second, and third images: The text in the first and second images looks squished, while the text in the third image has a more normal proportion. This is due to the disproportionate stretching of the image&lt;/li&gt;&#xA;&lt;li&gt;Comparison of the first and third images: Even with sharpening enabled, the clarity and cleanliness of the image are better with pixel-perfect display, even though it wastes some screen space. This is why we mentioned in the theory section that it&amp;rsquo;s better to choose the gaming device based on the games you want to play, or a lot of screen space might be wasted&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;First image: Full screen display with shader sharpening enabled&lt;br&gt;&#xA;&lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/tenchi-wo-kurau-2-game-screen-with-full-screen-display-and-shader.webp&#34; alt=&#34;tenchi-wo-kurau-2-game-screen-with-full-screen-display-and-shader&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Second image: Full-screen display with the shader disabled&lt;br&gt;&#xA;&lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/tenchi-wo-kurau-2-game-screen-with-full-screen-display.webp&#34; alt=&#34;tenchi-wo-kurau-2-game-screen-with-full-screen-display&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Third image: 2x original game resolution with pixel-perfect display and shader disabled&lt;br&gt;&#xA;&lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/tenchi-wo-kurau-2-game-screen-with-pixel-perfect-display.webp&#34; alt=&#34;tenchi-wo-kurau-2-game-screen-with-pixel-perfect-display&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Now, let&amp;rsquo;s see how to configure pixel-perfect display on RetroArch. After starting the game, press &amp;ldquo;Menu + X&amp;rdquo; to enter RetroArch&amp;rsquo;s configuration menu. The initial menu you enter is the Quick Menu. Press &amp;ldquo;B&amp;rdquo; to go back to the previous menu, which is the Main Menu.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Disable shaders: Main Menu → Quick Menu → Shaders → Video Shaders → Turn it off&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;      &#xA;      &lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retroarch-config-screen-with-video-shaders-on.webp&#34; alt=&#34;retroarch-config-screen-with-video-shaders-on&#34;&gt;&#xA;      &#xA;      &lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retroarch-config-screen-with-video-shaders-off.webp&#34; alt=&#34;retroarch-config-screen-with-video-shaders-off&#34;&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Set integer scale: Main Menu → Settings → Video → Scaling → Integer Scale → Turn it on&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;      &#xA;      &lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retroarch-config-screen-with-integer-scale-off.webp&#34; alt=&#34;retroarch-config-screen-with-integer-scale-off&#34;&gt;&#xA;      &#xA;      &lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retroarch-config-screen-with-integer-scale-on.webp&#34; alt=&#34;retroarch-config-screen-with-integer-scale-on&#34;&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Set aspect ratio: Main Menu → Settings → Video → Scaling → Aspect Ratio → Choose the corresponding ratio, such as 16:15 for NES games&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;      &#xA;      &lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retroarch-config-screen-with-aspect-ratio-full.webp&#34; alt=&#34;retroarch-config-screen-with-aspect-ratio-full&#34;&gt;&#xA;      &#xA;      &lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retroarch-config-screen-with-aspect-ratio-16-to-15.webp&#34; alt=&#34;retroarch-config-screen-with-aspect-ratio-16-to-15&#34;&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Save configuration: Main Menu → Quick Menu → Overrides → Save Core Overrides → Click to save, a success message will appear, and the &amp;ldquo;Active Override File&amp;rdquo; will indicate the loaded configuration file. I saved it as a core configuration, so loading this core will load the current configuration. You can also save it as other configurations, such as &amp;ldquo;Save Game Overrides&amp;rdquo;, so that the configuration will be loaded only when the current game is loaded. If you don&amp;rsquo;t save the configuration, the changes will only be effective for the current session and will be lost after exiting RetroArch&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;      &#xA;      &lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retroarch-config-screen-with-save-core-overrides.webp&#34; alt=&#34;retroarch-config-screen-with-save-core-overrides&#34;&gt;&#xA;      &#xA;      &lt;img src=&#34;/how-to-set-retro-game-resolution-correctly/retroarch-config-screen-with-save-core-overrides-saved-successfully.webp&#34; alt=&#34;retroarch-config-screen-with-save-core-overrides-saved-successfully&#34;&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Happy reading and happy gaming!&lt;/p&gt;&#xA;</description>
      </item>
      <item>
        <title>Empowering iOS Devices with True Sideloading Capabilities: A Detailed Installation Guide and User Manual for TrollStore</title>
        <link>https://www.mwum.com/en/ios-trollstore-installation-guide-and-user-manual/</link>
        <pubDate>Fri, 12 Apr 2024 06:39:00 +0900</pubDate>
        <guid isPermaLink="true">https://www.mwum.com/en/ios-trollstore-installation-guide-and-user-manual/</guid>
        <description>&lt;p&gt;Sideloading simply means bypassing the official app store to install applications directly from other sources, a common practice on Android phones, which is why we often say that Android offers high playability. But is there a way to enable sideloading on iOS devices as well, to enhance their playability?&lt;/p&gt;&#xA;&lt;p&gt;The answer is yes. Tools like &lt;a href=&#34;https://altstore.io/&#34;&gt;AltStore&lt;/a&gt; and &lt;a href=&#34;https://sideloadly.io/&#34;&gt;Sideloadly&lt;/a&gt; can achieve iOS sideloading by re-signing apps with developer accounts. Apple allows developers to install any app on iOS devices, but this &amp;ldquo;officially allowed&amp;rdquo; method of sideloading comes with downsides: for instance, free developer accounts only let apps run for 7 days before a re-sideload is needed, and you can only install up to three apps simultaneously; paid developer accounts allow apps to last a year without these limitations, but at a cost of $99 per year, which is significant for most users. There are numerous other limitations, which you can read about in the FAQs of the aforementioned sideloading tools.&lt;/p&gt;&#xA;&lt;p&gt;These &amp;ldquo;officially allowed&amp;rdquo; methods of sideloading come with various drawbacks and restrictions, which isn&amp;rsquo;t true freedom in sideloading.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s time to introduce &lt;a href=&#34;https://github.com/opa334/TrollStore&#34;&gt;TrollStore&lt;/a&gt;, our main character here, which exploits an AMFI/CoreTrust bug in iOS to permanently install any app. However, the exploit is only enough to install &amp;ldquo;system&amp;rdquo; applications, which grants these apps more permissions than typical user-installed apps, though less than what&amp;rsquo;s available through jailbreaking. Apps like &lt;a href=&#34;https://theapplewiki.com/wiki/SeaShell&#34;&gt;SeaShell&lt;/a&gt; can be installed via TrollStore, offering capabilities such as remote access, device control, and sensitive information extraction.&lt;/p&gt;&#xA;&lt;p&gt;A word of caution: using TrollStore to install apps (IPA) carries significant risks. It&amp;rsquo;s recommended to use a spare iOS device for installing TrollStore and to avoid storing sensitive information on it. Additionally, devices with TrollStore installed should not be updated, as system updates will disable TrollStore and further reduce the device&amp;rsquo;s security.&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction-to-installing-trollstore&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#introduction-to-installing-trollstore&#34;&gt;Introduction to Installing TrollStore&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The installation method is referenced from: &lt;a href=&#34;https://ios.cfw.guide/installing-trollstore/&#34;&gt;https://ios.cfw.guide/installing-trollstore/&lt;/a&gt;. The installation process varies by device and system version. For instance, my device, an iPad mini 6 running iOS 16.4.1, can install TrollStore using &lt;a href=&#34;https://github.com/alfiecg24/TrollInstallerX&#34;&gt;TrollInstallerX&lt;/a&gt; as seen in the tutorial below.&lt;br&gt;&#xA;&lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/installing-trollstore-guide.webp&#34; alt=&#34;installing-trollstore-guide&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The installation method for TrollInstallerX is detailed here: &lt;a href=&#34;https://ios.cfw.guide/installing-trollstore-trollinstallerx/&#34;&gt;https://ios.cfw.guide/installing-trollstore-trollinstallerx/&lt;/a&gt;. This tutorial uses the &lt;a href=&#34;https://sideloadly.io/&#34;&gt;Sideloadly&lt;/a&gt; tool to sideload it onto an iOS device, though other sideloading tools can be used as desired.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installing-sideloadly&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installing-sideloadly&#34;&gt;Installing Sideloadly&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The installation process is detailed at &lt;a href=&#34;https://sideloadly.io/&#34;&gt;https://sideloadly.io/&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Install iTunes and iCloud (only necessary on Windows; macOS users can skip this step). It&amp;rsquo;s important to uninstall any Microsoft Store versions of iTunes and iCloud first, then install the non-Microsoft Store versions.&lt;br&gt;&#xA;Download links: &lt;a href=&#34;https://www.apple.com/itunes/download/win64&#34;&gt;iTunes x64&lt;/a&gt;, &lt;a href=&#34;https://www.apple.com/itunes/download/win32&#34;&gt;iTunes x32&lt;/a&gt;, and &lt;a href=&#34;https://updates.cdn-apple.com/2020/windows/001-39935-20200911-1A70AA56-F448-11EA-8CC0-99D41950005E/iCloudSetup.exe&#34;&gt;iCloud&lt;/a&gt;&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/itunes-installing.webp&#34; alt=&#34;itunes-installing&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/icloud-installing.webp&#34; alt=&#34;icloud-installing&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Install Sideloadly, which will require administrator permissions.&lt;br&gt;&#xA;Windows version download links: &lt;a href=&#34;https://sideloadly.io/SideloadlySetup64.exe&#34;&gt;Sideloadly x64&lt;/a&gt;, &lt;a href=&#34;https://sideloadly.io/SideloadlySetup32.exe&#34;&gt;Sideloadly x32&lt;/a&gt;; macOS version download link: &lt;a href=&#34;https://sideloadly.io/SideloadlySetup.dmg&#34;&gt;Sideloadly&lt;/a&gt;&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/sideloadly-installing.webp&#34; alt=&#34;sideloadly-installing&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/sideloadly-warning-needs-administrator-permission.webp&#34; alt=&#34;sideloadly-warning-needs-administrator-permission&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;installing-trollinstallerx-onto-an-ios-device&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installing-trollinstallerx-onto-an-ios-device&#34;&gt;Installing TrollInstallerX onto an iOS Device&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;First, download TrollInstallerX from the latest release here: &lt;a href=&#34;https://github.com/alfiecg24/TrollInstallerX/releases/latest&#34;&gt;https://github.com/alfiecg24/TrollInstallerX/releases/latest&lt;/a&gt;. The download yields a TrollInstallerX.ipa file.&lt;/p&gt;&#xA;&lt;p&gt;An aside: When I was downloading on the Windows system, it was detected as a virus by Microsoft Defender. Even after I chose &amp;ldquo;Allow on device&amp;rdquo;, I still couldn&amp;rsquo;t see the downloaded file. I wasn&amp;rsquo;t sure why, so I turned off &amp;ldquo;Real-time protection&amp;rdquo; and was then able to successfully download TrollInstallerX.ipa.&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/microsoft-defender-turn-off-real-time-protection.webp&#34; alt=&#34;microsoft-defender-turn-off-real-time-protection&#34;&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Launch Sideloadly and connect your iOS device to the computer. Your device will appear under iDevice. You must also select &amp;ldquo;Trust&amp;rdquo; in the &amp;ldquo;Trust This Computer&amp;rdquo; prompt that appears on your iOS device. If you do not trust the computer, the sideloading installation of TrollInstallerX will fail&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/ipad-trust-this-computer-popup.webp&#34; alt=&#34;ipad-trust-this-computer-popup&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/sideloadly-main-interface-with-idevice.webp&#34; alt=&#34;sideloadly-main-interface-with-idevice&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Click the &amp;ldquo;IPA icon&amp;rdquo; and select the TrollInstallerX.ipa file you downloaded&lt;br&gt;&#xA;&lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/sideloadly-main-interface-with-ipa.webp&#34; alt=&#34;sideloadly-main-interface-with-ipa&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Enter your Apple ID (only sent to Apple&amp;rsquo;s servers for authentication, use a secondary account if concerned)&lt;br&gt;&#xA;&lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/sideloadly-main-interface-with-apple-id.webp&#34; alt=&#34;sideloadly-main-interface-with-apple-id&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Click &amp;ldquo;Start&amp;rdquo; button&lt;br&gt;&#xA;&lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/sideloadly-main-interface-with-start-button.webp&#34; alt=&#34;sideloadly-main-interface-with-start-button&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In the Apple ID Authentication popup, enter your password and click &amp;ldquo;OK&amp;rdquo; button&lt;br&gt;&#xA;&lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/sideloadly-apple-id-authentication-interface.webp&#34; alt=&#34;sideloadly-apple-id-authentication-interface&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&amp;ldquo;Done.&amp;rdquo; appears indicating the sideload install is complete&lt;br&gt;&#xA;&lt;img src=&#34;/ios-trollstore-installation-guide-and-user-manual/sideloadly-main-interface-with-done.webp&#34; alt=&#34;sideloadly-main-interface-with-done&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;running-trollinstallerx-on-an-ios-device&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#running-trollinstallerx-on-an-ios-device&#34;&gt;Running TrollInstallerX on an iOS Device&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll find the TrollInstallerX app icon on your iOS device&amp;rsquo;s main screen&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-main-screen-trollinstallerx-app-icon.webp&#34; alt=&#34;ipad-main-screen-trollinstallerx-app-icon&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;At this time, the app cannot be opened because the developer has not yet been trusted. The detailed steps to trust the developer are:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Open &amp;ldquo;Settings&amp;rdquo; app, navigate through: General → VPN &amp;amp; Device Management → &amp;lt;Your Apple ID&amp;gt;,&lt;br&gt;&#xA;arrive at the following screen and tap &amp;lsquo;Trust &amp;ldquo;&amp;lt;Your Apple ID&amp;gt;&amp;rdquo;&amp;rsquo;&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-settings-device-management-apple-id.webp&#34; alt=&#34;ipad-settings-device-management-apple-id&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In the popup, tap &amp;ldquo;Trust&amp;rdquo;&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-settings-device-management-apple-id-trust-popup.webp&#34; alt=&#34;ipad-settings-device-management-apple-id-trust-popup&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;For devices on iOS 16.0 to 16.6.1, &amp;ldquo;Developer Mode&amp;rdquo; needs to be enabled:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Open &amp;ldquo;Settings&amp;rdquo; app, go to: Privacy &amp;amp; Security → Developer Mode,&lt;br&gt;&#xA;see the following screen and tap to enable &amp;ldquo;Developer Mode&amp;rdquo;&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-settings-privacy-security-developer-mode.webp&#34; alt=&#34;ipad-settings-privacy-security-developer-mode&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In the popup, click &amp;ldquo;Restart&amp;rdquo;&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-settings-privacy-security-developer-mode-enable-popup.webp&#34; alt=&#34;ipad-settings-privacy-security-developer-mode-enable-popup&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;After reboot, confirm by clicking &amp;ldquo;Turn On&amp;rdquo; in the popup that appears&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-main-screen-developer-mode-enable-popup.webp&#34; alt=&#34;ipad-main-screen-developer-mode-enable-popup&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Return to the home screen, open the TrollInstallerX app, and click &amp;ldquo;Install TrollStore&amp;rdquo;&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollinstallerx-main-with-install-trollstore-button.webp&#34; alt=&#34;ipad-trollinstallerx-main-with-install-trollstore-button&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollinstallerx-installing.webp&#34; alt=&#34;ipad-trollinstallerx-installing&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;During installation, a &amp;ldquo;Persistence helper&amp;rdquo; popup appears. Choose the &amp;ldquo;Tips&amp;rdquo; app or another unused app, as this system app will be injected as a persistence helper. In some cases (&lt;a href=&#34;https://github.com/opa334/TrollStore#persistence-helper&#34;&gt;see details here&lt;/a&gt;), TrollStore and all apps installed through it revert to &amp;ldquo;user&amp;rdquo; status and will not launch unless re-registered as &amp;ldquo;system&amp;rdquo; apps using the persistence helper&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollinstallerx-installing-persistence-helper-popup-with-tips.webp&#34; alt=&#34;ipad-trollinstallerx-installing-persistence-helper-popup-with-tips&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;After successful installation, a &amp;ldquo;TrollStore&amp;rdquo; app icon appears on the desktop&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollinstallerx-installing-installed-trollstore.webp&#34; alt=&#34;ipad-trollinstallerx-installing-installed-trollstore&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-main-screen-trollstore-app-icon.webp&#34; alt=&#34;ipad-main-screen-trollstore-app-icon&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Open the TrollStore app, which will automatically download and install Idid. At this point, TrollStore is successfully installed&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-installing-idid.webp&#34; alt=&#34;ipad-trollstore-installing-idid&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-settings-idid-installed.webp&#34; alt=&#34;ipad-trollstore-settings-idid-installed&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;trollstore-ipa-resources&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#trollstore-ipa-resources&#34;&gt;TrollStore IPA Resources&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/swaggyP36000/TrollStore-IPAs&#34;&gt;TrollStore-IPAs&lt;/a&gt;: This GitHub repository collects a treasure trove of IPA sources compatible with TrollStore.&lt;/p&gt;&#xA;&lt;p&gt;A reminder again that using TrollStore to install apps carries risks.&lt;/p&gt;&#xA;&lt;h2 id=&#34;using-trollstore&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#using-trollstore&#34;&gt;Using TrollStore&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;installing-apps-ipa&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#installing-apps-ipa&#34;&gt;Installing Apps (IPA)&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;First, let&amp;rsquo;s introduce how to install applications, which is the primary purpose of installing TrollStore. To let TrollStore install, just open the IPA file. Here are two methods, the first involves direct download in the browser:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In Safari, after downloading an IPA file → click the downloaded file → click the share button → in the share menu, select TrollStore&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-safari-with-download-button.webp&#34; alt=&#34;ipad-safari-with-download-button&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-safari-with-downloaded-file-share.webp&#34; alt=&#34;ipad-safari-with-downloaded-file-share&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;After jumping to TrollStore, an installation popup appears, click &amp;ldquo;Install&amp;rdquo; and the app will be installed shortly&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-install-delta-popup.webp&#34; alt=&#34;ipad-trollstore-install-delta-popup&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-apps-list-1.webp&#34; alt=&#34;ipad-trollstore-apps-list-1&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Another method involves using AirDrop:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;On another Apple device, select an IPA file and AirDrop it to the iOS device with TrollStore. On the iOS device, a receiving popup will appear, click &amp;ldquo;Accept&amp;rdquo; then in the &amp;ldquo;Open with&amp;rdquo; popup, select &amp;ldquo;TrollStore&amp;rdquo;&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-airdrop-receiving-popup.webp&#34; alt=&#34;ipad-trollstore-airdrop-receiving-popup&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-airdrop-open-method-popup.webp&#34; alt=&#34;ipad-trollstore-airdrop-open-method-popup&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Then, as with the previous method, click &amp;ldquo;Install&amp;rdquo;&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-install-retroarch-popup.webp&#34; alt=&#34;ipad-trollstore-install-retroarch-popup&#34;&gt;&#xA;       &#xA;       &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-apps-list-2.webp&#34; alt=&#34;ipad-trollstore-apps-list-2&#34;&gt;&#xA;   &lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;uninstalling-apps&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#uninstalling-apps&#34;&gt;Uninstalling Apps&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;The next most common task is uninstalling apps. Officially, apps installed from TrollStore must be uninstalled from TrollStore itself, according to &lt;a href=&#34;https://github.com/opa334/TrollStore#uninstalling-an-app&#34;&gt;the documentation&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Apps installed from TrollStore can only be uninstalled from TrollStore itself, tap an app or swipe it to the left in the &amp;lsquo;Apps&amp;rsquo; tab to delete it.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;However, I&amp;rsquo;ve found that the usual iOS method of long-pressing on the home screen and clicking &amp;ldquo;Remove App&amp;rdquo; also seems to work, removing the app from both the device and the TrollStore app list. Despite this, it&amp;rsquo;s recommended to uninstall via TrollStore, as it likely removes additional residual files.&lt;/p&gt;&#xA;&lt;p&gt;To uninstall using TrollStore: long-press an app in the app list and click &amp;ldquo;Uninstall App&amp;rdquo; or swipe left on an app and click &amp;ldquo;Delete&amp;rdquo; as shown in the images below:&lt;br&gt;&#xA;&lt;div class=&#34;img-row&#34; style=&#34;--num-cols: 2;&#34;&gt;&#xA;    &#xA;    &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-apps-list-with-long-press-app-popup.webp&#34; alt=&#34;ipad-trollstore-apps-list-with-long-press-app-popup&#34;&gt;&#xA;    &#xA;    &lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-apps-list-with-swipe-left-app.webp&#34; alt=&#34;ipad-trollstore-apps-list-with-swipe-left-app&#34;&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;jit-related&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#jit-related&#34;&gt;JIT-Related&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Some game emulators require JIT compilation to speed up performance, and some even need JIT to function properly. In the TrollStore 2.0.12 update, the &amp;ldquo;Open with JIT&amp;rdquo; feature was added, &lt;a href=&#34;https://twitter.com/opa334dev/status/1751051395606671778&#34;&gt;see details here&lt;/a&gt;, which allows apps to enable JIT in sandbox mode, not just in non-sandbox mode as before. To use this feature, long-press an app in the app list and click &amp;ldquo;Open with JIT&amp;rdquo; as shown in the image below:&lt;br&gt;&#xA;&lt;img src=&#34;/en/ios-trollstore-installation-guide-and-user-manual/ipad-trollstore-apps-list-with-open-with-jit.webp&#34; alt=&#34;ipad-trollstore-apps-list-with-open-with-jit&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Additional updates on using TrollStore may follow periodically.&lt;/p&gt;&#xA;</description>
      </item>
      <item>
        <title>Palworld Mods Installation Explained: A Step-by-Step Guide with Vortex</title>
        <link>https://www.mwum.com/en/palworld-mods-installation-vortex-guide/</link>
        <pubDate>Sun, 18 Feb 2024 03:15:28 +0800</pubDate>
        <guid isPermaLink="true">https://www.mwum.com/en/palworld-mods-installation-vortex-guide/</guid>
        <description>&lt;p&gt;Currently, the game does not support Steam Workshop, making mod installation a bit more complex. However, using a mod manager simplifies the process considerably. This article primarily focuses on using &lt;a href=&#34;https://www.nexusmods.com/about/vortex/&#34;&gt;Vortex&lt;/a&gt;, a mod manager that facilitates the easy management and installation of mods. Besides using a mod manager, mods can also be installed manually by copying files. Some mods may not be compatible with Vortex and require manual installation, but compatible ones can also be installed manually if desired. I recommend using Vortex for mod installation as it is more convenient and less prone to errors compared to manual installation.&lt;/p&gt;&#xA;&lt;p&gt;At the end of the article, there will be recommendations for &lt;a href=&#34;#recommended-palworld-mods&#34;&gt;Recommended Palworld Mods&lt;/a&gt; (clickable link to section), focusing on enhancing the gaming experience without disrupting game balance.&lt;/p&gt;&#xA;&lt;h2 id=&#34;step-1-install-vortex&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#step-1-install-vortex&#34;&gt;Step 1: Install Vortex&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Go to &lt;a href=&#34;https://www.nexusmods.com/about/vortex/&#34;&gt;https://www.nexusmods.com/about/vortex/&lt;/a&gt; to download Vortex. You need to log in to download; if you don&amp;rsquo;t have an account, register one. For example, I downloaded Vortex-1-1-9-12-1704709175.exe, install and launch it. Vortex will automatically install some necessary software like Microsoft .NET, which may prompt a confirmation window, just click to confirm.&lt;/p&gt;&#xA;&lt;h2 id=&#34;step-2-manage-games-in-vortex&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#step-2-manage-games-in-vortex&#34;&gt;Step 2: Manage Games in Vortex&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;After opening Vortex, log in at the top right corner, which will redirect you to a webpage for authorization. Once authorized, you are logged in.&lt;/p&gt;&#xA;&lt;p&gt;Then click &amp;ldquo;Games&amp;rdquo; on the left sidebar, enter &amp;ldquo;Palworld&amp;rdquo; in the search box, and the corresponding game icon will appear below. Hover over it to see the &amp;ldquo;Manage&amp;rdquo; button and click it. A &amp;ldquo;Game support not installed&amp;rdquo; window might pop up, indicating that game support requires installation via an extension. Confirm by clicking the download button,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-2-1.webp&#34; alt=&#34;step-2-1&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Vortex will restart automatically. After restarting, a window might pop up for manually selecting the game directory, possibly due to incomplete plugin installation. Ignoring this, I could still use it normally afterward. It also completes the installation of basic mod tools, such as automatically installing &lt;a href=&#34;https://github.com/UE4SS-RE/RE-UE4SS&#34;&gt;UE4SS&lt;/a&gt;, as shown below:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-2-2.webp&#34; alt=&#34;step-2-2&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;step-3-install-mods-in-vortex&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#step-3-install-mods-in-vortex&#34;&gt;Step 3: Install Mods in Vortex&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Click &amp;ldquo;Mods&amp;rdquo; on the left sidebar, then click the &amp;ldquo;Get more mods&amp;rdquo; button in the middle,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-3-1.webp&#34; alt=&#34;step-3-1&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This will redirect to the Nexus Mods website&amp;rsquo;s &amp;ldquo;Palworld&amp;rdquo; section,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-3-2.webp&#34; alt=&#34;step-3-2&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Find the mod you want to install, for example, &amp;ldquo;Pal Analyzer&amp;rdquo; mod. On the specific mod page, click the &amp;ldquo;VORTEX&amp;rdquo; button next to Download to install (some mods may require manual installation, which is not detailed here; the mod page will have specific instructions),&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-3-3.webp&#34; alt=&#34;step-3-3&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;After installation, it looks like this:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-3-4.webp&#34; alt=&#34;step-3-4&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;step-4-configure-and-modify-mods-in-vortex&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#step-4-configure-and-modify-mods-in-vortex&#34;&gt;Step 4: Configure and Modify Mods in Vortex&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This step can be skipped if you do not need to configure or modify mods, and you can proceed directly to &lt;a href=&#34;#step-5-start-the-game-and-play&#34;&gt;Step 5: Start the Game and Play!&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In the &amp;ldquo;Mods&amp;rdquo; tab, we can right-click a specific mod and select &amp;ldquo;Open in File Manager&amp;rdquo; to enter the mod folder. You can configure and modify the mod as needed; the mod page generally provides instructions,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-4-1.webp&#34; alt=&#34;step-4-1&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;After completing, click the &amp;ldquo;Deploy Mods&amp;rdquo; button at the top of the Vortex software (as shown below) to apply these mods to the game (Vortex will automatically copy the mod files to the game installation directory), a confirmation window may pop up during this process, just confirm it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-4-2.webp&#34; alt=&#34;step-4-2&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;step-5-start-the-game-and-play&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#step-5-start-the-game-and-play&#34;&gt;Step 5: Start the Game and Play!&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;After that, just start the game as normal. Installing mods is that simple, enjoy your game!&lt;/p&gt;&#xA;&lt;p&gt;Below is how it looks after installing the &amp;ldquo;Pal Analyzer&amp;rdquo; mod, with the controller&amp;rsquo;s default RB button (the throw ball button) triggering the display.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/palworld-mods-installation-vortex-guide/step-5.jpeg&#34; alt=&#34;step-5&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;recommended-palworld-mods&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#recommended-palworld-mods&#34;&gt;Recommended Palworld Mods&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;pal-analyzer&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#pal-analyzer&#34;&gt;Pal Analyzer&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.nexusmods.com/palworld/mods/336&#34;&gt;https://www.nexusmods.com/palworld/mods/336&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Displays detailed information about wild pals. It is not recommended for early gameplay to maintain game balance, although the author has considered game balance by showing more content after capturing a certain number of pals. However, this can still disrupt the balance of the game.&lt;/p&gt;&#xA;&lt;h3 id=&#34;pal-capture-count&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#pal-capture-count&#34;&gt;Pal Capture Count&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.nexusmods.com/palworld/mods/224&#34;&gt;https://www.nexusmods.com/palworld/mods/224&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Displays the capture count when catching pals. Pal Analyzer also has this feature, but this one is more straightforward and does not disrupt game balance, making it suitable for early gameplay.&lt;/p&gt;&#xA;&lt;h3 id=&#34;pal-ivs&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#pal-ivs&#34;&gt;Pal IVs&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.nexusmods.com/palworld/mods/437&#34;&gt;https://www.nexusmods.com/palworld/mods/437&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Shows individual values when accessing the Palworld box or selling pals, essential for breeding strong pals.&lt;/p&gt;&#xA;&lt;h3 id=&#34;basic-minimap&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#basic-minimap&#34;&gt;Basic MiniMap&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.nexusmods.com/palworld/mods/146&#34;&gt;https://www.nexusmods.com/palworld/mods/146&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Adds a mini-map display. Having played games with a mini-map, it feels odd without one. There are quite a few customizable options, such as mini-map position and size.&lt;/p&gt;&#xA;&lt;h3 id=&#34;high-vis-crosshairs&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#high-vis-crosshairs&#34;&gt;High Vis Crosshairs&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.nexusmods.com/palworld/mods/379&#34;&gt;https://www.nexusmods.com/palworld/mods/379&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;When installed via Vortex, you need to enter the mod folder and delete the extra .pak files, keeping only the one needed. After modifying the mod file, click the &amp;ldquo;Deploy Mods&amp;rdquo; button in Vortex.&lt;/p&gt;&#xA;&lt;p&gt;I play on a handheld, and the game&amp;rsquo;s crosshair is small and not very noticeable, sometimes hard to see. This mod makes a significant improvement.&lt;/p&gt;&#xA;&lt;h3 id=&#34;autojoin-dedicated-server&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#autojoin-dedicated-server&#34;&gt;Autojoin Dedicated Server&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.nexusmods.com/palworld/mods/455&#34;&gt;https://www.nexusmods.com/palworld/mods/455&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Entering the IP and password for a dedicated server every time is extremely unfriendly and inconvenient for handheld players. This mod allows for direct entry into a dedicated server, which is very convenient.&lt;/p&gt;&#xA;&lt;h3 id=&#34;faster-hatch-press-instant&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#faster-hatch-press-instant&#34;&gt;Faster Hatch Press (instant)&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.nexusmods.com/palworld/mods/343&#34;&gt;https://www.nexusmods.com/palworld/mods/343&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;When you&amp;rsquo;ve hatched many eggs, you&amp;rsquo;ll find the 4-second long press to hatch pointless, just a waste of time. This mod eliminates that wait time.&lt;/p&gt;&#xA;</description>
      </item>
      <item>
        <title>Executing Different Commands in Different Directories</title>
        <link>https://www.mwum.com/en/execute-different-commands-in-different-directories/</link>
        <pubDate>Sun, 31 Jan 2016 00:00:00 +0800</pubDate>
        <guid isPermaLink="true">https://www.mwum.com/en/execute-different-commands-in-different-directories/</guid>
        <description>&lt;p&gt;I often encounter situations like this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GitBook has a &amp;ldquo;server&amp;rdquo; command, for example, &lt;code&gt;gitbook serve&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Jekyll has a &amp;ldquo;server&amp;rdquo; command, for example, &lt;code&gt;jekyll serve&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Rails has a &amp;ldquo;server&amp;rdquo; command, for example, &lt;code&gt;rails server&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The commands above are not exactly the same, and every time before I type the &amp;ldquo;server&amp;rdquo; command, I have to think for a while about which command to use. It&amp;rsquo;s okay if there are only a few, but once there are many similar commands, it&amp;rsquo;s easy to get confused and hard to remember. It would be great if there was a &lt;code&gt;server&lt;/code&gt; command that could automatically choose the appropriate command to execute.&lt;/p&gt;&#xA;&lt;p&gt;Action speaks louder than words. Below is a solution I wrote in Ruby. If you don&amp;rsquo;t like using Ruby, you can rewrite it in another language; the idea is similar.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env ruby&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;dir_commands&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;/Users/mwum/Gitbook/Ruby&amp;#34;&lt;/span&gt;            &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;gitbook serve --port 4006&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;/Users/mwum/dx&amp;#34;&lt;/span&gt;                      &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;jekyll serve -w&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;/Users/mwum/Code/Rails/chat-system&amp;#34;&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;bundle exec rails server&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;dir_commands&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;each&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pwd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;basename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;__FILE__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: no command defined for current directory: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Name the file above as &amp;ldquo;server&amp;rdquo; and place it in the bin directory. Make it executable with &lt;code&gt;chmod +x ./server&lt;/code&gt;, and you can use it happily.&lt;/p&gt;&#xA;&lt;p&gt;One thing to note: It is more appropriate to use &lt;code&gt;exec&lt;/code&gt; to execute commands, not &lt;code&gt;system&lt;/code&gt; or others. If you use &lt;code&gt;system&lt;/code&gt;, the Ruby process does not exit but waits for &lt;code&gt;system&lt;/code&gt; to return. Since the &amp;ldquo;server&amp;rdquo; command does not return immediately, using &lt;code&gt;system&lt;/code&gt; is not appropriate; the Ruby process will wait indefinitely. However, &lt;code&gt;exec&lt;/code&gt; completely replaces the process, so this problem does not occur.&lt;/p&gt;&#xA;&lt;p&gt;The program above is still not smart enough. If I want all subdirectories under a certain directory to execute the same command, it&amp;rsquo;s obviously not suitable to set each subdirectory individually. Therefore, continue to add regular expression matching functionality to the program above.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env ruby&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;dir_commands&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;sr&#34;&gt;%r{/Users/mwum/Gitbook/*}&lt;/span&gt;         &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;gitbook serve --port 4006&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;/Users/mwum/dx&amp;#34;&lt;/span&gt;                  &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;jekyll serve -w&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;sr&#34;&gt;%r{/Users/mwum/Code/Rails/*}&lt;/span&gt;      &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;bundle exec rails server&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;dir_commands&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;each&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pwd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Execute command: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Regexp&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pwd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=~&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Execute command: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;This dir class is not supported: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;basename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;__FILE__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: no command defined for current directory: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      </item>
  </channel>
</rss>
