<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://jing.rocks/feed.xml" rel="self" type="application/atom+xml" /><link href="https://jing.rocks/" rel="alternate" type="text/html" /><updated>2025-06-07T21:29:53+09:00</updated><id>https://jing.rocks/feed.xml</id><title type="html">Jing’s personal website</title><subtitle>This is a personal tech blog, what more explanation do you need?!?!</subtitle><entry><title type="html">Please Enable Javascript To Continue</title><link href="https://jing.rocks/2024/02/12/please-enable-javascript-to-continue.html" rel="alternate" type="text/html" title="Please Enable Javascript To Continue" /><published>2024-02-12T00:00:00+09:00</published><updated>2024-02-12T00:00:00+09:00</updated><id>https://jing.rocks/2024/02/12/please-enable-javascript-to-continue</id><content type="html" xml:base="https://jing.rocks/2024/02/12/please-enable-javascript-to-continue.html"><![CDATA[<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1"><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>Please Enable Javascript To Continue | Jing’s personal website</title>
<meta name="generator" content="Jekyll v4.3.4" />
<meta property="og:title" content="Please Enable Javascript To Continue" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="&lt;!DOCTYPE html&gt; Please Enable Javascript To Continue | Jing’s personal website" />
<meta property="og:description" content="&lt;!DOCTYPE html&gt; Please Enable Javascript To Continue | Jing’s personal website" />
<link rel="canonical" href="https://jing.rocks/2024/02/12/please-enable-javascript-to-continue.html" />
<meta property="og:url" content="https://jing.rocks/2024/02/12/please-enable-javascript-to-continue.html" />
<meta property="og:site_name" content="Jing’s personal website" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2024-02-12T00:00:00+09:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="Please Enable Javascript To Continue" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2024-02-12T00:00:00+09:00","datePublished":"2024-02-12T00:00:00+09:00","description":"&lt;!DOCTYPE html&gt; Please Enable Javascript To Continue | Jing’s personal website","headline":"Please Enable Javascript To Continue","mainEntityOfPage":{"@type":"WebPage","@id":"https://jing.rocks/2024/02/12/please-enable-javascript-to-continue.html"},"url":"https://jing.rocks/2024/02/12/please-enable-javascript-to-continue.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://jing.rocks/feed.xml" title="Jing&apos;s personal website" /></head>

  <body><header class="site-header" role="banner">

  <div class="wrapper"><a class="site-title" rel="author" href="/">Jing&#39;s personal website</a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
        </label>

        <div class="trigger"><a class="page-link" href="/about/">About</a><a class="page-link" href="/index.html">Jing&#39;s personal website</a></div>
      </nav></div>
</header>
<main class="page-content" aria-label="Content">
      <div class="wrapper" id="scripted">
        <p>Here's something for my ADHD ass to play with.</p>
        <p>I want this website to mostly be free of Javascript, so I won't put this on every page.</p>
      </div>
    </main><footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <h2 class="footer-heading">Jing&#39;s personal website</h2>

    <div class="footer-col-wrapper">
      <div class="footer-col footer-col-1">
        <ul class="contact-list">
          <li class="p-name">Jing&#39;s personal website</li><li><a class="u-email" href="mailto:jing at jing.rocks">jing at jing.rocks</a></li></ul>
      </div>

      <div class="footer-col footer-col-2"><ul class="social-media-list"><li><a href="https://mastodon.jing.lgbt/@jing" rel="me"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#mastodon"></use></svg> <span class="username">jing</span></a></li><li><a href="/feed.xml"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#rss"></use></svg> <span>rss</span></a></li></ul>
</div>

      <div class="footer-col footer-col-3">
        <p>This is a personal tech blog, what more explanation do you need?!?!</p>
      </div>
    </div>

  </div>

</footer>
</body>
  <script src="/assets/oneko/oneko.js"></script>
</html>]]></content><author><name></name></author><summary type="html"><![CDATA[Please Enable Javascript To Continue | Jing’s personal website]]></summary></entry><entry><title type="html">Please Disable Javascript To Continue</title><link href="https://jing.rocks/2024/02/09/please-disable-javascript-to-continue.html" rel="alternate" type="text/html" title="Please Disable Javascript To Continue" /><published>2024-02-09T00:00:00+09:00</published><updated>2024-02-09T00:00:00+09:00</updated><id>https://jing.rocks/2024/02/09/please-disable-javascript-to-continue</id><content type="html" xml:base="https://jing.rocks/2024/02/09/please-disable-javascript-to-continue.html"><![CDATA[<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1"><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>Please Disable Javascript To Continue | Jing’s personal website</title>
<meta name="generator" content="Jekyll v4.3.4" />
<meta property="og:title" content="Please Disable Javascript To Continue" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="&lt;!DOCTYPE html&gt; Please Disable Javascript To Continue | Jing’s personal website" />
<meta property="og:description" content="&lt;!DOCTYPE html&gt; Please Disable Javascript To Continue | Jing’s personal website" />
<link rel="canonical" href="https://jing.rocks/2024/02/09/please-disable-javascript-to-continue.html" />
<meta property="og:url" content="https://jing.rocks/2024/02/09/please-disable-javascript-to-continue.html" />
<meta property="og:site_name" content="Jing’s personal website" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2024-02-09T00:00:00+09:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="Please Disable Javascript To Continue" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2024-02-09T00:00:00+09:00","datePublished":"2024-02-09T00:00:00+09:00","description":"&lt;!DOCTYPE html&gt; Please Disable Javascript To Continue | Jing’s personal website","headline":"Please Disable Javascript To Continue","mainEntityOfPage":{"@type":"WebPage","@id":"https://jing.rocks/2024/02/09/please-disable-javascript-to-continue.html"},"url":"https://jing.rocks/2024/02/09/please-disable-javascript-to-continue.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://jing.rocks/feed.xml" title="Jing&apos;s personal website" /></head>

  <body><header class="site-header" role="banner">

  <div class="wrapper"><a class="site-title" rel="author" href="/">Jing&#39;s personal website</a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
        </label>

        <div class="trigger"><a class="page-link" href="/about/">About</a><a class="page-link" href="/index.html">Jing&#39;s personal website</a></div>
      </nav></div>
</header>
<main class="page-content" aria-label="Content">
      <div class="wrapper" id="scripted">
        <p>See how annoying this is?</p>
        <p>See also <a href="https://www.gnu.org/philosophy/wwworst-app-store.html">The WWWorst App Store</a>.</p>
      </div>
    </main><footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <h2 class="footer-heading">Jing&#39;s personal website</h2>

    <div class="footer-col-wrapper">
      <div class="footer-col footer-col-1">
        <ul class="contact-list">
          <li class="p-name">Jing&#39;s personal website</li><li><a class="u-email" href="mailto:jing at jing.rocks">jing at jing.rocks</a></li></ul>
      </div>

      <div class="footer-col footer-col-2"><ul class="social-media-list"><li><a href="https://mastodon.jing.lgbt/@jing" rel="me"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#mastodon"></use></svg> <span class="username">jing</span></a></li><li><a href="/feed.xml"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#rss"></use></svg> <span>rss</span></a></li></ul>
</div>

      <div class="footer-col footer-col-3">
        <p>This is a personal tech blog, what more explanation do you need?!?!</p>
      </div>
    </div>

  </div>

</footer>
<script src="/assets/noscript.js"></script>
  </body>

</html>]]></content><author><name></name></author><summary type="html"><![CDATA[Please Disable Javascript To Continue | Jing’s personal website]]></summary></entry><entry><title type="html">OpenKylin’s attack on free software</title><link href="https://jing.rocks/2024/01/05/openkylin-attack-on-free-software.html" rel="alternate" type="text/html" title="OpenKylin’s attack on free software" /><published>2024-01-05T00:00:00+09:00</published><updated>2024-01-05T00:00:00+09:00</updated><id>https://jing.rocks/2024/01/05/openkylin-attack-on-free-software</id><content type="html" xml:base="https://jing.rocks/2024/01/05/openkylin-attack-on-free-software.html"><![CDATA[<p>Warning: there are many images (screenshots) on this page.</p>

<p>Normally, I don’t do “distro reviews”. There are many reviews online already,
and I have unsually strict requirements for something I use daily.</p>

<h2 id="the-marketing">The marketing</h2>

<p>OpenKylin was dubbed “the first independent homegrown linux desktop distro”
(sic) by many state media in China, and it announced its release 1.0 in mid 2023.
This, without a doubt, is false advertising, and probably nationalist
propaganda. I had been asked by “the infrastructure team of openEuler” to host
a mirror of openEuler’s OS images. After some digging, openEuler seems to be
an rpm-based distro that also has a Chinese homepage and many Chinese company
logos on it while OpenKylin is Debian-based (or more accurately,
Ubuntu-based). The two are both sponsored by the state, yet they claim to be
community projects. As of the mirroring request, I politely refused of course,
as it would not align with my philosophy, to provide better access to free
software in the world.</p>

<p><img src="/assets/openkylin/openeuler-email.png" alt="openeuler-email" /></p>

<p>One more distribution of GNU/Linux seems to be a good thing in general. I
expect with more choices of flavors of OSes, more people will eventually turn
to free software. <a href="https://www.fsf.org/blogs/community/the-journey-begins-with-a-single-step-climb-the-freedom-ladder">Climbing the freedom
ladder</a>
has to start with somewhere afterall. However, I was soon to be proven too
naïve.</p>

<h2 id="an-audit">An audit</h2>

<p>Casually browsing the repository, I found that Sougou is set to the startup
homepage of the default browser Firefox. This was discovered in the package
openkylin-default-settings-23.05.2.</p>

<p><img src="/assets/openkylin/openkylin-default-settings-23.05.2.png" alt="openkylin-default-settings-23.05.2" /></p>

<p>I have read somewhere that it was just a remix of Ubuntu, but I decided to see
for myself how good or how bad this OpenKylin was.</p>

<h3 id="the-download">The download</h3>

<p>To no one’s surprise, OpenKylin’s website is in Chinese by default. The title
of the page translates to “OpenKylin open source operating system”. The
download is straight forward, but only MD5 checksum of the ISO image is
offered on the website, no SHA256 or GPG signature. Are we in 1985?</p>

<h3 id="the-installer-and-the-livecd">The Installer and the LiveCD</h3>

<p>Using Qemu, I could not help but notice the installer uses outdated GRUB 2.04
version.</p>

<p><img src="/assets/openkylin/installer-grub.png" alt="installer-grub" /></p>

<p>Booting into the LiveCD, the desktop environment looks good, but of course I
am not impressed by fancy UI. So I pressed Crtl + Alt + T to open the
terminal, and found out the rumors were true: some essential utilities are
missing. Notably the <code class="language-plaintext highlighter-rouge">less</code> from <code class="language-plaintext highlighter-rouge">coreutils</code>, GNU Nano, and <code class="language-plaintext highlighter-rouge">man-db</code>. These
are the three things I cannot live without.</p>

<p><img src="/assets/openkylin/coreutils.png" alt="coreutils" /></p>

<p>Poking around the desktop, I noticed a familiar “W” icon on the taskbar. It is
a Microsoft Office clone, called WPS Office. This proprietary malware indeed
is homegrown, a known offender of user freedom and privacy. <a href="https://www.scmp.com/tech/big-tech/article/3185239/chinese-word-processor-wps-accused-censorship-after-author-says-she">In 2022, WPS
deleted a user’s file because of “sensitive
content”</a>. I
thought it was only on the LiveCD by default, but apparently I was wrong
again.</p>

<p><img src="/assets/openkylin/wps.png" alt="wps" /></p>

<p>Time to install. The installer asked me to accept the license
agreement. Despite I chose English language explicitly, I was presented the
license agreement in Chinese. In short, the license agreement decribes how
“we” (refers to “the OpenKylin community”) collect and use user data. Remember
OpenKylin is endorsed and sponsored by the state.</p>

<p><img src="/assets/openkylin/selectenglish.png" alt="selectenglish" /></p>

<p><img src="/assets/openkylin/openkylinlicenseagreement.png" alt="openkylinlicenseagreement" /></p>

<p>By default, Linux kernel 5.15 and 6.1 are installed. This becomes a selling
point: the short text below translates to “innovation and stability” (whatever
that means). Both 5.15.y and 6.1.y are LTS kernels, is there any point to
install both?</p>

<p><img src="/assets/openkylin/install1.png" alt="install1" /></p>

<p><img src="/assets/openkylin/install2.png" alt="install2" /></p>

<h3 id="the-first-boot-is-the-last-boot">The first boot is the last boot</h3>

<p>The bootloader is GRUB 2.06, the latest stable release at the time. To my
surprise, the distro’s name in GRUB is called “OpenKylin GNU/Linux”, exactly
on the boot menu. I am unsure if the maintainers are aware of what GNU project
is or what it represents at all.</p>

<p><img src="/assets/openkylin/grub.png" alt="grub" /></p>

<p><img src="/assets/openkylin/grubadv.png" alt="grubadv" /></p>

<p>The next step would be finding the usual software I need on a daily basis. If
I were a user that is not familiar with the command line, I would go to the
package manager’s frontend GUI to install software. This frontend here is
called “software store”. Having seen WPS Office installed by default, I did
not expect much. I was greeted with a full page of Chinese proprietary
software, many of which are known censors and malware, and it did not
recommend any free software.</p>

<p><img src="/assets/openkylin/store1.png" alt="store1" /></p>

<p><img src="/assets/openkylin/store2.png" alt="store2" /></p>

<p><img src="/assets/openkylin/store3.png" alt="store3" /></p>

<p>And there we are, “Weixin” a.k.a “Wechat”, the most popular instant messaging
software in China, which banned my account for 24 hours in late 2022 for
discussing <strong>sensitive content</strong>. “Baidu Netdisk”, a.k.a. “Baidu Cloud”, one
of the most popular storage services in China, which permanently banned my
account in 2014 for storing <strong>sensitive content</strong>. Storing some pdfs and video
clips download from youtube, the next thing you know, you become an enemy of
the state.</p>

<p><img src="/assets/openkylin/weixin.png" alt="weixin" /></p>

<p><img src="/assets/openkylin/baidu.png" alt="baidu" /></p>

<p><img src="/assets/openkylin/de1.png" alt="de1" /></p>

<p>These proprietary software packages are are huge. There are a few theories to
explain it:</p>

<ul>
  <li>
    <p>a. they are not GNU/Linux-native software, so they use WINE</p>
  </li>
  <li>
    <p>b. everything is statically linked</p>
  </li>
  <li>
    <p>c. they include universal backdoor</p>
  </li>
  <li>
    <p>d. all of the above</p>
  </li>
</ul>

<p>The installed system uses 12GB on disk, and 1.7GB memory after booting to
desktop. What kind of bloatware is this? This is the first boot and the last
boot, I will never use this system again.</p>

<h3 id="the-offensive-language-in-documentation">The offensive language in documentation</h3>

<p>There is no free software without free and good documentation. To no one’s
surprise, OpenKylin fails on this too, and it fails badly. Its documentation
can be considered non-existent compared to other distros.</p>

<p>I discovered a few interesting things on the documentation section of the
OpenKylin website. It has a <code class="language-plaintext highlighter-rouge">must read for newbie</code> part, consisting of pages I
would consider to be blog posts rather than manuals or documentations. There
is one page titled <code class="language-plaintext highlighter-rouge">20 funny things about Linux commands and Linux terminal</code>.
It has an joke with offensive, misogynistic language in the end, as the images
shown below. The Chinese text feels like a translation, and I was not wrong.
After an easy seach online, I found a blog post in English which matches the
Chinese text.</p>

<p><img src="/assets/openkylin/doc1.png" alt="doc1" /></p>

<p><img src="/assets/openkylin/doc2.png" alt="doc2" /></p>

<p><img src="/assets/openkylin/doc3.png" alt="doc3" /></p>

<p><img src="/assets/openkylin/doc4.png" alt="doc4" /></p>

<p>OpenKylin’s documentation pages has the CC-BY-SA 4.0 license by default, which
is a good thing <em>if they comply with the terms of license</em>, namely the <em>BY</em>
(give attribution) and <em>SA</em> (share-alike) part. Of course, the Chinese page
on OpenKylin’s website does not credit to where it was adapted from, and the
original work is likely non-free.</p>

<h3 id="the-reddit">The reddit</h3>

<p>A few users on Reddit say <a href="https://www.reddit.com/r/linux/comments/14zc6wn/a_quick_look_at_the_openkylin_linux_distro/">there appears to be tons of segfaults in
dmesg</a>,
mostly from <code class="language-plaintext highlighter-rouge">ukui-settings-daemon</code> and <code class="language-plaintext highlighter-rouge">kylin-status-manager</code>, two important
components of the desktop environment. I did not check dmesg, but I would not
be surprised. NVDIA’s proprietary GPU driver can also be found in OpenKylin’s
main repository.</p>

<h2 id="the-verdict">The verdict</h2>

<p><strong>OpenKylin bundles proprietary software and installs it by default</strong>. Users
have no choice but to accept it during the installation. <strong>OpenKylin also
actively recommends proprietary software in its “software store”</strong>. This is
even much worse than the <a href="https://www.gnu.org/distros/optionally-free-not-enough.html">optionally
free</a> in some
other distros. It does not deserve to have “GNU” or “Linux” in its name. It
loudly rejects the ideal of Free Software Movement. In fact, it can be
considered an attack on free software in whole, and it even turns its back on
“open source” for that matter. It never cares about user or freedom at all.</p>

<p>I call for boycotting this distribution. The developers and maintainers with
minimum ammount of conscience that care about Chinese users’ freedom should
make a 100% free distro called LibreKylin instead.</p>

<h2 id="license">License</h2>

<p>Copyright 2024, Jing Luo.</p>

<p>This work is licensed under a <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International
license</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Warning: there are many images (screenshots) on this page.]]></summary></entry><entry><title type="html">The myth of “incompatible with linux”</title><link href="https://jing.rocks/2023/10/29/proprietary-incompatibility.html" rel="alternate" type="text/html" title="The myth of “incompatible with linux”" /><published>2023-10-29T00:00:00+09:00</published><updated>2023-10-29T00:00:00+09:00</updated><id>https://jing.rocks/2023/10/29/proprietary-incompatibility</id><content type="html" xml:base="https://jing.rocks/2023/10/29/proprietary-incompatibility.html"><![CDATA[<p>So, you are sick of Windows, and you have installed your “linux distro” on
your PC for the very first time. You want to edit slides and spreadsheets, so
you installed LibreOffice using the package manager. You want to play video
games, so you installed Steam’s binary package. You want to be certified as an
AWS or CCNA professional, so you signed up for their online test at
home. What’s stopping you exploring this new world of “linux”?</p>

<p>It’s the world’s dependence on proprietary software. You get error messages
when you open that spreadsheet with embbedded macros someone from work sent to
you. You open an old spreadsheet you made, and find that the font size is all
messed up because the (non-free) font it uses is not installed and cannot be
installed. Your favorite video game on Steam requires DirectX 12, an API that
is only natively supported on Windows. You install the Proton engine, a
compatibility layer for games that can only run on Windows, hoping it would
work, but later find out that the game has an anti-cheat system that utilizes
a kernel mode driver, as well as enforces software DRM. You prepare to take
the online AWS or CCNA exam at home, but the exam provider only offers a .exe
executable for you to install on your PC, while explicitly disallows “linux”
or virtual machines in their exam requirements.</p>

<blockquote>
  <p>“That’s it! linux has poor compatibility and not user friendly at all. I’m
  switching back to Windows”</p>
</blockquote>

<p>Does this sound familiar to you? Except the “kernel mode driver anti-cheat”,
all of the above have happened to me, a not-so-new GNU/Linux user, but I do
not blame the incompatibility on any free software. Rather, it was proprietary
(non-free) software that places artificial limitation on free
standards/protocols, deliberately manufacturing and imposing incompatibility,
so that the developers of such non-free software can have more power over
users. The smearing campaign against the GNU/Linux operating systems in the
1990s and 2000s places blame on free software for such
incompatibility. Moreover, it is more often a choice for developers of
non-free software not to support the software’s interoperability, rather than
techincal difficulties. Especially for video games, developing a game that can
also run on GNU/Linux systems is much less profitable comparing to making it
very attractive to Windows users.</p>

<p>In August 2023, I translated <a href="https://www.gnu.org/proprietary/proprietary-incompatibility.html">a page on
gnu.org</a> to
<a href="https://www.gnu.org/proprietary/proprietary-incompatibility.zh-cn.html">Simplified
Chinese</a>
and Japanese, which sheds a light on this proprietary incompatibility. This
was my first time translating an article after joining the gnu.org Chinese
translation team.</p>

<p>This work is licensed under a <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International
license</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[So, you are sick of Windows, and you have installed your “linux distro” on your PC for the very first time. You want to edit slides and spreadsheets, so you installed LibreOffice using the package manager. You want to play video games, so you installed Steam’s binary package. You want to be certified as an AWS or CCNA professional, so you signed up for their online test at home. What’s stopping you exploring this new world of “linux”?]]></summary></entry><entry><title type="html">The matrix of repo.jing.rocks</title><link href="https://jing.rocks/2023/09/16/the-matrix-of-repo-jing-rocks.html" rel="alternate" type="text/html" title="The matrix of repo.jing.rocks" /><published>2023-09-16T00:00:00+09:00</published><updated>2023-09-16T00:00:00+09:00</updated><id>https://jing.rocks/2023/09/16/the-matrix-of-repo-jing-rocks</id><content type="html" xml:base="https://jing.rocks/2023/09/16/the-matrix-of-repo-jing-rocks.html"><![CDATA[<p>Updated: 2025-05-07 13:28+0900</p>

<p><a href="https://goaccess.jing.rocks/repo.html">Some goaccess stats</a></p>

<p><a href="https://stats.jing.rocks/">Some munin stats</a></p>

<p><a href="https://repo.jing.rocks/dirsize">Directory size</a></p>

<p>Total: 61 repos, 53 officially listed, 23 distinct GNU/Linux distros</p>

<table>
  <thead>
    <tr>
      <th>name</th>
      <th>repo dir name</th>
      <th>official status</th>
      <th>upstream</th>
      <th>sync frequency</th>
      <th>health monitor</th>
      <th>mirror list</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Alma Linux</td>
      <td>almalinux</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.repo.almalinux.org/almalinux/</td>
      <td>every 2 hr</td>
      <td> </td>
      <td>https://mirrors.almalinux.org</td>
    </tr>
    <tr>
      <td>Alpine Linux</td>
      <td>alpine</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.alpinelinux.org/alpine/</td>
      <td>every 20 min</td>
      <td> </td>
      <td>https://mirrors.alpinelinux.org/</td>
    </tr>
    <tr>
      <td>Arch Linux</td>
      <td>archlinux</td>
      <td><strong>official</strong> [1]</td>
      <td>rsync://rsync.archlinux.org/kitchensink_tier1</td>
      <td>every 2 min</td>
      <td>https://archlinux.org/mirrors/jing.rocks/</td>
      <td>https://archlinux.org/mirrors/</td>
    </tr>
    <tr>
      <td>Arch Linux ARM</td>
      <td>archlinuxarm</td>
      <td>not yet official</td>
      <td>rsync://dk.mirror.archlinuxarm.org/archlinuxarm/</td>
      <td>every 6 hr</td>
      <td> </td>
      <td>https://www.archlinuxarm.org/about/mirrors</td>
    </tr>
    <tr>
      <td>Armbian APT</td>
      <td>armbian-apt</td>
      <td><strong>official</strong></td>
      <td>rsync://mirrors.dotsrc.org/armbian-apt/</td>
      <td>every 4 hr</td>
      <td> </td>
      <td>https://docs.armbian.com/Mirrors/</td>
    </tr>
    <tr>
      <td>Armbian DL</td>
      <td>armbian-dl</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.armbian.com/dl/</td>
      <td>every 4 hr</td>
      <td> </td>
      <td>https://docs.armbian.com/Mirrors/</td>
    </tr>
    <tr>
      <td>Blender</td>
      <td>blender</td>
      <td><strong>official</strong></td>
      <td>[7]</td>
      <td>push</td>
      <td> </td>
      <td>https://www.blender.org/about/website/</td>
    </tr>
    <tr>
      <td>BLFS (Beyond Linux From Scratch)</td>
      <td>blfs</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.osuosl.org/blfs/</td>
      <td>every 24 hr</td>
      <td> </td>
      <td>https://www.linuxfromscratch.org/mirrors.html</td>
    </tr>
    <tr>
      <td>Debian GNU/Linux</td>
      <td>debian</td>
      <td><strong>official</strong></td>
      <td>rsync://debian.ethz.ch/debian/</td>
      <td>push</td>
      <td>https://mirror-master.debian.org/status/mirror-info/repo.jing.rocks.html</td>
      <td>https://www.debian.org/mirror/list</td>
    </tr>
    <tr>
      <td>Debian CD</td>
      <td>debian-cd</td>
      <td><strong>official</strong></td>
      <td>rsync://cdimage.debian.org/debian-cd/</td>
      <td>push</td>
      <td> </td>
      <td>https://www.debian.org/CD/http-ftp/#mirrors</td>
    </tr>
    <tr>
      <td>Debian cdimage (cdimage.debian.org)</td>
      <td>debian-cdimage</td>
      <td>unofficial [2]</td>
      <td>rsync://mirror.accum.se/mirror/cdimage/</td>
      <td>every week</td>
      <td> </td>
      <td> </td>
    </tr>
    <tr>
      <td>Debian Archive</td>
      <td>debian-archive</td>
      <td><strong>official</strong></td>
      <td>rsync://archive-klecker.debian.org/debian-archive/</td>
      <td>every day</td>
      <td> </td>
      <td>https://www.debian.org/distrib/archive</td>
    </tr>
    <tr>
      <td>Debian ports</td>
      <td>debian-ports</td>
      <td><strong>official</strong></td>
      <td>rsync://debian.inf.tu-dresden.de/debian-ports/</td>
      <td>every 6 hr</td>
      <td> </td>
      <td>https://www.ports.debian.org/mirrors</td>
    </tr>
    <tr>
      <td>Debian security</td>
      <td>debian-security</td>
      <td>unofficial [3]</td>
      <td>rsync://mirrors.dotsrc.org/debian-security/</td>
      <td>every 2 hr</td>
      <td> </td>
      <td> </td>
    </tr>
    <tr>
      <td>Devuan GNU/Linux</td>
      <td>devuan</td>
      <td><strong>official</strong></td>
      <td>rsync://mirrors.dotsrc.org/devuan/</td>
      <td>every 30 min</td>
      <td>https://sledjhamr.org/apt-panopticon/results/Report-web.html</td>
      <td>https://repo.jing.rocks/devuan/mirror_list.txt</td>
    </tr>
    <tr>
      <td>Devuan CD</td>
      <td>devuan-cd</td>
      <td><strong>official</strong></td>
      <td>rsync://files.devuan.org/devuan/</td>
      <td>every 6 hr</td>
      <td> </td>
      <td>https://www.devuan.org/get-devuan</td>
    </tr>
    <tr>
      <td>Dragora GNU/Linux-libre</td>
      <td>dragora</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.dragora.org/dragora/</td>
      <td>every 12 hr</td>
      <td> </td>
      <td>https://www.dragora.org/en/mirrors.html</td>
    </tr>
    <tr>
      <td>Fedora (the whole buffet, all you can eat)</td>
      <td>fedora-buffet</td>
      <td><strong>official</strong></td>
      <td>rsync://download-ib01.fedoraproject.org/fedora-buffet0/</td>
      <td>every 20 min</td>
      <td> </td>
      <td>https://admin.fedoraproject.org/mirrormanager/mirrors</td>
    </tr>
    <tr>
      <td>Fedora alternate content</td>
      <td>fedora-buffet/alt</td>
      <td><strong>official</strong></td>
      <td>rsync://download-ib01.fedoraproject.org/fedora-buffet0/</td>
      <td>every 20 min</td>
      <td> </td>
      <td>https://admin.fedoraproject.org/mirrormanager/mirrors</td>
    </tr>
    <tr>
      <td>Fedora archives</td>
      <td>fedora-buffet/archive</td>
      <td><strong>official</strong></td>
      <td>rsync://download-ib01.fedoraproject.org/fedora-buffet0/</td>
      <td>every 20 min</td>
      <td> </td>
      <td>https://admin.fedoraproject.org/mirrormanager/mirrors</td>
    </tr>
    <tr>
      <td>Fedora (the whole enchilada)</td>
      <td>fedora-buffet/fedora</td>
      <td><strong>official</strong></td>
      <td>rsync://download-ib01.fedoraproject.org/fedora-buffet0/</td>
      <td>every 20 min</td>
      <td> </td>
      <td>https://admin.fedoraproject.org/mirrormanager/mirrors</td>
    </tr>
    <tr>
      <td>Fedora EPEL</td>
      <td>fedora-buffet/epel</td>
      <td><strong>official</strong></td>
      <td>rsync://download-ib01.fedoraproject.org/fedora-buffet0/</td>
      <td>every 20 min</td>
      <td> </td>
      <td>https://admin.fedoraproject.org/mirrormanager/mirrors</td>
    </tr>
    <tr>
      <td>Fedora secondary archs</td>
      <td>fedora-buffet/fedora-secondary</td>
      <td><strong>official</strong></td>
      <td>rsync://download-ib01.fedoraproject.org/fedora-buffet0/</td>
      <td>every 20 min</td>
      <td> </td>
      <td>https://admin.fedoraproject.org/mirrormanager/mirrors</td>
    </tr>
    <tr>
      <td>FreeBSD</td>
      <td>freebsd</td>
      <td>unofficial [4]</td>
      <td>rsync://ftp.iij.ad.jp/FreeBSD/</td>
      <td>every 4 hr</td>
      <td> </td>
      <td>https://docs.freebsd.org/en/books/handbook/mirrors/</td>
    </tr>
    <tr>
      <td>GIMP</td>
      <td>gimp</td>
      <td><strong>official</strong></td>
      <td>rsync://master.gimp.org/gimp/pub/</td>
      <td>every 8 hr</td>
      <td> </td>
      <td>https://www.gimp.org/donating/sponsors.html#official-mirrors</td>
    </tr>
    <tr>
      <td>GNOME</td>
      <td>gnome</td>
      <td>dead [8]</td>
      <td>rsync://master.gnome.org/gnomeftp/</td>
      <td>-</td>
      <td> </td>
      <td> </td>
    </tr>
    <tr>
      <td>Gentoo</td>
      <td>gentoo</td>
      <td><strong>official</strong></td>
      <td>rsync://masterdistfiles.gentoo.org/gentoo/</td>
      <td>every 4 hr</td>
      <td> </td>
      <td>https://www.gentoo.org/downloads/mirrors/</td>
    </tr>
    <tr>
      <td>Gentoo portage</td>
      <td>gentoo-portage</td>
      <td>not yet official</td>
      <td>rsync://rsync.us.gentoo.org/gentoo-portage/</td>
      <td>every 30 min</td>
      <td> </td>
      <td>https://www.gentoo.org/support/rsync-mirrors/</td>
    </tr>
    <tr>
      <td>GNU</td>
      <td>gnu</td>
      <td><strong>official</strong></td>
      <td>rsync://ftp.gnu.org/gnu/</td>
      <td>every 11 hr</td>
      <td>https://download.savannah.gnu.org/mirmon/allgnu/</td>
      <td>https://www.gnu.org/prep/ftp.html</td>
    </tr>
    <tr>
      <td>GNU-alpha</td>
      <td>gnu-alpha</td>
      <td><strong>official</strong></td>
      <td>rsync://ftp.gnu.org/alpha/</td>
      <td>every day</td>
      <td> </td>
      <td>https://www.gnu.org/prep/ftp.html</td>
    </tr>
    <tr>
      <td>Hyperbola GNU/Linux-libre and HyperbolaBSD</td>
      <td>hyperbola</td>
      <td><strong>official</strong></td>
      <td>rsync://mirror.fsf.org/hyperbola/</td>
      <td>every 12 hr</td>
      <td>https://www.hyperbola.info/mirrors/repo.jing.rocks/</td>
      <td>https://www.hyperbola.info/mirrors/</td>
    </tr>
    <tr>
      <td>Jenkins</td>
      <td>jenkins</td>
      <td><strong>official</strong></td>
      <td>rsync://mirror.freedif.org/jenkins/</td>
      <td>every day</td>
      <td>https://get.jenkins.io/debian/jenkins_2.468_all.deb?mirrorstats</td>
      <td> </td>
    </tr>
    <tr>
      <td>Kali Linux</td>
      <td>kali</td>
      <td><strong>official</strong></td>
      <td>rsync://archive.kali.org/kali/</td>
      <td>push</td>
      <td>https://mirror-traces.kali.org/mirror-info/repo.jing.rocks.html</td>
      <td>https://mirror-traces.kali.org/</td>
    </tr>
    <tr>
      <td>Kali Linux images</td>
      <td>kali-images</td>
      <td><strong>official</strong></td>
      <td>rsync://archive.kali.org/kali-images/</td>
      <td>every 12 hr</td>
      <td>https://mirror-traces.kali.org/mirror-info/repo.jing.rocks.html</td>
      <td>https://cdimage.kali.org/README.mirrorlist</td>
    </tr>
    <tr>
      <td>KDE</td>
      <td>kde</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.kde.org/kdeftp</td>
      <td>every 2 hr</td>
      <td>https://download.kde.org/?mirrorstats</td>
      <td>https://download.kde.org/?mirrorstats</td>
    </tr>
    <tr>
      <td>KDE application data</td>
      <td>kde-applicationdata</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.kde.org/applicationdata</td>
      <td>every 2 hr</td>
      <td>https://files.kde.org/?mirrorstats</td>
      <td>https://files.kde.org/?mirrorstats</td>
    </tr>
    <tr>
      <td>LFS (Linux From Scratch)</td>
      <td>lfs</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.osuosl.org/lfs/</td>
      <td>every 24 hr</td>
      <td> </td>
      <td>https://www.linuxfromscratch.org/mirrors.html</td>
    </tr>
    <tr>
      <td>linuxfromscratch.org</td>
      <td>lfs-website</td>
      <td><strong>official</strong></td>
      <td>rsync://www.linuxfromscratch.org/lfs-website/</td>
      <td>every 12 hr</td>
      <td>https://lfs.jing.rocks/</td>
      <td>https://www.linuxfromscratch.org/mirrors.html</td>
    </tr>
    <tr>
      <td>Linux-libre</td>
      <td>linux-libre</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.linux-libre.fsfla.org/linux-libre/</td>
      <td>every 12 hr</td>
      <td> </td>
      <td>https://www.fsfla.org/ikiwiki/selibre/linux-libre/index.en.html#mirrors</td>
    </tr>
    <tr>
      <td>Linux Mint</td>
      <td>linuxmint</td>
      <td><strong>official</strong></td>
      <td>rsync://pub.linuxmint.com/pub/</td>
      <td>every 8 hr</td>
      <td> </td>
      <td>https://linuxmint.com/mirrors.php</td>
    </tr>
    <tr>
      <td>Linux Mint ISOs</td>
      <td>linuxmint-iso</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync-packages.linuxmint.com/packages/</td>
      <td>every 12 hr</td>
      <td> </td>
      <td>https://linuxmint.com/mirrors.php</td>
    </tr>
    <tr>
      <td>MX Linux</td>
      <td>mxlinux</td>
      <td><strong>official</strong></td>
      <td>rsync://iso.mxrepo.com/workspace/</td>
      <td>every 12 hr</td>
      <td> </td>
      <td>http://rsync-mxlinux.org/mirmon/packages.html</td>
    </tr>
    <tr>
      <td>MX Linux ISOs</td>
      <td>mxlinux-iso</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync-mxlinux.org/MX-Linux/</td>
      <td>every 12 hr</td>
      <td> </td>
      <td>http://rsync-mxlinux.org/mirmon/</td>
    </tr>
    <tr>
      <td>NetBSD</td>
      <td>netbsd</td>
      <td>not yet official</td>
      <td>rsync://ftp.riken.jp/netbsd/</td>
      <td>every 1 hr</td>
      <td> </td>
      <td>http://www.netbsd.org/mirrors/</td>
    </tr>
    <tr>
      <td>Nongnu (savannah.nongnu.org)</td>
      <td>nongnu</td>
      <td><strong>official</strong></td>
      <td>rsync://mirror.accum.se/mirror/gnu.org/savannah/</td>
      <td>every 23 hr</td>
      <td>https://download.savannah.gnu.org/mirmon/savannah/</td>
      <td>http://dl.sv.gnu.org/releases/00_MIRRORS.html</td>
    </tr>
    <tr>
      <td>OpenBSD</td>
      <td>openbsd</td>
      <td><strong>official</strong></td>
      <td>rsync://openbsd.cs.toronto.edu/openbsd/</td>
      <td>every 4 hr</td>
      <td> </td>
      <td>https://www.openbsd.org/ftp.html</td>
    </tr>
    <tr>
      <td>OpenWRT</td>
      <td>openwrt</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.openwrt.org/downloads/</td>
      <td>every 23 hr</td>
      <td> </td>
      <td>https://openwrt.org/downloads#mirrors</td>
    </tr>
    <tr>
      <td>OpenWRT sources</td>
      <td>openwrt-sources</td>
      <td>unofficial [5]</td>
      <td>rsync://rsync.openwrt.org/sources/</td>
      <td>every 24 hr</td>
      <td> </td>
      <td> </td>
    </tr>
    <tr>
      <td>Parabola GNU/Linux-libre</td>
      <td>parabola</td>
      <td><strong>official</strong> [1]</td>
      <td>rsync://rsync.cyberbits.eu/parabola/</td>
      <td>every 20 min</td>
      <td>https://www.parabola.nu/mirrors/jing.rocks</td>
      <td>https://www.parabola.nu/mirrors/</td>
    </tr>
    <tr>
      <td>Rocky Linux</td>
      <td>rocky</td>
      <td><strong>official</strong></td>
      <td>rsync://msync.rockylinux.org/rocky/mirror/pub/rocky/</td>
      <td>every 2 hr</td>
      <td> </td>
      <td>https://mirrors.rockylinux.org/mirrormanager/mirrors</td>
    </tr>
    <tr>
      <td>Rocky Linux SIGs</td>
      <td>rocky-sigs</td>
      <td><strong>official</strong></td>
      <td>rsync://msync.rockylinux.org/rocky-sigs/</td>
      <td>every 2 hr</td>
      <td> </td>
      <td>https://mirrors.rockylinux.org/mirrormanager/mirrors</td>
    </tr>
    <tr>
      <td>Slackware</td>
      <td>slackware</td>
      <td><strong>official</strong></td>
      <td>rsync://mirror.slackbuilds.org/slackware/</td>
      <td>every 8 hr</td>
      <td> </td>
      <td>https://mirrors.slackware.com/mirrorlist/</td>
    </tr>
    <tr>
      <td>Tails</td>
      <td>tails</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.tails.net/amnesia-archive/tails/</td>
      <td>every 1 hr</td>
      <td> </td>
      <td> </td>
    </tr>
    <tr>
      <td>Trisquel GNU/Linux</td>
      <td>trisquel</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.trisquel.org/trisquel.packages/</td>
      <td>every 2 hr</td>
      <td> </td>
      <td>https://trisquel.info/en/wiki/mirroring-trisquel</td>
    </tr>
    <tr>
      <td>Trisquel GNU/Linux ISOs</td>
      <td>trisquel-iso</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.trisquel.org/trisquel.iso/</td>
      <td>every 6 hr</td>
      <td> </td>
      <td>https://trisquel.info/en/wiki/mirroring-trisquel</td>
    </tr>
    <tr>
      <td>Turnkey GNU/Linux</td>
      <td>turnkeylinux</td>
      <td><strong>official</strong></td>
      <td>rsync://mirror.turnkeylinux.org/turnkeylinux/</td>
      <td>every 1 hr</td>
      <td> </td>
      <td>https://www.turnkeylinux.org/mirrors</td>
    </tr>
    <tr>
      <td>Ubuntu</td>
      <td>ubuntu</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.archive.ubuntu.com/ubuntu/</td>
      <td>push</td>
      <td>https://launchpad.net/ubuntu/+mirror/repo.jing.rocks-archive</td>
      <td>https://launchpad.net/ubuntu/+archivemirrors</td>
    </tr>
    <tr>
      <td>Ubuntu releases</td>
      <td>ubuntu-releases</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.releases.ubuntu.com/releases/</td>
      <td>push</td>
      <td>https://launchpad.net/ubuntu/+mirror/repo.jing.rocks-ubuntu-releases</td>
      <td>https://launchpad.net/ubuntu/+cdmirrors</td>
    </tr>
    <tr>
      <td>Ubuntu ports</td>
      <td>ubuntu-ports</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.ports.ubuntu.com/ubuntu-ports/</td>
      <td>every 6 hr</td>
      <td>https://launchpad.net/ubuntu/+mirror/repo.jing.rocks-ubuntu-ports</td>
      <td>https://launchpad.net/ubuntu/+archivemirrors</td>
    </tr>
    <tr>
      <td>VideoLAN</td>
      <td>videolan</td>
      <td><strong>official</strong></td>
      <td>rsync://rsync.videolan.org/videolan-ftp-full/</td>
      <td>every 6 hr</td>
      <td>https://get.videolan.org/vlc/3.0.20/vlc-3.0.20.tar.xz?mirrorstats</td>
      <td>https://www.videolan.org/videolan/mirrors.html</td>
    </tr>
    <tr>
      <td>Void Linux</td>
      <td>voidlinux</td>
      <td><strong>official</strong></td>
      <td>rsync://mirror.accum.se/mirror/voidlinux/</td>
      <td>every 2 hr</td>
      <td> </td>
      <td>https://docs.voidlinux.org/xbps/repositories/mirrors/index.html</td>
    </tr>
  </tbody>
</table>

<p>[1] is a Tier 1 mirror.</p>

<p>[2] should not be mirrored, but I mirror it anyway. It has daily and weekly builds of debian-cd.</p>

<p>[3] should not be mirrored. Debian project recommends downloading from security.debian.org, but since Devuan users also need this repo, I mirror it anyway.</p>

<p>[4] currently does not accept new mirrors.</p>

<p>[5] is mirrored so that the executables and the source codes are on the same server, which is considered more appropriate for GPL’ed software.</p>

<p>[6] should not be mirrored, but I mirror it anyway.</p>

<p>[7] not published per upstream’s request.</p>

<p>[8] GNOME deprecated its mirroring infrastructure and chose CDN instead. This mirror is not updated anymore.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Updated: 2025-05-07 13:28+0900]]></summary></entry><entry><title type="html">I fired my therapy dog</title><link href="https://jing.rocks/2023/09/08/I-fired-my-therapy-dog.html" rel="alternate" type="text/html" title="I fired my therapy dog" /><published>2023-09-08T00:00:00+09:00</published><updated>2023-09-08T00:00:00+09:00</updated><id>https://jing.rocks/2023/09/08/I-fired-my-therapy-dog</id><content type="html" xml:base="https://jing.rocks/2023/09/08/I-fired-my-therapy-dog.html"><![CDATA[<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>I fired my therapy dog
Looking at me he is not
Playing with the toy I bought
Sleeping like a silent rock

I fired my therapy dog
Forever I am lost
I failed to feed him food
He was unable to calm my mood

I fired my therapy dog
"Stop licking my sock"
To him I've always been true
Left me with his baby tooth

I can no longer exploit my dog
For he's more depressed than me now
How can I ever go to sleep
Never wanted him to leave
That's when I realize
I never had a dog
</code></pre></div></div>

<p>This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[``` I fired my therapy dog Looking at me he is not Playing with the toy I bought Sleeping like a silent rock]]></summary></entry><entry><title type="html">Experimenting with NVMe over TCP</title><link href="https://jing.rocks/2023/06/13/Experimenting-with-NVMe-over-TCP.html" rel="alternate" type="text/html" title="Experimenting with NVMe over TCP" /><published>2023-06-13T00:00:00+09:00</published><updated>2023-06-13T00:00:00+09:00</updated><id>https://jing.rocks/2023/06/13/Experimenting-with-NVMe-over-TCP</id><content type="html" xml:base="https://jing.rocks/2023/06/13/Experimenting-with-NVMe-over-TCP.html"><![CDATA[<h2 id="what-is-nvme-over-tcp">What is NVMe over TCP</h2>

<p>NVMe over TCP is like iSCSI, a standard for network-based storage. It
provides block-level access to NVMe drives over TCP/IP, having much
higher performance than iSCSI.</p>

<p>iSCSI was originally designed for SCSI drives, i.e. <em>SSD</em> (Slow
Spinning Disks). It’s an old protocol that does not suit the needs of
today’s SSDs.</p>

<p>The kernel Linux has native support for NVMe over TCP.</p>

<h2 id="my-setup">My setup</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Target:
Motherboard: Supermicro H12SSL-NT
CPU: AMD EPYC 7282
RAM: plenty
Storage: 4 x 7.68TB Kioxia CD6 U.3 NVMe SSD, ZFS RAIDz1
Network: Onboard Broadcom 10GbE
OS: Debian 12 (bookworm)

Initiator:
Motherboard: a good one
CPU: AMD Ryzen 9 5950X
RAM: plenty
Network: TP-link AQC107 10GbE
OS: Arch Linux, kernel 6.3.y
</code></pre></div></div>

<p>They are connected to the switch ports of my home router (OpenWRT
x86_64 on Ryzen 3 3100 with Intel X710 10GbE, promiscuous mode on).</p>

<p>MTU is set to 9000.</p>

<h3 id="configure-target">Configure target</h3>

<ul>
  <li>
    <p>Install <code class="language-plaintext highlighter-rouge">nvme-cli</code> package from the distro’s package manager, if not
already installed.</p>
  </li>
  <li>
    <p>Load <code class="language-plaintext highlighter-rouge">nvmet-tcp</code> kernel module if it is not loaded at boot:</p>
  </li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>modprobe nvmet-tcp
</code></pre></div></div>

<p>Alternatively, let the kernel load <code class="language-plaintext highlighter-rouge">nvmet-tcp</code> kernel module at boot:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "nvmet_tcp" &gt; /etc/modules-load.d/nvmet_tcp.conf
</code></pre></div></div>

<ul>
  <li>Create and configure an NVMe target subsystem, let’s call it “mysub”:</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir /sys/kernel/config/nvmet/subsystems/mysub
cd /sys/kernel/config/nvmet/subsystems/mysub
echo 1 &gt; attr_allow_any_host
</code></pre></div></div>

<p>If the kernel module <code class="language-plaintext highlighter-rouge">nvmet-tcp</code> is loaded, directory
<code class="language-plaintext highlighter-rouge">/sys/kernel/config/nvmet</code> should exist.</p>

<p>If running as sudo, <code class="language-plaintext highlighter-rouge">echo 1 &gt; attr_allow_any_host</code> might fail. In this
case, <code class="language-plaintext highlighter-rouge">su root</code> or try <code class="language-plaintext highlighter-rouge">echo 1 | sudo tee -a attr_allow_any_host &gt;
/dev/null</code> instead.</p>

<ul>
  <li>
    <p>Before creating a namespace for the target, use <code class="language-plaintext highlighter-rouge">lsblk</code> or <code class="language-plaintext highlighter-rouge">nvme
list</code> to find out the name of the NVMe device to be attached to the
target (i.e. /dev/nvme0n1).</p>
  </li>
  <li>
    <p>Next, create and configure a namespace <code class="language-plaintext highlighter-rouge">1</code>:</p>
  </li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir /sys/kernel/config/nvmet/subsystems/mysub/namespace/1
cd /sys/kernel/config/nvmet/subsystems/mysub/namespace/1
echo -n /dev/nvme0n1 &gt; device_path
echo 1 &gt; enable
</code></pre></div></div>

<ul>
  <li>Configure a port <code class="language-plaintext highlighter-rouge">1</code> for an initiator to connect:</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir /sys/kernel/config/nvmet/ports/1
cd /sys/kernel/config/nvmet/ports/1
echo "ipv4" &gt; addr_adrfam
echo "tcp" &gt; addr_trtype
echo 4420 &gt; addr_trsvcid
echo 192.168.0.231 &gt; addr_traddr
</code></pre></div></div>

<p>Here, our target has a static IPv4 address <code class="language-plaintext highlighter-rouge">192.168.0.231</code>. 4420 is
the common port number used for NVMe-oF connection.</p>

<ul>
  <li>Create a symbolic link from the <code class="language-plaintext highlighter-rouge">mysub</code> subsystem to the port <code class="language-plaintext highlighter-rouge">1</code></li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ln -s /sys/kernel/config/nvmet/subsystems/mysub/ /sys/kernel/config/nvmet/ports/1/subsystems/mysub
</code></pre></div></div>

<p>Using <code class="language-plaintext highlighter-rouge">dmesg | grep nvme_tcp</code>, we can see in the kernel log that the
port is enabled.</p>

<h3 id="configure-initiator">Configure initiator</h3>

<ul>
  <li>
    <p>Install <code class="language-plaintext highlighter-rouge">nvme-cli</code> package from the distro’s package manager, if not
already installed.</p>
  </li>
  <li>
    <p>Load <code class="language-plaintext highlighter-rouge">nvme-tcp</code> kernel module (<strong><em>NOT</em></strong> <code class="language-plaintext highlighter-rouge">nvmet-tcp</code>) if it is not
loaded at boot:</p>
  </li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>modprobe nvme-tcp
</code></pre></div></div>

<p>Alternatively, let the kernel load <code class="language-plaintext highlighter-rouge">nvme-tcp</code> kernel module at boot:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "nvme_tcp" &gt; /etc/modules-load.d/nvme_tcp.conf
</code></pre></div></div>

<ul>
  <li>Attempt to discover a remote target. This step can be skipped.</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme discover -t tcp -a 192.168.0.231 -s 4420
</code></pre></div></div>

<ul>
  <li>Connect the NVMe device:</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme connect -t tcp -a 192.168.0.231 -s 4420 -n mysub
</code></pre></div></div>

<p>The subsystem NQN argument <code class="language-plaintext highlighter-rouge">-n mysub</code> can be replaced by a host NQN,
which is stored in the target’s <code class="language-plaintext highlighter-rouge">/etc/nvme/hostnqn</code>. The command will
look like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme connect -t tcp -a 192.168.0.231 -s 4420 --hostnqn=nqn.2014-08.org.nvmexpress:uuid:1b4e28ba-2fa1-11d2-883f-0016d3ccabcd
</code></pre></div></div>

<ul>
  <li>Check <code class="language-plaintext highlighter-rouge">nvme list</code> or <code class="language-plaintext highlighter-rouge">lsblk</code> for the attached device. To disconnect,
first unmount the mounted NVMe device, then run <code class="language-plaintext highlighter-rouge">nvme disconnect</code>:</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvme disconnect /dev/nvme2n1 -n mysub
</code></pre></div></div>

<h3 id="performance">Performance</h3>

<p>Definitely faster than NFS, Samba, or iSCSI.</p>

<p>After formatting the zvol to ext4, I was able to use the package
<code class="language-plaintext highlighter-rouge">fio-3.34</code> to test the I/O performance. Here is the test profile I
used:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[global]
bs=4k
ioengine=libaio
iodepth=32
size=1g
numjobs=16
direct=1
refill_buffers=1
runtime=60
directory=/mnt
group_reporting=1
filename=ssd.test.file

[rand-read]
rw=randread
stonewall

[rand-write]
rw=randwrite
stonewall
</code></pre></div></div>

<p>I got about 650MB/s sequential read/write and about 90K IOPS random
read/write, slightly better than a typical SATA SSD. The numbers were
not great, probably because of the suboptimal zpool setup. Mounting
the zvol on the target directly, I only got about 1.5GB/s sequential
read. Also, the ethernet adapter at the initiator’s side, AQC107, is
known to be not very stable and sometimes overheat (and no support for
RDMA). It would be better if I had a 25Gb or 40Gb network adapter.</p>

<h3 id="reference">Reference</h3>

<ul>
  <li>
    <p><a href="https://note.com/ipoc/n/n6bca8a1faa7a">NVMe over TCP を試す</a></p>
  </li>
  <li>
    <p><a href="https://futurewei-cloud.github.io/ARM-Datacenter/qemu/nvme-of-tcp-vms/">How to setup NVMe/TCP with NVME-oF using KVM and
QEMU</a></p>
  </li>
  <li>
    <p><a href="https://mellanox.my.site.com/mellanoxcommunity/s/article/NVMe-over-TCP-Test-Report">NVMe over TCP Test
Report</a></p>
  </li>
</ul>

<!--Copyright 2023, 2024, Jing Luo.

This work is licensed under a [Creative Commons Attribution-ShareAlike 4.0
International license](https://creativecommons.org/licenses/by-sa/4.0/).-->]]></content><author><name></name></author><summary type="html"><![CDATA[What is NVMe over TCP]]></summary></entry><entry><title type="html">A user’s incomplete technical guide to Jellyfin and media streaming</title><link href="https://jing.rocks/2023/05/17/a-users-incomplete-technical-guide-to-jellyfin-and-media-streaming.html" rel="alternate" type="text/html" title="A user’s incomplete technical guide to Jellyfin and media streaming" /><published>2023-05-17T00:00:00+09:00</published><updated>2023-05-17T00:00:00+09:00</updated><id>https://jing.rocks/2023/05/17/a-users-incomplete-technical-guide-to-jellyfin-and-media-streaming</id><content type="html" xml:base="https://jing.rocks/2023/05/17/a-users-incomplete-technical-guide-to-jellyfin-and-media-streaming.html"><![CDATA[<h1 id="background-knowledge">Background knowledge</h1>

<h2 id="what-is-streaming">What is streaming?</h2>

<p>Simply put, the server sends a stream of video, audio, and optionally
subtitles, over the internet, to the client.</p>

<p>The difference between streaming and downloading a video file is that
streaming is real-time.  The user does not have to wait until the whole file
is downloaded.  The server divides the video file into many parts and serves a
bit of it at a time, and the client downloads it and plays it.  If the
internet connection allows, depending on the speed and latency of the
connection, the server serves more parts of the video file, and the client
downloads it and saves it locally, which is called buffering so that the video
can play more smoothly.</p>

<p>A large video is like a lake, and streaming is like a stream or river, the
quality and experience of streaming largely depend on the width of the stream
(the quality of said internet connection).</p>

<p>See more on <a href="https://www.cloudflare.com/en-ca/learning/video/what-is-streaming/">What is streaming? - How video streaming works -
Cloudflare</a></p>

<h2 id="what-is-jellyfin">What is Jellyfin</h2>

<p>Jellyfin is a free (as in freedom) software media system, a free (also as in
free beer) media solution that consists of both server and client, uses
<a href="https://en.wikipedia.org/wiki/HTTP_Live_Streaming">HLS</a> (HTTP Live Streaming
protocol) to stream media from server to client, and allows users to have
complete control of their media.</p>

<p>A Jellyfin server requires
<a href="https://jellyfin.org/docs/general/installation/">installation</a> of software
packages on an appropriate OS/platform.  After the server installation, the
user is expected to create a library and to add/import media into the library.
Most people also set up a <a href="https://jellyfin.org/docs/general/administration/storage">NFS
share</a> to share the
storage over network, as well as GPU <a href="https://jellyfin.org/docs/general/administration/hardware-acceleration/">hardware
acceleration</a>
for real-time transcoding.</p>

<p>After properly setting up the server, the user can use a browser or <a href="https://jellyfin.org/downloads">other
clients</a> to connect to the server and stream
media.</p>

<h2 id="what-could-possibly-go-wrong">What could possibly go wrong?</h2>

<p>This is a non-exhausted list of what I have experienced:</p>

<ul>
  <li>
    <p>The server cannot access the media files (permission denied, need to
properly set the file system permission)</p>
  </li>
  <li>
    <p>Green artifacts appear on the transcoded video when using AMD GPU (Radeon RX
6600XT) with VAAPI hardware acceleration</p>
  </li>
  <li>
    <p>Messed up metadata</p>
  </li>
  <li>
    <p>Unresponsive browser window (Chrome’s fault probably)</p>
  </li>
  <li>
    <p>Stuttering and low performance when playing 4K H265 10-bit HDR video (had to
manually transcode to H264 8-bit SDR)</p>
  </li>
  <li>
    <p>When attempting to play anything at all, it displays a pop-up “Playback
error - This client isn’t compatible with the media and the server isn’t
sending a compatible media format.” (solved by restarting the browser, still
happening a few times a week as of May 2023)</p>
  </li>
  <li>
    <p>Chrome refuses to directly play 4K H265 10-bit HDR video even though it
reported that <a href="https://github.com/StaZhu/enable-chromium-hevc-hardware-decoding#how-to-verify-hevc-hardware-support-is-enabled">hardware support is
enabled</a></p>
  </li>
  <li>
    <p>Stuck at loading (while I am writing this)</p>
  </li>
</ul>

<p>The issues can be roughly divided into these categories: network, server, and
client. Network issues are very complicated, so let’s focus on the server side
and the client side of the problem.</p>

<h2 id="formats">Formats</h2>

<p>Why can some videos “Direct Play” or “Direct Stream” but others require
“transcoding”? To answer this, one must know something called <a href="https://jellyfin.org/docs/general/clients/codec-support">codec
support</a>.</p>

<p>Many people are familiar with video files with the extensions <code class="language-plaintext highlighter-rouge">mp4</code>, <code class="language-plaintext highlighter-rouge">avi</code>,
<code class="language-plaintext highlighter-rouge">mov</code>, <code class="language-plaintext highlighter-rouge">mkv</code>, <code class="language-plaintext highlighter-rouge">m4v</code>, <code class="language-plaintext highlighter-rouge">webm</code>, <code class="language-plaintext highlighter-rouge">vob</code>, <code class="language-plaintext highlighter-rouge">3gp</code>, <code class="language-plaintext highlighter-rouge">flv</code>, <code class="language-plaintext highlighter-rouge">rmvb</code>, and people that have
used a computer long enough typically experienced the pop-up error
<code class="language-plaintext highlighter-rouge">unsupported video format</code>, which is usually shown when a video player does
not support such video file.  File extensions like <code class="language-plaintext highlighter-rouge">mp4</code> and <code class="language-plaintext highlighter-rouge">mkv</code> are merely
the name of the container of video, audio, and subtitles.  How video or audio
is encoded is another story. A raw video consists of frames of pictures like
analog films.  The pictures become a movie when they are moved/played at a
certain speed, typically about 24 frames per second.  In the digital age,
video formats are specific ways to code/compress video into something a
machine can understand, in other words, 1s and 0s.  Some containers can hold
almost all codecs while others may have limited support for certain formats.</p>

<p><a href="https://en.wikipedia.org/wiki/Codec">Codec is defined as software or hardware that encodes or decodes a data
stream or signal</a>.  Here, sometimes the
term <code class="language-plaintext highlighter-rouge">codec</code> is used loosely referring to media formats.</p>

<h3 id="video-formats-and-codecs">Video formats and codecs</h3>

<p>Typically DVDs use <code class="language-plaintext highlighter-rouge">MPEG-2 Part 2</code> as the main video codec, a.k.a. <code class="language-plaintext highlighter-rouge">H.262</code>, or
simply <code class="language-plaintext highlighter-rouge">MPEG-2</code>.  This is decided by the <a href="https://en.wikipedia.org/wiki/DVD-Video">DVD
standard</a>.</p>

<p>On the other hand, Blu-rays use <code class="language-plaintext highlighter-rouge">MPEG-4 Part 10</code> or <code class="language-plaintext highlighter-rouge">H.264</code> or <a href="https://en.wikipedia.org/wiki/Advanced_Video_Coding">AVC (Advanced
Video Coding)</a>.  This is
by far the most popular video codec, and nearly all video players, (software,
or dedicated Blu-ray playback hardware) support it.</p>

<p>To support 4K UHD on Blu-ray, a newer and more efficient codec was developed,
named <code class="language-plaintext highlighter-rouge">MPEG-H Part 2</code> or <code class="language-plaintext highlighter-rouge">H.265</code> or <a href="https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding">HEVC (High Efficiency Video
Coding)</a>.  It is
able to maintain the same quality while reducing the file size from 25% to 50%
compared to H.264, and it supports
<a href="https://en.wikipedia.org/wiki/High-dynamic-range_television">HDR</a> (High
Dynamic Range video).  HDR has a much larger color range, in other words, it
can display much more color, brightness, and contrast than the old
<a href="https://en.wikipedia.org/wiki/Standard-dynamic-range_video">SDR</a> (Standard
Dynamic Range), which was based on <a href="https://en.wikipedia.org/wiki/Cathode-ray_tube">CRT
display</a>.</p>

<p>However, the organization known as
<a href="https://en.wikipedia.org/wiki/Moving_Picture_Experts_Group">MPEG</a> owns the
MPEG standards and their related patents.  Using these MPEG technologies
commercially requires paying royalties. That is why popular video streaming
platform like <code class="language-plaintext highlighter-rouge">YouTube</code> does not use them.  On the other hand, developers in
the open source community reverse-engineered and released the free tool <code class="language-plaintext highlighter-rouge">x264</code>
and <code class="language-plaintext highlighter-rouge">x265</code>, both are licensed under the terms of <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GNU GPL v2.0 (or
later)</a>, one of the
strongest copyleft licenses in the world.</p>

<p>The above video formats were developed specifically for their implementations
on physical media, like DVD or Blu-ray.  Microsoft published VC1, making it an
open but non-free format that was used on many Blu-ray discs in the earlier
days.</p>

<p>On the other hand, VP8 and VP9, released by Google as open and royalty-free
formats, which are analog to H.264 and H.265 in terms of efficiency, are two
of the three main formats used on YouTube after <a href="https://www.fsf.org/blogs/community/google-free-on2-vp8-for-youtube">it switched from H.264
following the call by Free Software Foundation in an open
letter</a>.
However, a Luxembourg-based company named Sisvel formed patent pools for VP9
(and AV1) laid claims on the patents that allegedly were used in VP9 and
AV1. <a href="https://www.mux.com/blog/did-sisvel-just-catch-aom-with-their-patents-down">Some people suspect that Sisvel is a patent
troll.</a></p>

<p>Alliance for Open Media (AOM), a non-profit organization that later released
the AV1 standard and its <code class="language-plaintext highlighter-rouge">libaom</code> codec under BSD 2-Clause License in 2018,
was formed to create royalty-free media standards to compete with MPEG.
Despite that the patent claims were made and patent licenses were sold, AV1
quickly gained popularity, soon Google enabled streaming AV1 coded contents on
YouTube, many hardware decoders were released by different vendors, and the
desktop GPU vendors Nvidia, AMD, and Intel released their desktop discrete
graphics cards with built-in AV1 hardware encode/decode acceleration, which is
anticipated to be a huge push to the wide adoption of live streaming in AV1
codec.</p>

<p>The members of AOM mainly consist of <a href="https://en.wikipedia.org/wiki/Alliance_for_Open_Media#Operation_and_structure">multi-national
mega-corporations</a>
which are assumed that they want to maximize their profit by switching to open
media formats, but their efforts are met with patent claims by the companies
which are also assumed to maximize their profit. <strong>Ironic.</strong></p>

<p><img src="/assets/ironic.jpg" alt="Ironic" /></p>

<p><em>This is a still picture of the movie Star Wars: Revenge of the Sith (2005),
 where Chancellor Palpatine tallked to Anakin Skywalker at the senate. I do
 not claim its cpoyright.</em></p>

<p>All the above video formats have complete or partial support from various
clients.  In terms of resource consumption when decoding/encoding these
formats, the newer ones are more resource intensive than the older ones.
Decoding should not be a problem on modern computers or phones.  Encoding, on
the other hand, consumes much more CPU resources when using software, less so
using GPU hardware acceleration, depending on the GPU vendor’s
implementations.  Specifically, when encoding in AV1 using software, if the
highest efficiency option is used, a 30-second clip can take as long as 7
hours to encode, which is about hundreds of times slower than H.265.  However,
hardware encoding has its drawback. GPU is fast at doing repetitive work using
the same instructions with multiple data streams, but it trades off picture
quality and the flexibility of configurations for a fast encoding speed.
Software encoding which uses CPU, can offer flexibility and control over the
encoding process and have higher visual quality and reduction in artifacts.</p>

<h3 id="audio-formats-and-codecs">Audio formats and codecs</h3>

<p>Audio on the other hand has a simpler story. Audio streams typically contain
less amount of data compared to video streams.</p>

<p>Pulse-code modulation (PCM), which was used in the days of telegraphy and
telephony before the digital age, is the standard that is most widely used.
Linear pulse-code modulation (LPCM) is a format used in audio files with the
extension <code class="language-plaintext highlighter-rouge">WAV</code> (Waveform Audio File Format).  The compact disc (CD) stores
stereo audio using 44.1 kHz sampling rate and 16-bit resolution audio. It is
also a part of DVD and Blu-ray standards.</p>

<p>However, (L)PCM is uncompressed, so the size of data is considered large and
uneconomic when being transported over network or physical media.</p>

<p>MP3 took over the world with its compact file size while maintaining
reasonable audio fidelity in the internet boom of the 1990s and
2000s. Unfortunately, it was soon associated with music copyright
infringement.</p>

<p>FLAC (Free Lossless Audio Codec), popular among enthusiasts, can compress
audio losslessly. YouTube uses Opus on the platform to reduce the bitrate
using lossy compression and maintain a certain level of audio quality.</p>

<p>DVD and Blu-ray audio mainly use Dolby Digital (AC3), DTS, or their
successors, like EAC3, Dolby TrueHD, Dolby Atmos, DTS-HD MA, DTS:X.</p>

<p>Audio encoding is not very resource intensive comparing to video encoding.</p>

<h3 id="subtitles">Subtitles</h3>

<p>For what matters in Jellyfin, the formats of subtitles can be roughly divided
into two categories: text-based and picture-based.</p>

<p>Text-based subtitles include the popular SubRip Text (SRT) and ASS/SSA. For
picture-based subtitles, VobSub is used on DVD, and PGSSUB is used on Blu-ray.</p>

<p>“Burned-in” subtitles, on the other hand, are permanently embedded into the
video, and they cannot be removed.  This is inconvenient for those who want to
turn off subtitles, thus separate subtitles are more popular, either
text-based or picture-based.</p>

<h1 id="why-do-formats-matter">Why do formats matter</h1>

<p>Transcoding is the process to convert one format to another, and it consumes
more server resources than usual. <a href="https://jellyfin.org/docs/general/clients/codec-support">The goal is to Direct Play all
media.</a> However,
being able to play the video file on one’s PC without transcoding does not
mean it also plays well with streaming.  When the container, video, audio, and
subtitle are all compatible with the client, <code class="language-plaintext highlighter-rouge">Direct Play</code> will happen.  If
the audio, subtitle, or container is incompatible with the client, <code class="language-plaintext highlighter-rouge">Direct
Stream</code> will occur. Direct Stream is a process when only the video is directly
streamed without transcoding.  Audio may be transcoded to AAC format, or be
remuxed (remultiplexed) with video and subtitle to a new container TS, the
container used by DVD.  Transcoding happens when the video format is
incompatible with the client, or when the subtitle is “burned in”.</p>

<p>Jellyfin has a <a href="https://jellyfin.org/docs/general/clients/codec-support">Codec
Table</a> that lists the
codec compatibility in detail.  H.264 with 8-bit color depth is the most
supported video format across all platforms, and it is the format that the
media will be transcoded to by default if transcoding happens. Newer formats
like H.265 and AV1 are not well supported by clients.</p>

<p>As for audio, because transcoding audio is not nearly as resource-intensive,
it is not much of a concern.  Although FLAC is also supported on all clients
listed, Jellyfin transcodes incompatible audio formats to AAC by default.</p>

<p>Subtitles can lead to video transcoding too, if a picture-based subtitle track
is selected or the “force burn in all subtitles” option is enabled, the
subtitle track will be “burned in” to video.  This is the most
resource-intensive scenario because two transcodings happen at the same time,
while the subtitle layer is placed on the video.  PGS and Vob extracted from
Blu-ray and DVD are typically burned in when streaming.  This is the least
desirable situation, and users should choose SRT whenever available, but the
container should be mkv (Matroska, a free media container) for compatibility
if the user chooses not to place the SRT file as an <a href="https://jellyfin.org/docs/general/server/media/external-files">external
file</a>, so the
video, audio, and the SRT subtitle should be muxed (multiplexed) beforehand
using free (libre) tools like <code class="language-plaintext highlighter-rouge">mkvmerge</code> (CLI) and <code class="language-plaintext highlighter-rouge">MKVToolNix</code> (GUI).</p>

<p>Jellyfin uses a custom-built FFmpeg to transcode or remux. FFmpeg is a free
software, a collection of libraries and tools for processing media.  User can
supply their own FFmpeg binary by building from source code or using one of
the pre-built binaries from other developers, but this is not recommended by
Jellyfin, because Jellyfin requires certain build options and libraries to be
enabled for hardware acceleration.</p>

<h1 id="a-note-on-hardware-acceleration">A note on hardware acceleration</h1>

<p>Hardware acceleration is not very easy to <a href="https://jellyfin.org/docs/general/administration/hardware-acceleration/">set
up</a>. The
video quality and performance may not be satisfactory.  AMD GPUs are known to
have less satisfactory performance, and in my case, I can see massive chunks
of green artifacts when watching 4K HDR HEVC contents with HDR -&gt; SDR tone
mapping enabled on Chrome, and the transcoding max out at 27 fps using AMD RX
6600XT.  Intel iGPUs may be better, but the latest Intel Arc dGPU has many
Linux driver issues as it does on Windows, as of mid 2023.</p>

<p>While Intel and AMD GPU can use the open source VAAPI, Nvidia GPU uses a
proprietary video codec API called NVENC/NVDEC, and Nvidia imposes an
artificial limitation of 3 or 5 simultaneous encoding sessions on their
consumer-grade graphics card, 3 or 5 sessions depending on the driver version
used.  This restriction can be bypassed using <a href="https://github.com/keylase/nvidia-patch">an unofficial driver
patch</a>.</p>

<p>GPU transcoding does not require much computational power as gaming does, so a
second-hand or mid-range graphics card with proper codec supports should be
fine if it is exclusively used by Jellyfin.</p>

<!--Copyright 2023, 2024, Jing Luo.

This work is licensed under a [Creative Commons Attribution-ShareAlike 4.0
International license](https://creativecommons.org/licenses/by-sa/4.0/).-->]]></content><author><name></name></author><summary type="html"><![CDATA[Background knowledge]]></summary></entry><entry><title type="html">Archive of Nirvana</title><link href="https://jing.rocks/2023/01/28/archive-of-nirvana.html" rel="alternate" type="text/html" title="Archive of Nirvana" /><published>2023-01-28T00:00:00+09:00</published><updated>2023-01-28T00:00:00+09:00</updated><id>https://jing.rocks/2023/01/28/archive-of-nirvana</id><content type="html" xml:base="https://jing.rocks/2023/01/28/archive-of-nirvana.html"><![CDATA[<h1 id="disclaimer">Disclaimer</h1>

<ol>
  <li>
    <p>The views, information, or opinions expressed in the following contents are
solely of the individuals involved.</p>
  </li>
  <li>
    <p>This page and the files attached come with <strong>ABSOLUTELY NO WARRANTY</strong>.</p>
  </li>
  <li>
    <p>I do NOT claim the copyright of text and source code that are not
originally written by me.</p>
  </li>
</ol>

<h1 id="added-features">Added features</h1>

<p><a href="https://nirvanaweekly-wechat.jing.rocks">WeChat’s service account: a history of Nirvana - 涅槃周刊公众号推
文</a></p>

<p><a href="https://forgejo.jing.rocks/jing/nirvanaweekly-archive">Git repository</a>, which
includes all the pdf files mentioned below. <a href="https://forgejo.jing.rocks/jing/nirvanaweekly-archive/releases">Download the release
here.</a></p>

<h1 id="changelog">Changelog</h1>

<ul>
  <li>
    <p>Jan 14 2024: Migrate from GitHub to <code class="language-plaintext highlighter-rouge">forgejo.jing.rocks</code>. New home. Add
non-free javascript warning. Fix copyright notice.</p>
  </li>
  <li>
    <p>Nov 18 2023: Add a link to release download page. Reformat the file using
Emacs auto-fill-mode. Add permalink.</p>
  </li>
  <li>
    <p>May 17 2023: Reformat the file. Add the URL to the index of nirvana wechat
service account history and its GitHub repo.</p>
  </li>
  <li>
    <p>Jan 28 2023: Fork from original author of <a href="https://web.archive.org/web/20231118040826/https://hackmd.io/@uOwb5ZnlTnWuF0zwmCQ_5Q/B1446O0bX?type=view">the
post</a>.
The pdf preview feature is not working on the original post. Use the <a href="https://forgejo.jing.rocks/jing/nirvanaweekly-archive">Git
repo</a> instead.  <strong>The
original page of the post requires <a href="https://www.gnu.org/philosophy/javascript-trap.html">non-free
Javascript</a> to
function. It is also infested with various web elements that violate users’
privacy. Therefore, I’ve replaced it with a link to the Wayback Machine
instead.</strong></p>
  </li>
</ul>

<h1 id="license">License</h1>

<p>The copyright status of all the works published by <code class="language-plaintext highlighter-rouge">Nirvana weekly</code> is
unknown, since the magazine did not specify such terms and the magazine itself
has been defunct since 2016. See the <code class="language-plaintext highlighter-rouge">README.MD</code> in the Git repository
mentioned above.</p>

<p><strong>ABSOLUTELY NO WARRANTY, not even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE.</strong></p>

<p>Copyright 2023, 2024 Jing Luo. The sections from the top to this line of the
post is licensed under a <a href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0
International License</a>.</p>

<p>==============================================================================</p>

<h1 id="涅槃周刊电子版汇总更新于2019年3月5日">《涅槃周刊》电子版汇总（更新于2019年3月5日）</h1>

<h2 id="前言">前言</h2>

<p>《涅槃周刊》创刊于2009年12月，停刊于2016年6月，共产生五十五期常规刊目与三期特刊、六期年刊，页面下方将提供已整理PDF文件的下载和预览。
如拥有本页缺失刊目（实体版或PDF版）、发现本页内容错误以及有任何意见或建议，请联系：</p>

<blockquote>
  <p>PeterWilliams
微信ID： PeterWilliams0912</p>
</blockquote>

<p>或</p>
<blockquote>
  <p>SMSDATABASE
微信ID： petitlumiere</p>
</blockquote>

<h4 id="smsdatabase项目简介">SMSDatabase项目简介</h4>

<p>SMSDatabase 项目于2018年6月发起，这个项目致力于汇聚深中人的记忆，贡献对于深中的新理解，协助建立新的深中人关联网络。至今，我们已经收到了不少深中人主动共享的电子文件，一些小伙伴也和我们分享了自己对于这个项目发展的看法。目前，这个项目正在慢慢建设起来，我们欢迎更多的深中人添加smsdatabase 的微信号，共享自己留存的关于深中的文件与记忆，我们也更期待大家加入到项目的讨论群中，共同探索对于深中校史的阐述与新关系网络的再建。</p>

<h2 id="鸣谢">鸣谢</h2>

<p>感谢 许振华、阿芜、迪昂流、昆冈、chris、杨小宇、刘衡哲、赖赖儿、吴潮、YY等人对本项目的支持
感谢 SMSDatabase提供人力与技术支援</p>

<p><del>## 注意！！！Attention！！！</del></p>

<p><del>1. 本页面更新于2019年3月5日23：30，上一个更新版本的时间为2019年1月12日19：28，前一个更新版本的时间为2018年8月22日16:21。</del></p>
<ol>
  <li>本页面于2020年12月7日更新，经检查发现百度云链接已失效<del>，推荐使用谷歌网盘进行下载。</del>
<del>3. 推荐使用电脑端浏览本网页。</del>
<del>4. <strong>由于Slideshare的被GFW墙了</strong>，因此设备必须挂载<strong>VPN或ShadowSocks</strong>，页面才能正常显示。</del>
<del>5. 37期与41期的PDF文件和实体刊目均未收集，故只提供纯文字版本。</del>
<del>6. 8月22日版本更新了修复了2013-2014年刊错误。</del>
<del>7. 1月12日的版本更新了特别说明。</del>
<del>8. 3月5日的版本更新了涅槃周刊公众号推文集锦的预览及下载。</del></li>
</ol>

<p><del>## 1月12日关于涅槃周刊公众号的特别说明</del></p>

<p><del>涅槃周刊的公众号自从2017年下半年起被冻结。自微信7.0版本更新后，被冻结公众号的历史推文可以查看，但无法被搜索。</del>
<del>若需要查看涅槃周刊公众号的历史推文，可通过两种方式进行：</del>
<del>1、已关注公众号的微信好友推荐公众号；</del>
<del>2、点击<a href="https://mp.weixin.qq.com/s/daweUYIwSLDQe7OErl_g2A" title="a link">此链接</a>，加载页面后，点击“此账户已冻结”即可进入查看历史推文。</del></p>

<p><del>## 3月5日关于涅槃周刊公众号推文的特别说明</del></p>

<p><del>微信无法关注冻结账号，1月12日提供的方法只能查看最后几篇推文。故本次更新提供预览和下载（HTML版和印象笔记文件）。</del>
<del>1. <涅槃周刊公众号全部推文HTML.rar>下载解压后，打开Html文件即可。</涅槃周刊公众号全部推文HTML.rar></del>
<del>2. <涅槃周刊公众号全部记录.enex>导入印象笔记后即可查看。</涅槃周刊公众号全部记录.enex></del></p>

<p><del>## 下载 （全部文件都在这里）</del></p>

<p><del>百度网盘：https://pan.baidu.com/s/1Tk1FX4tprBcGGduwW5HTgg 密码: zfng</del></p>

<p><del>## 更新日志</del></p>

<p><del>1. 2018年7月15日的版本仅提供预览，不提供下载。</del>
<del>2. 7月17日版本更新了34、35、36期的预览。</del>
<del>3. 7月30日版本更新了末日特刊、学生权利特刊、公共自习室特刊的预览。</del>
<del>4. 7月31日版本更新了22、24、43、47、50-51期的预览及已收集到的所有刊目下载链接。</del>
<del>5. 8月14日版本更新了创刊号的预览及下载。</del>
<del>6. 8月15日版本更新了26、33期的预览及下载。</del>
<del>7. 8月16日0055版本更新了14、17、18-19、25、27、31期的预览及下载。</del>
<del>8. 8月16日2057版本修正了2、3、4、5、6、8、9、10、11、12、13、14、15期在手机端无法显示字库的问题，修正了创刊号的排列方向问题，更新了2011-2012年刊的预览与下载，调整页面结构。</del>
<del>9. 8月16日2203版本新增了所有刊目（包括37、41期）的百度网盘下载链接。</del>
<del>10. 8月17日0831版本修复了一些小BUG。</del>
<del>11. 8月22日版本更新了修复了2013-2014年刊错误。</del>
<del>12. 1月12日的版本更新了特别说明。</del>
<del>13. 3月5日的版本更新了涅槃周刊公众号推文集锦的预览及下载。</del></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Disclaimer]]></summary></entry></feed>