<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Savoir Faire</title>
      <link>https://savoir-faire.neocities.org</link>
      <description>A random collection of writings</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://savoir-faire.neocities.org/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 09 May 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Yes, the Thinkpad is faulty, but I got a new one</title>
          <pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/yes-the-thinkpad-is-faulty-but/</link>
          <guid>https://savoir-faire.neocities.org/posts/yes-the-thinkpad-is-faulty-but/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/yes-the-thinkpad-is-faulty-but/">&lt;h2 id=&quot;my-thinkpad-t14-gen1-was-faulty&quot;&gt;My Thinkpad T14 Gen1 was faulty&lt;&#x2F;h2&gt;
&lt;p&gt;After a &lt;a href=&quot;&#x2F;posts&#x2F;a-bug-or-not-a-bug&#x2F;&quot;&gt;lengthy debugging&lt;&#x2F;a&gt;, that issue returned, I sent the machine back to the seller. Eventually, the machine was faulty and the seller made a full refund to me.&lt;&#x2F;p&gt;
&lt;p&gt;It marked the shortest laptop ownership for my, for less than 90 days. It is such an &lt;em&gt;irony&lt;&#x2F;em&gt;, as I was hoping to have a machine that will last for years.&lt;&#x2F;p&gt;
&lt;p&gt;After receiving the machine, I determined to do some research and eventually, I got another secondhanded machine. Believe it or not, I spent extra 200 loonies (adding the refund) for &lt;em&gt;another Thinkpad T14.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;another-thinkpad-t14-but-this-time-gen2&quot;&gt;Another Thinkpad T14, but this time, Gen2&lt;&#x2F;h2&gt;
&lt;p&gt;Am I stupid? I hope not! This is &lt;strong&gt;Thinkpad T14 Gen2&lt;&#x2F;strong&gt;, with an AMD Ryzen 5 Pro-5650U CPU. Performance should be much better than the previous one. This is also my first AMD machine.&lt;&#x2F;p&gt;
&lt;p&gt;After receiving the machine, I am happy with my deicision. The state is much much better than the last one. You can hardly see any used scratches. The only downside is that the fingerprint reader is missing. Only then I realize it is optional.&lt;&#x2F;p&gt;
&lt;p&gt;But what amaze me is that the machine is equipped with touch screen! I don&#x27;t know that before it arrive. It is not included in the specification.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted a touch screen for my T14 Gen1, but it was pricey. Now, I own one! Thank you God.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;first-thing-first-fedora-first&quot;&gt;First thing first, Fedora first&lt;&#x2F;h2&gt;
&lt;p&gt;After using the preinstalled Windows 11 to upgrade some firmware of the machine. I then remove it entirely and install my favourite Fedora. Now Fedora 44.&lt;&#x2F;p&gt;
&lt;p&gt;My workflow resumes, the excellent typing experience returns. Life can be good.&lt;&#x2F;p&gt;
&lt;p&gt;Gardening season is busy. Spring is the best time of the year.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A bug or not a bug, that&#x27;s the question.</title>
          <pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/a-bug-or-not-a-bug/</link>
          <guid>https://savoir-faire.neocities.org/posts/a-bug-or-not-a-bug/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/a-bug-or-not-a-bug/">&lt;p&gt;Follow up on my &lt;a href=&quot;&#x2F;posts&#x2F;thinkpad-already-faulty&quot;&gt;Thinkpad&#x27;s fan and cpu temperature sensor issue&lt;&#x2F;a&gt;, &lt;strong&gt;it suddenly works now.&lt;&#x2F;strong&gt; The computer is able to detect the actual cpu temperature.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ sensors

thinkpad-isa-0000
Adapter: ISA adapter
fan1:           0 RPM
CPU:          +42.0°C
GPU:              N&#x2F;A  
temp3:        +32.0°C  
temp4:         +0.0°C  
temp5:        +42.0°C  
temp6:        +42.0°C  
temp7:        +42.0°C  
temp8:            N&#x2F;A  

# and the following was the old result:

thinkpad-isa-0000
Adapter: ISA adapter 
fan1: 4256 RPM 
CPU: N&#x2F;A 
GPU: N&#x2F;A 
temp3: +27.0°C 
temp4: +0.0°C 
temp5: N&#x2F;A 
temp6: N&#x2F;A 
temp7: N&#x2F;A 
temp8: N&#x2F;A

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I again do some research and the result is different, it seems that the sensor is not in fault. But the EC firmware issue, it might intermittently give bad signal or it might be some sort of bug.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t know. I am not &lt;em&gt;that&lt;&#x2F;em&gt; savvy.&lt;&#x2F;p&gt;
&lt;p&gt;But anyway, let&#x27;s continue to monitor the issue. Hope that the problem won&#x27;t return.&lt;&#x2F;p&gt;
&lt;p&gt;I reflashed the BIOS (going back one version, and reflash the new version), as it might help to correct the logic. So far so good.&lt;&#x2F;p&gt;
&lt;p&gt;I love the machine, I hope it can last &lt;em&gt;forever.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Well... My Thinkpad is already faulty</title>
          <pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/thinkpad-already-faulty/</link>
          <guid>https://savoir-faire.neocities.org/posts/thinkpad-already-faulty/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/thinkpad-already-faulty/">&lt;h2 id=&quot;one-month-of-use-and-it-is-already-faulty&quot;&gt;One month of use and it is already faulty&lt;&#x2F;h2&gt;
&lt;p&gt;I got a used Thinkpad T14 in &lt;a href=&quot;&#x2F;posts&#x2F;its-the-age-to-use-a-thinkpad&quot;&gt;early February this year&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I must admit, the machine is superb: &lt;em&gt;excellent keyboard, screen is good, sound quality acceptable&lt;&#x2F;em&gt; (honestly, the MacBook&#x27;s speaker is really a dark magic).&lt;&#x2F;p&gt;
&lt;p&gt;But the build quality is... a bit unlucky in it.&lt;&#x2F;p&gt;
&lt;p&gt;The machine I got was a used machine. After a month of usage, I realized when I open the lid and restore from sleep, the fan was spinning really fast. The CPU itself is not hot at all, at most 40 degrees Celsius. In the diagnosis tool, the CPU temperature is normal, but the one linked to fan speed has shown the temperature to be 128 degrees Celsius, which is a very problematic value.&lt;&#x2F;p&gt;
&lt;p&gt;In the early stage, when I closed the lid and reopened it, it would resume to normal. But the issue went south. The fan would turn really fast at 4000+ rpm even in the BIOS stage. Given that I had the newest BIOS installed. It was showing some signs of hardware failure.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;debugging-with-ai-leads-to-sad-conclusion&quot;&gt;Debugging with Ai leads to sad conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;I then had a long conversation with ChatGPT and other Ai tools. They told me to try the following things:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Update BIOS to the newest version&lt;&#x2F;li&gt;
&lt;li&gt;Perform a reset by pressing the reset button at the bottom of the machine&lt;&#x2F;li&gt;
&lt;li&gt;Toggle the disconnect battery option in BIOS and press the power button for a minute to drain the charge&lt;&#x2F;li&gt;
&lt;li&gt;These are to make sure the EC memory is refreshed and hope that the machine can regain proper reading&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;All those attempts failed. Ai concluded that the machine&#x27;s sensor or chip is problematic, and there&#x27;s no software way to bypass the issue. I should either live with the spinning fan (of course the persistent high speed could result in a premature wear-out), or repair the machine.&lt;&#x2F;p&gt;
&lt;p&gt;I sent the message to the seller, hoping that they will reply to me. Their shop description claimed that they would honour a 90-day labour and parts. See how it goes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;an-irony-to-my-thoughts-on-the-repairability-and-durability&quot;&gt;An irony to my thoughts on the repairability and durability&lt;&#x2F;h2&gt;
&lt;p&gt;Sigh... What an irony when reading my previous posts:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am being attracted by Thinkpads. &lt;em&gt;Repairability, durability&lt;&#x2F;em&gt;, usability, able to run Linux properly, and most importantly, cheap and available in the second-hand market.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I cannot repair that faulty sensor (need to replace the whole motherboard, which costs the same as the machine itself), and it is not durable (OK, I will accept my machine is already 5 years old when I get it).&lt;&#x2F;p&gt;
&lt;p&gt;I must say, most PC companies cannot make really durable hardware. Even Thinkpads, I know most people will say the Thinkpad nowadays is the Lenovo Thinkpad, not the IBM&#x27;s. But I owned quite a few Apple devices, laptops, phones, and iPads. They are built to last. I never encountered any hardware failure when using them, perhaps, except for the consumable battery parts.&lt;&#x2F;p&gt;
&lt;p&gt;I love the philosophy of Thinkpads. But I am confused now, should I get another used one? New ones are pricey. Or perhaps, could the new MacBook Neo suit me? Not sure. I really love the Fedora ecosystem.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Make sure KDE Okular can open pdf files in webdav directories</title>
          <pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/kde-okular-open-pdf-webdav/</link>
          <guid>https://savoir-faire.neocities.org/posts/kde-okular-open-pdf-webdav/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/kde-okular-open-pdf-webdav/">&lt;p&gt;For webdav directories mounted by Dolphin, the flatpak version Okular cannot open it correctly but Brave can.&lt;&#x2F;p&gt;
&lt;p&gt;To fix this problem, we can use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;flathub&#x2F;org.kde.gwenview&#x2F;issues&#x2F;190&quot;&gt;this workaround&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It is a bit tricky when using Fedora Atomic. Here is the proper way of doing it.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;flatpak&#x2F;app&#x2F;org.kde.okular&#x2F;current&#x2F;active&#x2F;export&#x2F;share&#x2F;applications&#x2F;&lt;&#x2F;code&gt; and copy &lt;code&gt;org.kde.okular.desktop&lt;&#x2F;code&gt; to &lt;code&gt;&#x2F;home&#x2F;user&#x2F;.local&#x2F;share&#x2F;applications&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Edit &lt;code&gt;org.kde.okular.desktop&lt;&#x2F;code&gt;, revise &lt;code&gt;Exec=&#x2F;usr&#x2F;bin&#x2F;flatpak run --branch=stable --arch=x86_64 --command=okular --file-forwarding org.kde.okular @@u %U @@&lt;&#x2F;code&gt; to &lt;code&gt;Exec=&#x2F;usr&#x2F;bin&#x2F;flatpak run --branch=stable --arch=x86_64 --command=okular --file-forwarding org.kde.okular @@u %F @@&lt;&#x2F;code&gt;. Note the &lt;em&gt;&lt;code&gt;%F&lt;&#x2F;code&gt;&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Save the file. Revise the pdf opening property, point the desktop file to the revised one.&lt;&#x2F;li&gt;
&lt;li&gt;Then it is done.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>Enable Brave Swipe Gesture in KDE</title>
          <pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/enable-brave-swipe-gesture-kde/</link>
          <guid>https://savoir-faire.neocities.org/posts/enable-brave-swipe-gesture-kde/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/enable-brave-swipe-gesture-kde/">&lt;p&gt;We commonly use 2 fingers to swipe across browser pages.&lt;&#x2F;p&gt;
&lt;p&gt;Under Fedora KDE, Firefox has this function working, but &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;brave.com&#x2F;linux&#x2F;&quot;&gt;Brave&lt;&#x2F;a&gt; is not working by default. This is how to enable that:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you are using Wayland for Brave.&lt;&#x2F;li&gt;
&lt;li&gt;Copy the &lt;code&gt;.desktop&lt;&#x2F;code&gt; file for Brave to a new location: &lt;code&gt;cp &#x2F;usr&#x2F;share&#x2F;applications&#x2F;brave-browser.desktop ~&#x2F;.local&#x2F;share&#x2F;applications&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Edit the copied file, locate lines starting with &lt;code&gt;Exec=&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Append the feature flag to every &lt;code&gt;Exec=&lt;&#x2F;code&gt; lines with &lt;code&gt;--enable-features=TouchpadOverscrollHistoryNavigation&lt;&#x2F;code&gt;:&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre&gt;&lt;code&gt;# Then it looks like this

Exec=&#x2F;usr&#x2F;bin&#x2F;brave-browser-stable %U --enable-features=TouchpadOverscrollHistoryNavigation

Exec=&#x2F;usr&#x2F;bin&#x2F;brave-browser-stable --enable-features=TouchpadOverscrollHistoryNavigation

Exec=&#x2F;usr&#x2F;bin&#x2F;brave-browser-stable --incognito --enable-features=TouchpadOverscrollHistoryNavigation
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Save the file, and run &lt;code&gt;update-desktop-database ~&#x2F;.local&#x2F;share&#x2F;applications&lt;&#x2F;code&gt; to refresh the desktop file.&lt;&#x2F;li&gt;
&lt;li&gt;Enable natural scrolling direction by enabling &lt;code&gt;System Settings &amp;gt; Mouse and Touchpad &amp;gt; Touchpad &amp;gt; Scrolling &amp;gt; Invert scroll direction (Natural scrolling)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Then it is done. Brave swipe function works nicely.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>How to configure Fcitx Rime Cantonese on Fedora Kinoite</title>
          <pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/fcitx-rime-cantonese-fedora-atomic/</link>
          <guid>https://savoir-faire.neocities.org/posts/fcitx-rime-cantonese-fedora-atomic/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/fcitx-rime-cantonese-fedora-atomic/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rime.im&quot;&gt;Rime&lt;&#x2F;a&gt; is the best IME on Linux. The official installation script for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rime&#x2F;rime-cantonese&quot;&gt;Cantonese Jyutping&lt;&#x2F;a&gt; does not include Fedora Kinoite (KDE Atomic Version).&lt;&#x2F;p&gt;
&lt;p&gt;Here are the proper steps of installation:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;fcitx 5&lt;&#x2F;code&gt; and &lt;code&gt;rime for fcitx 5&lt;&#x2F;code&gt; in Discover with flatpak enabled.&lt;&#x2F;li&gt;
&lt;li&gt;Download the newest version of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rime&#x2F;rime-cantonese&#x2F;archive&#x2F;refs&#x2F;heads&#x2F;main.zip&quot;&gt;&lt;code&gt;rime-cantonese&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Go to &lt;code&gt;~&#x2F;.var&#x2F;app&#x2F;org.fcitx.Fcitx5&#x2F;data&#x2F;fcitx5&#x2F;rime&#x2F;&lt;&#x2F;code&gt; You may delete the files there if you don&#x27;t use other schemas.&lt;&#x2F;li&gt;
&lt;li&gt;Unzip the content of &lt;code&gt;rime-cantonese&lt;&#x2F;code&gt; to the above directory.&lt;&#x2F;li&gt;
&lt;li&gt;Create a &lt;code&gt;default.custom.yaml&lt;&#x2F;code&gt; with the following content. Save it, redeploy it. And it is done.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre&gt;&lt;code&gt;# default.custom.yaml
patch:
  # Candidate page size
  &amp;quot;menu&#x2F;page_size&amp;quot;: 9

  # Only enable jyutping schema
  schema_list:
    - schema: jyut6ping3

  # Do NOT force ascii mode to English
  # Let Fcitx handle English switching instead
  &amp;quot;switches&#x2F;@0&#x2F;reset&amp;quot;: 0
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>How to add posteo.de account on gnome</title>
          <pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/posteo-gnome-account/</link>
          <guid>https://savoir-faire.neocities.org/posts/posteo-gnome-account/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/posteo-gnome-account/">&lt;p&gt;There&#x27;s no existing tutorial on how to add &lt;a href=&quot;https:&#x2F;&#x2F;savoir-faire.neocities.org&#x2F;posts&#x2F;posteo-gnome-account&#x2F;posteo.de&quot;&gt;posteo.de&lt;&#x2F;a&gt; caldav and cardav account on gnome yet.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s the simple configuration:&lt;&#x2F;p&gt;
&lt;p&gt;Go to &lt;code&gt;Settings -&amp;gt; Online Accounts -&amp;gt; Calendar, Contacts and Files&lt;&#x2F;code&gt;. You need to add the calendar and contacts separately.&lt;&#x2F;p&gt;
&lt;p&gt;Say if you have an email &lt;code&gt;john.example@posteo.net&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;For Calendar:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;Server Address: https:&#x2F;&#x2F;posteo.de:8443&#x2F;calendars
Username: john.example
Password: [your password]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For Contacts:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;Server Address: https:&#x2F;&#x2F;posteo.de:8843&#x2F;addressbooks
Username: john.example
Password: [your password]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then you are good to go.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Logitech, C&#x27;Mon, get better!</title>
          <pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/logitech-cmon-get-better/</link>
          <guid>https://savoir-faire.neocities.org/posts/logitech-cmon-get-better/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/logitech-cmon-get-better/">&lt;p&gt;I have been using Logitech&#x27;s device for more than a decade, before that, mice are wired and with the balls inside. They were made indestrutable.&lt;&#x2F;p&gt;
&lt;p&gt;Logitech made good devices, at least in the past. I remembered my M331 mouse were so quiet and nice to touch to the point that I brought two at the same time.&lt;&#x2F;p&gt;
&lt;p&gt;It turned out be a wise decision, as they discontinued M331, replaced it with M330. I don&#x27;t like M330, it is simply a even cheaper version of M331 that does not support Unifying protocol. M331 supports it. I know that the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Logitech_Unifying_receiver#Security&quot;&gt;Unifying protocol is flawed&lt;&#x2F;a&gt; and Logitech is fading out from Unifying.&lt;&#x2F;p&gt;
&lt;p&gt;But having one USB dongle to connect to many peripherals is a marvelous invention. I personally don&#x27;t like Bluetooth, its stability is still not comparable to any dongled mouse.&lt;&#x2F;p&gt;
&lt;p&gt;A year ago, I tried to get a M720 mouse from Logitech, which claims to support both Bluetooth and Unifying. It also has two extra buttons for customizations. Seems perfect to me.&lt;&#x2F;p&gt;
&lt;p&gt;Not long after using the mouse, it started to have double clicking issues, and it made it impossible to drag reliably. The scrolll wheel was not very sold.&lt;&#x2F;p&gt;
&lt;p&gt;I researched a bit online, and the issue was in fact a common issue. They used cheap click buttons. Honestly, these buttons are cheap already, and they decided to use even cheaper click buttons.&lt;&#x2F;p&gt;
&lt;p&gt;Not only the hardware qulity deteriorates, the software is getting bulkier than before. There are many memes about the ram used by Logitech&#x27;s Option+ software.&lt;&#x2F;p&gt;
&lt;p&gt;Get better, Logitech. You can make better (and durable) products.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>It&#x27;s the age to use a Thinkpad</title>
          <pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/its-the-age-to-use-a-thinkpad/</link>
          <guid>https://savoir-faire.neocities.org/posts/its-the-age-to-use-a-thinkpad/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/its-the-age-to-use-a-thinkpad/">&lt;p&gt;I owned three laptops, and used more than that.&lt;&#x2F;p&gt;
&lt;p&gt;My workplace has provided two to me:&lt;&#x2F;p&gt;
&lt;p&gt;Crappy HP
A better Lenovo Thinkbook
But my first personal laptop was a 2012 Macbook Pro. My mum brought that to me, it was a fortune for my family. I am grateful to have my mum.&lt;&#x2F;p&gt;
&lt;p&gt;A Macbook really changed my workflow, I can use a more fancy Keynote to make presentations in the university. It was good. Having a Macbook was a status at that time.&lt;&#x2F;p&gt;
&lt;p&gt;That Macbook was really durable, I knew many classmates that owned cheaper Windows laptops, they were all broken long before my Macbook Pro. (That Macbook is still working.)&lt;&#x2F;p&gt;
&lt;p&gt;I adored that keyboard, it was a good typing experience.&lt;&#x2F;p&gt;
&lt;p&gt;The biggest problem of that machine was the weight, it weighted a lot. It was quite a burden for me to carry it to school every day. I decided to use more paper and pen, only carried my partner to the school when I wanted to stay in the library and wrote assignments.&lt;&#x2F;p&gt;
&lt;p&gt;So after I got into workplace, I needed a new laptop, then I was determined to get another Macbook. That was 2018. Well, those fancy Macbook Pro - with butterfly keyboards.&lt;&#x2F;p&gt;
&lt;p&gt;That typing experience was a terrible, but I was lucky, the keyboard lasted for about 8 years. I mostly used external keyboard and mouse, that could be the reason why that keyboard lasted for some time. Still, I was able to make quite a few impressive presentations, documents. I still love that Macbook Pro.&lt;&#x2F;p&gt;
&lt;p&gt;I changed some jobs, I no longer need to make good looking documents to impress others. And that Macbook Pro&#x27;s keyboard is dying. Double-clicking has become a terrible issue, and the battery is almost at its end of life.&lt;&#x2F;p&gt;
&lt;p&gt;I tried to use Chromebook as replacement, as ads say Chromebooks were secure, fast and cheap. I owned a Samsung Chromebook Plus V2 (2018), it was secure, but slow, and not that cheap if you think deeply.&lt;&#x2F;p&gt;
&lt;p&gt;I have spent a lot of time to &lt;a href=&quot;&#x2F;posts&#x2F;why_chromeos_can_never_be_a_good_os&quot;&gt;discuss the problems of Chromebooks&lt;&#x2F;a&gt;. I want to get rid of that closed ecosystem. I want to de-google.&lt;&#x2F;p&gt;
&lt;p&gt;Then I need to get another laptop, a cheaper used laptop.&lt;&#x2F;p&gt;
&lt;p&gt;I am being attracted by Thinkpads. Repairability, durability, usability, able to run Linux properly, and most importantly, cheap and available in second hand market.&lt;&#x2F;p&gt;
&lt;p&gt;I brought a T480, often praised to be the most repairable Thinkpads. But the shop sent me a T14 Gen1. Well, It was good enough for me. I decided not to force them to get me a T480.&lt;&#x2F;p&gt;
&lt;p&gt;Life is full of surprise, why not keeping a 2020 T14? It can be better than a 2018 T480? I want to move on from 2018. 2020 is the way.&lt;&#x2F;p&gt;
&lt;p&gt;And it is good.&lt;&#x2F;p&gt;
&lt;p&gt;I can get my Fedora Linux running on it smoothly, the typing experience is good.&lt;&#x2F;p&gt;
&lt;p&gt;More importantly, I realize it is not the technology that force me the change, but my own age.&lt;&#x2F;p&gt;
&lt;p&gt;Age has changed my aesthetic, my preference, my priority.&lt;&#x2F;p&gt;
&lt;p&gt;I need something cheaper (a nicer word is economical), durable, and low-key. I am no longer a fancy guy.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t need the machine to make something to surprise someone, but just to meet my need.&lt;&#x2F;p&gt;
&lt;p&gt;Am I happy with my Thinkpad T14? Yes. I am happy with my choice.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2 billion people don&#x27;t actually own their WhatsApp conversations</title>
          <pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/2-billion-people-dont-actually-own-their-whatsapp/</link>
          <guid>https://savoir-faire.neocities.org/posts/2-billion-people-dont-actually-own-their-whatsapp/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/2-billion-people-dont-actually-own-their-whatsapp/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;For many people, WhatsApp is their most valuable asset on mobile phone. Countless people rely on it for everyday conversation. Yet, these user generated data, can never be properly owned by its user.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Released in 2013, in less than a decade&#x27;s time, WhatsApp successfully built a user base of 2 billion people. It is undoubtedly one of the most successful instant messaging tool ever. WhatsApp supported a wide range of OS, it once supported Windows Phone, Symbian and Blackberry (feeling nostalic when listing out these names).&lt;&#x2F;p&gt;
&lt;p&gt;However, for years, the backup and migration tool of WhatsApp failed to meet the expectation of its users.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The conversation on WhatsApp is the created by the user, it should be the assets of its user.&lt;&#x2F;strong&gt; But it was very difficult for users to really own the conversation.&lt;&#x2F;p&gt;
&lt;p&gt;There are three points I will discuss here: &lt;em&gt;&lt;strong&gt;migrate, backup, export.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;difficult-when-migrating-across-different-platforms-well-there-s-only-two&quot;&gt;Difficult when migrating across different platforms (well, there&#x27;s only two)&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Cross platform conversation migration service only started this year.&lt;&#x2F;strong&gt; It was 9 years after it&#x27;s initial release! And at this stage, it is still limited to certain modals of phone. For many users, if they would like to change their Android phone to an iPhone, or vice versa, they have to rely on third party applications to do the migration, and the success rate is not high.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;your-backup-is-not-yours&quot;&gt;Your backup is not yours&lt;&#x2F;h2&gt;
&lt;p&gt;Backup is another problem, WhatsApp is the modern version of letters (even though most of the conversations may not be as valuable as written letters, but there must be some very valuable conversations). There are many court cases that rely on some WhatsApp conversations as proof of evidence. For many people, WhatsApp conversation is the most private asset on their phone.&lt;&#x2F;p&gt;
&lt;p&gt;And WhatsApp restricted the backup to only three methods: on Android, backup to Google Drive, or if you are still lucky enough to have a SD card slot, you can backup to SD card. On iOS, sorry you have to rely on that 5GB backup space on iCloud. (More than 5GB? Pay for more space!)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Why can&#x27;t I backup MY conversation on MY device, such as a Web-dav supported NAS?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I previously changed my phone, from Android to iOS. Accumulated for years of WhatsApp conversations, there are many valuable memories, both good and bad. I want to keep that, for it is a part of my history.&lt;&#x2F;p&gt;
&lt;p&gt;As I was not being able to transfer the conversation to iOS at that time, I investigated many methods to retain those WhatsApp conversations and make it accessible.&lt;&#x2F;p&gt;
&lt;p&gt;The outcome was brutal, it was hard. I need to root my phone, obtain the secret key to get access to the backup database by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;andreas-mausch&#x2F;whatsapp-viewer&quot;&gt;using this nice little tool&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;But for my iOS WhatsApp conversation (not to mention my older Windows Phone conversations). Sigh... no good solution.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;40-000-message-limit-for-export-are-you-serious&quot;&gt;40,000 message limit for export? Are you serious?&lt;&#x2F;h2&gt;
&lt;p&gt;Finally, export. We can export some conversation to a txt document. It is said that:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;When exporting with media, you can send up to 10,000 latest messages. Without media, you can send 40,000 messages. These constraints are due to &lt;strong&gt;maximum email sizes.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I am not sure the limit was because of the internal data structure (if you can access the internal database, you will realize the conversation is a bunch of small emails).&lt;&#x2F;p&gt;
&lt;p&gt;But if &lt;em&gt;maximum email sizes&lt;&#x2F;em&gt; is referring to export conversation and send as an email attachment, then it was another very problematic behavior. We have plenty of methods transferring data from your phone to computer. A 25 MB limit should be something in the last century.&lt;&#x2F;p&gt;
&lt;p&gt;How come such a popular application does not support such a basic function? &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;telegram.org&#x2F;blog&#x2F;export-and-more?setln=es&quot;&gt;Telegram&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.signal.org&#x2F;hc&#x2F;en-us&#x2F;articles&#x2F;360007059752-Backup-and-Restore-Messages&quot;&gt;Signal (does not support iOS &amp;lt;-&amp;gt; Android yet&lt;&#x2F;a&gt;, or even &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ubackup.com&#x2F;data-recovery-phone&#x2F;backup-restore-wechat-chat-history-8975.html&quot;&gt;WeChat (sadly, it was the best, as it provides various types of export methods)&lt;&#x2F;a&gt; offers a nice solution on backup &#x2F; export.&lt;&#x2F;p&gt;
&lt;p&gt;Please! WhatsApp! Make your migrate &#x2F; backup &#x2F; export function more accessible and fully functional! You are worth USD 19 billion! Your parent company Meta can export Facebook &#x2F; Instagram&#x27;s data into a fairly accessible format. Why can&#x27;t you do that.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Memos - Moving attachements from database to local</title>
          <pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/memos-moving-attachements-from-database-to-local/</link>
          <guid>https://savoir-faire.neocities.org/posts/memos-moving-attachements-from-database-to-local/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/memos-moving-attachements-from-database-to-local/">&lt;p&gt;I want to move the attachements stored in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.usememos.com&#x2F;&quot;&gt;memos&lt;&#x2F;a&gt; database back to local storage. Here are the steps:&lt;&#x2F;p&gt;
&lt;p&gt;Install mysql on local machine:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;pip install mysql-connector-python&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Configure the MariaDB host, so that it can be accessed from local machine:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;# &#x2F;mnt&#x2F;user&#x2F;appdata&#x2F;mariadb&#x2F;config&#x2F;mysqld.cnf

[mysqld]
bind-address = 0.0.0.0
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then use this code:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;import mysql.connector
from mysql.connector import Error
import os
from datetime import datetime
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h1 id=&quot;database-connection-parameters&quot;&gt;Database connection parameters&lt;&#x2F;h1&gt;
&lt;pre&gt;&lt;code&gt;config = {
    &amp;#39;host&amp;#39;: &amp;#39;192.168.1.100&amp;#39;,
    &amp;#39;database&amp;#39;: &amp;#39;memosdb&amp;#39;,
    &amp;#39;user&amp;#39;: &amp;#39;user&amp;#39;,
    &amp;#39;password&amp;#39;: &amp;#39;password&amp;#39;
}

def export_blobs_to_files():
    try:
        # Establish a connection to the database
        connection = mysql.connector.connect(**config)
        cursor = connection.cursor()

        # Query to fetch blob data
        query = &amp;quot;&amp;quot;&amp;quot;
            SELECT `id`, `filename`, `blob`, `created_ts`
            FROM `resource`
            WHERE `blob` IS NOT NULL
        &amp;quot;&amp;quot;&amp;quot;
        cursor.execute(query)
        records = cursor.fetchall()

        for record in records:
            id, filename, blob, created_ts = record
            print(f&amp;quot;Processing record ID: {id}&amp;quot;)

            # If created_ts is already a datetime object, no need to convert it
            if isinstance(created_ts, datetime):
                created_date = created_ts
            else:
                # If it&amp;#39;s a string, convert it to datetime
                created_date = datetime.strptime(created_ts, &amp;#39;%Y-%m-%d %H:%M:%S&amp;#39;)

            # Extract year and month from created timestamp
            year = created_date.year
            month = created_date.month

            # Create directory structure based on created timestamp
            dir_path = f&amp;quot;{year}&#x2F;{month:02d}&amp;quot;
            os.makedirs(dir_path, exist_ok=True)

            # Construct the full file path
            file_path = f&amp;quot;{dir_path}&#x2F;{int(created_date.timestamp())}_{filename}&amp;quot;

            # Write blob content to file
            with open(file_path, &amp;#39;wb&amp;#39;) as file:
                file.write(blob)

            print(f&amp;quot;Blob exported to: {file_path}&amp;quot;)

    except Error as e:
        print(f&amp;quot;Error occurred during blob export: {e}&amp;quot;)
    except Exception as e:
        print(f&amp;quot;Unexpected error during blob export: {e}&amp;quot;)
    finally:
        if &amp;#39;connection&amp;#39; in locals():
            connection.close()

def update_database_references():
    try:
        # Establish a connection to the database
        connection = mysql.connector.connect(**config)
        cursor = connection.cursor()

        # Query to fetch records with blob data
        query = &amp;quot;&amp;quot;&amp;quot;
            SELECT `id`, `filename`, `created_ts`
            FROM `resource`
            WHERE `blob` IS NOT NULL
        &amp;quot;&amp;quot;&amp;quot;
        cursor.execute(query)
        records = cursor.fetchall()

        for record in records:
            id, filename, created_ts = record
            print(f&amp;quot;Processing record ID: {id}&amp;quot;)

            # If created_ts is already a datetime object, no need to convert it
            if isinstance(created_ts, datetime):
                created_date = created_ts
            else:
                # If it&amp;#39;s a string, convert it to datetime
                created_date = datetime.strptime(created_ts, &amp;#39;%Y-%m-%d %H:%M:%S&amp;#39;)

            # Extract year and month from created timestamp
            year = created_date.year
            month = created_date.month

            # Construct the file path
            file_path = f&amp;quot;assets&#x2F;{year}&#x2F;{month:02d}&#x2F;{int(created_date.timestamp())}_{filename}&amp;quot;

            # Update the database to reference the local file
            update_query = &amp;quot;&amp;quot;&amp;quot;
                UPDATE `resource`
                SET `storage_type` = &amp;#39;LOCAL&amp;#39;, `reference` = %s, `blob` = NULL
                WHERE `id` = %s
            &amp;quot;&amp;quot;&amp;quot;
            cursor.execute(update_query, (file_path, id))
            connection.commit()

            print(f&amp;quot;Updated record ID: {id} with file path: {file_path}&amp;quot;)

    except Error as e:
        print(f&amp;quot;Error occurred during database update: {e}&amp;quot;)
    except Exception as e:
        print(f&amp;quot;Unexpected error during database update: {e}&amp;quot;)
    finally:
        if &amp;#39;connection&amp;#39; in locals():
            connection.close()

if __name__ == &amp;quot;__main__&amp;quot;:
    export_blobs_to_files()
    update_database_references()
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then move the folders to &#x2F;mnt&#x2F;user&#x2F;appdata&#x2F;memos&#x2F;assets. And it should be done.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Zigbee waterflow meter for Clack valve using ESP32-C6</title>
          <pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/zigbee-waterflow-meter-for-clack-valve-using-esp32c6/</link>
          <guid>https://savoir-faire.neocities.org/posts/zigbee-waterflow-meter-for-clack-valve-using-esp32c6/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/zigbee-waterflow-meter-for-clack-valve-using-esp32c6/">&lt;p&gt;This is a personal project, based on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;community.home-assistant.io&#x2F;t&#x2F;water-softener-clack-ws1-consumed-m3-liter-monitoring&#x2F;281666&#x2F;39&quot;&gt;this tutorial&lt;&#x2F;a&gt; and Ai aid.&lt;&#x2F;p&gt;
&lt;p&gt;I am using this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.espressif.com&#x2F;projects&#x2F;esp-dev-kits&#x2F;en&#x2F;latest&#x2F;esp32c6&#x2F;esp32-c6-devkitm-1&#x2F;index.html&quot;&gt;ESP32-C6 Development Kit&lt;&#x2F;a&gt; and Arduino IDE.&lt;&#x2F;p&gt;
&lt;p&gt;Arduino IDE settings:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;USB CDC On Boot: &amp;quot;Enabled&amp;quot;
CPU Frequency: &amp;quot;160MHz (WiFi)&amp;quot;
Core Debug Level: &amp;quot;None&amp;quot;
Erase All Flash Before Sketch Upload: &amp;quot;Disabled&amp;quot;
Flash Frequency: &amp;quot;80MHz&amp;quot;
Flash Mode: &amp;quot;QIO&amp;quot;
Flash Size: &amp;quot;4MB (32Mb)&amp;quot;
JTAG Adapter: &amp;quot;Disabled&amp;quot;
Partition Scheme: &amp;quot;Zigbee 4MB with spiffs&amp;quot;
Upload Speed: &amp;quot;115200&amp;quot;
Zigbee Mode: &amp;quot;Zigbee ED (end device)&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It will do the following:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;LED is red prior to connecting to Zigbee, it turns green when connected&lt;&#x2F;li&gt;
&lt;li&gt;LED will blink when PIN 10 reads some pulses&lt;&#x2F;li&gt;
&lt;li&gt;Pin 10 will read the pulse from the Clack WS-1 meter and calculate the water usage, unit is Litre&lt;&#x2F;li&gt;
&lt;li&gt;It will report the data via Zigbee, to be used on Home Assistant&lt;&#x2F;li&gt;
&lt;li&gt;It will save the reading to the ESP32-C6 board, treated like a real water meter.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;code&quot;&gt;Code&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;Preferences.h&amp;gt;
#include &amp;quot;Zigbee.h&amp;quot;

#define WATER_PIN 10
#define PULSES_PER_LITER 17
#define FLOW_SENSOR_ENDPOINT_NUMBER 10

#define SAVE_INTERVAL 1800000  &#x2F;&#x2F; 30 minutes in milliseconds
#define REPORT_INTERVAL 60000  &#x2F;&#x2F; 1 minute in milliseconds
#define ZIGBEE_WATCHDOG_TIMEOUT 7200000  &#x2F;&#x2F; 2 hours in milliseconds

#define RGB_BRIGHTNESS 50

Preferences preferences;

int pulseCount = 0;
float totalLiters = 0.0;
float lastSavedLiters = 0.0;
bool isLowVoltage = true;
bool isConnected = false;
uint32_t lastReportTime = 0;
uint32_t lastSaveTime = 0;
uint32_t lastZigbeeReportTime = 0;

ZigbeeFlowSensor zbFlowSensor(FLOW_SENSOR_ENDPOINT_NUMBER);

void setLEDColor(uint8_t red, uint8_t green, uint8_t blue) {
#ifdef RGB_BUILTIN
  rgbLedWrite(RGB_BUILTIN, red, green, blue);
#endif
}

void saveToNVS() {
  preferences.putFloat(&amp;quot;totalLiters&amp;quot;, totalLiters);
  lastSavedLiters = totalLiters;
  Serial.printf(&amp;quot;💾 Saved to NVS: %.3f L\n&amp;quot;, totalLiters);
}

void loadFromNVS() {
  totalLiters = preferences.getFloat(&amp;quot;totalLiters&amp;quot;, 0.0);
  lastSavedLiters = totalLiters;
  Serial.printf(&amp;quot;🔄 Loaded from NVS: %.3f L\n&amp;quot;, totalLiters);
}

void setup() {
  Serial.begin(115200);
  pinMode(WATER_PIN, INPUT_PULLUP);

  preferences.begin(&amp;quot;water_meter&amp;quot;, false);
  loadFromNVS();

  setLEDColor(RGB_BRIGHTNESS, 0, 0);  &#x2F;&#x2F; Red during setup

  zbFlowSensor.setManufacturerAndModel(&amp;quot;Espressif&amp;quot;, &amp;quot;ZigbeeWaterMeter&amp;quot;);
  Zigbee.addEndpoint(&amp;amp;zbFlowSensor);

  Serial.println(&amp;quot;Starting Zigbee...&amp;quot;);
  if (!Zigbee.begin()) {
    Serial.println(&amp;quot;❌ Zigbee failed to start! Rebooting...&amp;quot;);
    delay(100);
    ESP.restart();
  }

  while (!Zigbee.connected()) {
    delay(100);
  }

  isConnected = true;
  Serial.println(&amp;quot;✅ Zigbee connected!&amp;quot;);
  setLEDColor(0, RGB_BRIGHTNESS, 0);  &#x2F;&#x2F; Green when connected

  zbFlowSensor.setReporting(0, 60, 1.0);

  lastReportTime = millis();
  lastSaveTime = millis();
  lastZigbeeReportTime = millis();
}

void loop() {
  uint32_t currentMillis = millis();

  int waterValue = digitalRead(WATER_PIN);
  if (waterValue == LOW) {
    if (isLowVoltage) {
      pulseCount++;
      isLowVoltage = false;
      totalLiters += 1.0 &#x2F; PULSES_PER_LITER;

      Serial.printf(&amp;quot;🚿 Water pulse detected! Total: %.3f L\n&amp;quot;, totalLiters);

      if (isConnected) {
        setLEDColor(0, 0, 0);  &#x2F;&#x2F; Blink LED off
        delay(100);
        setLEDColor(0, RGB_BRIGHTNESS, 0);  &#x2F;&#x2F; Restore green
      }
    }
  } else {
    isLowVoltage = true;
  }

  &#x2F;&#x2F; Force report every minute
  if (currentMillis - lastReportTime &amp;gt;= REPORT_INTERVAL) {
    zbFlowSensor.setFlow(totalLiters);
    zbFlowSensor.report();
    Serial.printf(&amp;quot;📢 Forced report (every minute): %.3f L\n&amp;quot;, totalLiters);
    lastReportTime = currentMillis;
    lastZigbeeReportTime = currentMillis;
  }

  &#x2F;&#x2F; Save to NVS every 30 minutes if changed
  if ((currentMillis - lastSaveTime &amp;gt;= SAVE_INTERVAL) &amp;amp;&amp;amp; (totalLiters != lastSavedLiters)) {
    saveToNVS();
    lastSaveTime = currentMillis;
  }

  &#x2F;&#x2F; Restart if no Zigbee report for 2 hours
  if (currentMillis - lastZigbeeReportTime &amp;gt;= ZIGBEE_WATCHDOG_TIMEOUT) {
    Serial.println(&amp;quot;❌ No Zigbee report for 2 hours! Restarting ESP32...&amp;quot;);
    delay(100);
    ESP.restart();
  }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Add a sensor on configuration.yaml on Home Assistant:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;- sensor:
      - name: &amp;quot;Total Water Usage&amp;quot;
        unique_id: total_water_usage
        state: &amp;quot;{{ states(&amp;#39;sensor.espressif_zigbeewatermeter&amp;#39;) | float(0) }}&amp;quot;
        unit_of_measurement: &amp;quot;L&amp;quot;
        device_class: water
        state_class: total_increasing
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Owntone on Unraid as jukebox</title>
          <pubDate>Sat, 01 Feb 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/owntone-on-unraid-as-jukebox/</link>
          <guid>https://savoir-faire.neocities.org/posts/owntone-on-unraid-as-jukebox/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/owntone-on-unraid-as-jukebox/">&lt;p&gt;I want to play online radios with my own unraid server, use it as a jukebox. I find it really complicated, and eventually here comes the solution.&lt;&#x2F;p&gt;
&lt;p&gt;To use Owntone on Unraid:&lt;&#x2F;p&gt;
&lt;p&gt;You will need:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A cheap USB soundcard, buy it from Aliexpress&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ich777&#x2F;unraid-sound-driver&quot;&gt;Sound card plugin&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Make sure the &lt;code&gt;nobody&lt;&#x2F;code&gt; grouping has &lt;code&gt;audio&lt;&#x2F;code&gt; in it: &lt;code&gt;usermod -aG audio nobody&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Install &lt;code&gt;owntone&lt;&#x2F;code&gt; docker, note the following configuration:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;configuration&quot;&gt;Configuration&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;docker run
  -d
  --name=&amp;#39;owntone&amp;#39;
  --net=&amp;#39;docker-apps&amp;#39;
  --pids-limit 2048
  -e TZ=&amp;quot;America&#x2F;New_York&amp;quot;
  -e HOST_OS=&amp;quot;Unraid&amp;quot;
  -e HOST_HOSTNAME=&amp;quot;VC65&amp;quot;
  -e HOST_CONTAINERNAME=&amp;quot;owntone&amp;quot;
  -e &amp;#39;UID&amp;#39;=&amp;#39;99&amp;#39;
  -e &amp;#39;PID&amp;#39;=&amp;#39;17&amp;#39;
  -l net.unraid.docker.managed=dockerman
  -l net.unraid.docker.webui=&amp;#39;http:&#x2F;&#x2F;[IP]:[PORT:3689]&amp;#39;
  -l net.unraid.docker.icon=&amp;#39;https:&#x2F;&#x2F;developer.asustor.com&#x2F;uploadIcons&#x2F;0020_117518_1620963351_owntone_icon_256.png&amp;#39;
  -p &amp;#39;3689:3689&#x2F;tcp&amp;#39;
  -p &amp;#39;3688:3688&#x2F;tcp&amp;#39;
  -v &amp;#39;&#x2F;mnt&#x2F;user&#x2F;Vault&#x2F;Multimedia&#x2F;Music&#x2F;&amp;#39;:&amp;#39;&#x2F;srv&#x2F;media&amp;#39;:&amp;#39;rw&amp;#39;
  -v &amp;#39;&#x2F;mnt&#x2F;user&#x2F;appdata&#x2F;owntone&amp;#39;:&amp;#39;&#x2F;etc&#x2F;owntone&#x2F;&amp;#39;:&amp;#39;rw&amp;#39;
  -v &amp;#39;&#x2F;mnt&#x2F;user&#x2F;appdata&#x2F;owntone&#x2F;database&amp;#39;:&amp;#39;&#x2F;var&#x2F;cache&#x2F;owntone&amp;#39;:&amp;#39;rw&amp;#39;
  -v &amp;#39;&#x2F;etc&#x2F;group&amp;#39;:&amp;#39;&#x2F;etc&#x2F;group&amp;#39;:&amp;#39;ro&amp;#39; #ensure docker grouping matches with unraid
  --device=&amp;#39;&#x2F;dev&#x2F;snd:&#x2F;dev&#x2F;snd&amp;#39;
  --group-add=audio &amp;#39;docker.io&#x2F;owntone&#x2F;owntone:latest&amp;#39;
085f04172753cebe3b0e693b3a88d41408db9e4147655711e555566cd42fc681

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Owntone&#x27;s configuration file should be something like this:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;general {
        uid = &amp;quot;nobody&amp;quot;
        db_path = &amp;quot;&#x2F;var&#x2F;cache&#x2F;owntone&#x2F;database.db&amp;quot;
        db_backup_path = &amp;quot;&#x2F;var&#x2F;cache&#x2F;owntone&#x2F;database.bak&amp;quot;
        logfile = &amp;quot;&#x2F;dev&#x2F;stderr&amp;quot;
        loglevel = log
        trusted_networks = { &amp;quot;any&amp;quot; }
}
library {
        name = &amp;quot;Pyhnas Radio&amp;quot;
        port = 3689
        directories = { &amp;quot;&#x2F;srv&#x2F;media&amp;quot; }
        podcasts = { &amp;quot;&#x2F;Podcasts&amp;quot; }
        audiobooks = { &amp;quot;&#x2F;Audiobooks&amp;quot; }
        compilations = { &amp;quot;&#x2F;Compilations&amp;quot; }
        compilation_artist = &amp;quot;Various Artists&amp;quot;
        m3u_overrides = true
}
audio {
        nickname = &amp;quot;Computer&amp;quot;
        type = &amp;quot;alsa&amp;quot;
        card = &amp;quot;hw:0&amp;quot;
        mixer = &amp;quot;Speaker&amp;quot;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;notes&quot;&gt;Notes&lt;&#x2F;h3&gt;
&lt;p&gt;You will need to figure out the content in audio to make sure it can be played correctly.&lt;&#x2F;p&gt;
&lt;p&gt;Use &lt;code&gt;aplay -l&lt;&#x2F;code&gt; in you unraid host to get the list of audio devices:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;**** List of PLAYBACK Hardware Devices ****
card 0: Device [USB Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1&#x2F;1
  Subdevice #0: subdevice #0
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;card 0&lt;&#x2F;code&gt; corresponds to the &lt;code&gt;card = hw:0&lt;&#x2F;code&gt;. Then you will need to figure out the mixer, use &lt;code&gt;amixer&lt;&#x2F;code&gt; on your host to find it out:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;Simple mixer control &amp;#39;Speaker&amp;#39;,0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 30
  Mono:
  Front Left: Playback 27 [90%] [-4.50dB] [on]
  Front Right: Playback 27 [90%] [-4.50dB] [on]
Simple mixer control &amp;#39;Mic&amp;#39;,0
  Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined
  Playback channels: Mono
  Capture channels: Mono
  Limits: Playback 0 - 14 Capture 0 - 28
  Mono: Playback 1 [7%] [-10.50dB] [off] Capture 25 [89%] [25.50dB] [on]
Simple mixer control &amp;#39;Auto Gain Control&amp;#39;,0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [off]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then it will be the &lt;code&gt;Speaker&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Owntone websocket on Nginx Proxy Manager</title>
          <pubDate>Mon, 26 Aug 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/owntone-websocket-on-npm/</link>
          <guid>https://savoir-faire.neocities.org/posts/owntone-websocket-on-npm/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/owntone-websocket-on-npm/">&lt;p&gt;I have been using Owntone to be my homelab music center, and I want to use it behind reverse proxy. The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;owntone&#x2F;owntone-server&#x2F;wiki&#x2F;Creating-a-reverse-proxy-using-NGINX.&quot;&gt;tutorial&lt;&#x2F;a&gt; did not fix my problem on how to fix the websocket connection issue with port 3688.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually, I found out a method in fixing that on Nginx Proxy Manager:&lt;&#x2F;p&gt;
&lt;p&gt;The additional step is to add the following scripts to the Advanced Tab of a Proxy Host:&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;code&quot;&gt;Code&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;listen 3688 ssl http2;

location &#x2F; {
    # Websocket
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &amp;quot;upgrade&amp;quot;;
    proxy_http_version 1.1;
    # Resolve Issues
    proxy_buffer_size 64k;
    proxy_buffers 4 128k;
    proxy_busy_buffers_size 128k;
    # Proxy!

    if ($server_port = 3688) {
        proxy_pass       http:&#x2F;&#x2F;daapd:3688;
    }
    include conf.d&#x2F;include&#x2F;proxy.conf;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Revise the port, domain name (in my case &#x27;daapd&#x27;). To fix the issue.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Use Piler to archive all your emails</title>
          <pubDate>Thu, 01 Feb 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/use-piler-to-archive-all-your-emails/</link>
          <guid>https://savoir-faire.neocities.org/posts/use-piler-to-archive-all-your-emails/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/use-piler-to-archive-all-your-emails/">&lt;blockquote&gt;
&lt;p&gt;I was using QmailAgent to manage my email accounts and treated it as email archiving tools. But I cannot export QmailAgent&#x27;s database with ease. I decided to use another tool name &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mailpiler.org&#x2F;&quot;&gt;piler&lt;&#x2F;a&gt; to manage my email archive.&lt;&#x2F;p&gt;
&lt;p&gt;Piler is not a tool with easy installation, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mailpiler.org&quot;&gt;documentation&lt;&#x2F;a&gt; on installation is very limited. I was using a lot of time in making it working on my Unraid.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Piler offers an open source version, that was an older version of the this tool. I am using the 1.4.4 version to be my email archiving tool. For older or newer version, the configuration can be very different.&lt;&#x2F;p&gt;
&lt;p&gt;In this tutorial, I stick to the barebone of the system - no reverse proxy, no built-in database. Just a working piler by deploying its docker image. I deploy this utility in my Unraid NAS.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installing-the-docker&quot;&gt;Installing the docker&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You will need a MySQL database running in your system. Create a database named &lt;code&gt;piler&lt;&#x2F;code&gt; with username and password as &lt;code&gt;piler&lt;&#x2F;code&gt; and &lt;code&gt;piler123&lt;&#x2F;code&gt; respectively. You can use &lt;strong&gt;Adminer&lt;&#x2F;strong&gt; to perform this job.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Here comes the docker compose file, use it in creating the docker:&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre&gt;&lt;code&gt;version: &amp;#39;3.3&amp;#39;
services:
    piler:
        container_name: piler
        network_mode: piler-network
        environment:
            - PILER_HOSTNAME=mail.example.com # your own domain
            - MYSQL_HOSTNAME=mariadb # I have another mariadb docker
            - MYSQL_USER=piler # user name configured above
            - MYSQL_PASSWORD=piler123 # password configured above
            - MYSQL_DATABASE=piler # name for the database
        ports:
            - &amp;#39;380:80&#x2F;tcp&amp;#39;
            - &amp;#39;3443:443&#x2F;tcp&amp;#39;
            - &amp;#39;325:25&#x2F;tcp&amp;#39;
        volumes:
            - &amp;#39;&#x2F;mnt&#x2F;user&#x2F;backup&#x2F;emailbackup:&#x2F;var&#x2F;piler&#x2F;store:rw&amp;#39; # location for email storage
            - &amp;#39;&#x2F;mnt&#x2F;user&#x2F;appdata&#x2F;piler&#x2F;etc&#x2F;:&#x2F;etc&#x2F;piler:rw&amp;#39; # location of piler configuration files
            - &amp;#39;&#x2F;mnt&#x2F;user&#x2F;appdata&#x2F;piler&#x2F;manticore&#x2F;:&#x2F;var&#x2F;piler&#x2F;manticore:rw&amp;#39; # location for indexing tools
        image: &amp;#39;sutoj&#x2F;piler:1.4.4&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;Remember to forward the corresponding ports on your router.&lt;&#x2F;li&gt;
&lt;li&gt;After the installation, you can check the log to see whether piler actually runs on your machine. Piler can create a very detailed log recording the email arriving your server, but the docker image does not include &lt;code&gt;syslog&lt;&#x2F;code&gt; by default. We will need to install it:&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre&gt;&lt;code&gt;# in the docker console
# su
$ apt install syslog-ng

# after installation, enable the syslog-ng
$ service syslog-ng start

# you can check the mail incoming log here, other logs are also stored there:
$ cat &#x2F;var&#x2F;log&#x2F;mail.log
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We will need to configure two more documents to ensure piler functions properly. They are all located at &lt;code&gt;&#x2F;etc&#x2F;piler&lt;&#x2F;code&gt;. First, check &lt;code&gt;config-site.php&lt;&#x2F;code&gt;, make sure SITE&lt;em&gt;NAME&lt;&#x2F;em&gt;CONST is correct. Other items like the database name and password is correct.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;The second document is very important, configure &lt;code&gt;piler.conf&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre&gt;&lt;code&gt;# this one is important, for you will be forwarding all your emails to this account. And piler will be handling it for you
archive_address=archive@mail.example.com 

# configure the default retention day, please note that the retention days should not be too long, I tried 30000 before, and it was more than the database integer maximum.
default_retention_days=18250

# whether enable support for CJKV fonts
enable_cjk=1 
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;You are almost done. You will need to create domains, users by using &lt;strong&gt;admin&lt;&#x2F;strong&gt; accounts. Some default accounts of piler are:&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre&gt;&lt;code&gt;Account            Password
admin@local        pilerrocks
auditor@local      auditor
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!note]
Please note that admin account does not normally have the access to the emails, while auditor account will be having the access to all the emails.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</description>
      </item>
      <item>
          <title>Migrating FileRun to Unraid</title>
          <pubDate>Wed, 31 Jan 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/migrating-filerun-to-unraid/</link>
          <guid>https://savoir-faire.neocities.org/posts/migrating-filerun-to-unraid/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/migrating-filerun-to-unraid/">&lt;blockquote&gt;
&lt;p&gt;I was using a QNAP NAS and run FileRun as a docker. However, because of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.microsoft.com&#x2F;en-us&#x2F;education&#x2F;products&#x2F;microsoft-365-storage-options&quot;&gt;Changes to storage offerings across Microsoft 365 Education&lt;&#x2F;a&gt;, I will no longer have access to a cloud storage as backup. To ensure I can adopt to a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.seagate.com&#x2F;ca&#x2F;en&#x2F;blog&#x2F;what-is-a-3-2-1-backup-strategy&#x2F;&quot;&gt;3-2-1 backup strategy&lt;&#x2F;a&gt;, I opted for another NAS by converting my old PC and installed Unraid on it.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I migrate my FileRun to my Unraid NAS, as the processing power of my old PC is much better than the QNAP NAS. It was somehow a tricky process. Here are the note for future reference.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;database-migration&quot;&gt;Database Migration&lt;&#x2F;h2&gt;
&lt;p&gt;I will need to export the existing database first.&lt;&#x2F;p&gt;
&lt;p&gt;In the mariadb docker under my QNAP NAS, I run the following script:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;mysqldump --passwd --quick filerundb | gzip &amp;gt; filerun.gz
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It will ask you to provide mariadb&#x27;s root password. After a while, the database file is exported.&lt;&#x2F;p&gt;
&lt;p&gt;Copy the file out from the docker, by executing this command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker cp [your container id]:filerun.gz &#x2F;share&#x2F;Data&#x2F;filerun.gz 
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;fixing-the-database-error&quot;&gt;Fixing the &lt;em&gt;Database Error&lt;&#x2F;em&gt; &lt;&#x2F;h2&gt;
&lt;p&gt;If you get the &#x27;database error&#x27;, you can check the configuration in filerun&#x27;s &lt;code&gt;&#x2F;html&#x2F;system&#x2F;data&#x2F;autoconfig.php&lt;&#x2F;code&gt;, to ensure the database is correct.&lt;&#x2F;p&gt;
&lt;p&gt;In filerun docker configuration, we will need to insert the &lt;code&gt;FR_DB_HOST&lt;&#x2F;code&gt; value. It will connect it to the database server, but if we insert the IP to it, since this IP address is dynamic, there can be times where the database&#x27;s IP is changed.&lt;&#x2F;p&gt;
&lt;p&gt;Then we should use the name of the database container to be the value in &lt;code&gt;FR_DB_HOST&lt;&#x2F;code&gt;. But if we use the default bridge network on unraid, it could not get access to the database server.&lt;&#x2F;p&gt;
&lt;p&gt;We can create a custom network in console by using &lt;code&gt;docker network create filerun-network&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Then configure both the filerun and mariadb docker network by using this custom:filerun-network. Follows by filerun&#x27;s configuration, fill in &lt;code&gt;FR_DB_HOST&lt;&#x2F;code&gt; with the name of mariadb docker. Then the connection with database will be successful. Also, update the &lt;code&gt;&#x2F;html&#x2F;system&#x2F;data&#x2F;autoconfig.php&lt;&#x2F;code&gt; when necessary.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Clouflare tunnel on QNAP</title>
          <pubDate>Fri, 15 Sep 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/cloudflare-tunnel-on-qnap/</link>
          <guid>https://savoir-faire.neocities.org/posts/cloudflare-tunnel-on-qnap/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/cloudflare-tunnel-on-qnap/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;There are quite a few tutorials on how to apply &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cloudflare.com&#x2F;products&#x2F;tunnel&#x2F;&quot;&gt;Cloudflare Tunnel&lt;&#x2F;a&gt; service to Synology NAS, whereas such tutorials are almost absent from the more vulnerable QNAP NAS (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bleepingcomputer.com&#x2F;news&#x2F;security&#x2F;qnap-warns-of-new-checkmate-ransomware-targeting-nas-devices&#x2F;&quot;&gt;at least they are being attacked for several times&lt;&#x2F;a&gt;). This tutorial aims at providing a step-by-step guideline to fill in that absence.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;&#x2F;strong&gt;: &lt;em&gt;I have revised this tutorial to suit the configuration of the new Container Station 3.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;a-what-are-the-problems-myqnapcloud&quot;&gt;A. What are the problems myqnapcloud?&lt;&#x2F;h2&gt;
&lt;p&gt;When we read the comments on &lt;strong&gt;how to make our NAS safe&lt;&#x2F;strong&gt;, the most popular comment would be &lt;strong&gt;&#x27;don&#x27;t connect your NAS to the Internet&#x27;&lt;&#x2F;strong&gt; .&lt;&#x2F;p&gt;
&lt;p&gt;Well, it is true though, but it will lose the benefits of using a NAS to replace many public cloud services. QNAP offers a service named &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.qnap.com&#x2F;en&#x2F;software&#x2F;myqnapcloud&quot;&gt;myqnapcloud&lt;&#x2F;a&gt; which allows you to access your QNAP NAS everywhere.&lt;&#x2F;p&gt;
&lt;p&gt;Although myqnapcloud service is convenient, it is &lt;strong&gt;very vulnerable&lt;&#x2F;strong&gt;, as:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The IP and ports of your NAS are &lt;em&gt;exposed to the internet&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;ALL myqnapcloud devices are QNAP devices, which provide &lt;em&gt;a very nice pool of potential victims&lt;&#x2F;em&gt; for hackers who want to make good use of a QNAP loophole&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;b-what-are-the-benefits-of-using-cloudflare-tunnel&quot;&gt;B. What are the benefits of using Cloudflare Tunnel?&lt;&#x2F;h2&gt;
&lt;p&gt;As Cloudflare introduced a &lt;strong&gt;FREE&lt;&#x2F;strong&gt; tunneling service that can be used to protect your NAS from many types of cyber attack, making good use of this service can be a game changer.&lt;&#x2F;p&gt;
&lt;p&gt;With this service, your NAS will be:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Protected by the Cloudflare infrastructure from DDoS attacks&lt;&#x2F;li&gt;
&lt;li&gt;Able to hide the real IP from the Internet&lt;&#x2F;li&gt;
&lt;li&gt;Able to serve as usual, as all services that required myqnapcloud will retain with proper settings&lt;&#x2F;li&gt;
&lt;li&gt;Possibly increased access speed as Cloudflare could provide a better routing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;actual-steps&quot;&gt;Actual Steps&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;obtaining-a-free-domain-name&quot;&gt;Obtaining a free domain name&lt;&#x2F;h2&gt;
&lt;p&gt;You will need a domain name to replace your myqnapcloud domain. To obtain one, there are many free DDNS service providers available. I recommend &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.freenom.com&#x2F;en&#x2F;index.html?lang=en&quot;&gt;Freenom&lt;&#x2F;a&gt;, as it offers some &lt;strong&gt;FREE&lt;&#x2F;strong&gt; nice top-level domain names (e.g. .tk &#x2F; .ml &#x2F; .ga &#x2F; .cf &#x2F; .gq).&lt;&#x2F;p&gt;
&lt;p&gt;But the registration process of Freenom is quite tricky, &lt;strong&gt;if we check the availability of domains, it will always show NOT available&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Here are the steps to obtain a free domain:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Partner &amp;gt; Developers&lt;&#x2F;strong&gt; on the Navigation Bar.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-1.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Scroll down and click &lt;strong&gt;Get a Random Domain Account Today&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Review and Check out by entering your email address, you don&#x27;t need to provide any credit card information, but you need to input some address details.&lt;&#x2F;li&gt;
&lt;li&gt;Activate your account by verifying the email address.&lt;&#x2F;li&gt;
&lt;li&gt;Check the availability of domain again, at this time, you shall be able to &lt;strong&gt;&#x27;purchase&lt;&#x2F;strong&gt;&#x27; the domain.&lt;&#x2F;li&gt;
&lt;li&gt;By default, the free domain will last for 3 months, but &lt;strong&gt;you can choose up to 12 months for free&lt;&#x2F;strong&gt; in the drop down menu.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We will be returning to Freenom and perform one final step later, but now, let us create a Cloudflare Account first.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;creation-of-cloudflare-account&quot;&gt;Creation of Cloudflare Account&lt;&#x2F;h2&gt;
&lt;p&gt;The creation of Cloudflare account is more straight forward, after the normal account creation, perform the following steps:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;After creating the account, click &lt;strong&gt;Add site&lt;&#x2F;strong&gt; and enter the just obtained domain name.
&lt;ul&gt;
&lt;li&gt;Sometimes this process can result in an error message like &#x27;Hmm... We couldn&#x27;t find any matching websites.&#x27; Wait for a few minutes for Freenom to activate your domain.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;After adding the site, Cloudflare will ask you to &lt;strong&gt;change the nameserver&lt;&#x2F;strong&gt; of your domain. Copy the two nameservers and go back to Freenom, &lt;strong&gt;replace Freenom nameserver&lt;&#x2F;strong&gt;.
&lt;ul&gt;
&lt;li&gt;Cloudflare said that it could take up to 24 hours to update the register, but from my experience, it only take 5 to 10 minutes. Just take a walk, seep some coffee to continue.&lt;&#x2F;li&gt;
&lt;li&gt;You will be receiving an email indicating that the nameservers have been changed.&lt;&#x2F;li&gt;
&lt;li&gt;There are many settings available on Cloudflare, some of them will be covered in the Tweak section later.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-2.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Click your site, and in the sidebar, click &lt;strong&gt;Access&lt;&#x2F;strong&gt; and in page, click &lt;strong&gt;Launch Zero Trust&lt;&#x2F;strong&gt;.&lt;span&gt;
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-3.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Here you entered the Zero Trust Portal, in the sidebar, click &lt;strong&gt;Access &amp;gt; Tunnels&lt;&#x2F;strong&gt;.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-4.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Click &lt;strong&gt;Create a tunnel&lt;&#x2F;strong&gt;, after naming the tunnel, you will see a list of command like this, then we can move to our QNAP NAS:
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-5.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code&gt;docker run cloudflare&#x2F;cloudflared:2022.8.2 tunnel --no-autoupdate run --token eyJh[thisisthetoken]GaCJ9
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;installing-cloudflare-tunnel-service-on-qnap-nas&quot;&gt;Installing Cloudflare Tunnel service on QNAP NAS&lt;&#x2F;h2&gt;
&lt;p&gt;To use this service, you will need a &lt;strong&gt;Container Station&lt;&#x2F;strong&gt; already installed on your QNAP NAS.&lt;&#x2F;p&gt;
&lt;p&gt;Then perform the following steps:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;Container Station&lt;&#x2F;strong&gt;, hit &lt;strong&gt;Explore&lt;&#x2F;strong&gt; on the top and search &lt;strong&gt;Cloudflared&lt;&#x2F;strong&gt; and deploy it. It will show a very long list of versions, just choose the default &lt;strong&gt;Latest&lt;&#x2F;strong&gt;.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-6.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;li&gt;In the pop-up creation wizard, under the &lt;strong&gt;Configure Container&lt;&#x2F;strong&gt; part, give a name to your docker.&lt;&#x2F;li&gt;
&lt;li&gt;Click &lt;strong&gt;Advanced Settings&lt;&#x2F;strong&gt;, Here comes the tricky part, replace the command with the following into the &lt;strong&gt;Command&lt;&#x2F;strong&gt; box. Replace the string after &lt;code&gt;token&lt;&#x2F;code&gt; with the token (that long strange string) you copied above.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code&gt;tunnel run -token eyJh[thisisthetoken]GaCJ9
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Then, at the &lt;strong&gt;Network&lt;&#x2F;strong&gt; panel, choose &lt;em&gt;Network Mode&lt;&#x2F;em&gt; to be &lt;strong&gt;host&lt;&#x2F;strong&gt;. Then apply the settings and finish the wizard.&lt;&#x2F;li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;&#x2F;strong&gt; and you should be seeing the Container functions. It is normal to get some error message at this point. And it&#x27;s time to return to Cloudflare.&lt;&#x2F;li&gt;
&lt;li&gt;In the &lt;strong&gt;Tunnel&lt;&#x2F;strong&gt; panel of Cloudflare, &lt;strong&gt;Add a public hostname&lt;&#x2F;strong&gt;, choose the &lt;strong&gt;subdomain&lt;&#x2F;strong&gt; if you like, and for the &lt;strong&gt;Service&lt;&#x2F;strong&gt;, input this IP address that you find in the &lt;strong&gt;Network &amp;amp; Virtual Switch&lt;&#x2F;strong&gt; of your NAS.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-7.jpg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;ul&gt;
&lt;li&gt;This is the &lt;strong&gt;local IP address&lt;&#x2F;strong&gt; of your NAS, not your WAN IP.&lt;&#x2F;li&gt;
&lt;li&gt;For the port number, you may refer to the &lt;strong&gt;Control Panel &amp;gt; General Settings&lt;&#x2F;strong&gt; of your NAS, normally speaking &lt;strong&gt;you may use the default HTTP Port 8080 and HTTPS Port 443&lt;&#x2F;strong&gt;.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-8.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Now, try to use the new URL to access your QNAP NAS. Some security prompting might appear, but you now are using the Cloudflare tunnel to access your NAS!&lt;&#x2F;strong&gt;
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-9.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;implementing-the-cloudflare-certificate-to-qnap-nas&quot;&gt;Implementing the Cloudflare certificate to QNAP NAS&lt;&#x2F;h2&gt;
&lt;p&gt;If you are using myqnapcloud service, most likely you are using the Let&#x27;s Encrypt SSL Certificate, you may use the Cloudflare-generated certificate to replace it. So that your connection between your NAS all other devices would be safe. And there will not be some security promptings.&lt;&#x2F;p&gt;
&lt;p&gt;Here are the steps of the implementation:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Manage your site in Cloudflare, navigate to &lt;strong&gt;SSL&#x2F;TLS &amp;gt; Origin Server&lt;&#x2F;strong&gt;, choose &lt;strong&gt;Create Certificate&lt;&#x2F;strong&gt;.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-10.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;li&gt;You do not need to change any settings, and after creation, you will see &lt;strong&gt;Key Formart&lt;&#x2F;strong&gt; be &lt;strong&gt;PEM&lt;&#x2F;strong&gt;, your &lt;strong&gt;Original Certificate&lt;&#x2F;strong&gt; and &lt;strong&gt;Private Key&lt;&#x2F;strong&gt;.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-11.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Save &lt;strong&gt;Original Certificate&lt;&#x2F;strong&gt; and &lt;strong&gt;Private Key&lt;&#x2F;strong&gt; to your computer, paste them to notepad and save as &lt;code&gt;original.PEM&lt;&#x2F;code&gt; and &lt;code&gt;private.PEM&lt;&#x2F;code&gt;. Remember to change format.&lt;&#x2F;li&gt;
&lt;li&gt;Go to your QNAP NAS and access your &lt;strong&gt;Control Panel &amp;gt; Security &amp;gt; SSL Certificate &amp;amp; Private Key&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Depending on the status, you are likely to choose &lt;strong&gt;Replace Certificate &amp;gt; Import Certificate&lt;&#x2F;strong&gt;.
&lt;img src=&quot;&#x2F;images&#x2F;202306&#x2F;QNAPCloudflare-12.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Choose the above-created &lt;code&gt;original.PEM&lt;&#x2F;code&gt; to be &lt;strong&gt;Certificate&lt;&#x2F;strong&gt;, &lt;code&gt;private.PEM&lt;&#x2F;code&gt; to be &lt;strong&gt;Private Key&lt;&#x2F;strong&gt;, then press &lt;strong&gt;Apply&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Voila! And you will be using the Cloudflare SSL certificate to ensure the connection between your NAS and your devices are encrypted.&lt;&#x2F;li&gt;
&lt;li&gt;(This step is optional, but highly recommended) Navigate back to your Cloudflare &lt;strong&gt;SSL&#x2F;TLS &amp;gt; Overview&lt;&#x2F;strong&gt;, choose &lt;strong&gt;Full (strict)&lt;&#x2F;strong&gt; to ensure the connections are always encrypted and are using the aforementioned certificate.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;tweaking-of-the-tunnel-service-webui-qsync-mobile-apps-webdav&quot;&gt;Tweaking of the Tunnel service (WebUI &#x2F; Qsync &#x2F; Mobile Apps &#x2F; Webdav )&lt;&#x2F;h2&gt;
&lt;p&gt;This section is for referencing. If you use WebUI (and its related services, like QuMagie), here are the settings that you might need to pay attention.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;For WebUI, QuMagie, Mobile Apps, Qsync, they are ALL using the &lt;strong&gt;System Port&lt;&#x2F;strong&gt; that you would find &lt;strong&gt;Control Panel &amp;gt; General Settings&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Therefore, if you would like to use these services, just replace the original myqnapcloud link with the above Cloudflare tunnel domain.&lt;&#x2F;li&gt;
&lt;li&gt;If you would like to use Webdav, you are advised to use a new sets of ports, rather than the system ports. You may choose &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;savoir-faire.neocities.org&#x2F;static&#x2F;how-to-install-filerun-in-qnap-nas-by-using-container-station.html&quot;&gt;FileRun&lt;&#x2F;a&gt; to replace the system Webdav service.&lt;&#x2F;li&gt;
&lt;li&gt;After all these settings, &lt;strong&gt;you may now turn off the myqnapcloud service, disable the UpnP function and auto router configuration on your NAS&lt;&#x2F;strong&gt;. As you don&#x27;t need these services to get your NAS be accessible from the Internet.&lt;&#x2F;li&gt;
&lt;li&gt;Disabling the &lt;strong&gt;myqnapcloud&lt;&#x2F;strong&gt; service will not have any impact on the &lt;strong&gt;myqnapcloud Link&lt;&#x2F;strong&gt; service, you can still share folders &#x2F; files via this method.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Here are my port configuration:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;WebUI &#x2F; Mobile Apps &#x2F; Qsync
admin.example.ga &amp;gt; HTTP  192.168.1.100:8080
admin.example.ga &amp;gt; HTTPS 192.168.1.100:443

Webdav
documents.example.ga &amp;gt; HTTP 192.168.1.100:3333
documents.example.ga &amp;gt; HTTPS 192.168.1.100:3334
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Filerun on QNAP</title>
          <pubDate>Fri, 15 Sep 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/filerun-on-qnap/</link>
          <guid>https://savoir-faire.neocities.org/posts/filerun-on-qnap/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/filerun-on-qnap/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;By self-hosting the Free but not open sourced FileRun platform, we can greatly increase the overall performance of QNAP NAS as document management system. &lt;strong&gt;Note: it is faster and even more powerful than Google Drive!&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;&#x2F;strong&gt;: The docker compose file has been updated. &lt;strong&gt;phpMyAdmin&lt;&#x2F;strong&gt; is also included in this configuration, so that it will be more convenient to perform the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.filerun.com&#x2F;backup&quot;&gt;backup tasks&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;&#x2F;strong&gt;: As the free version of FileRun has been &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;feedback.filerun.com&#x2F;communities&#x2F;1&#x2F;topics&#x2F;1849-sunsetting-the-free-filerun-version&quot;&gt;sunsetting&lt;&#x2F;a&gt;. For those who had installed but not yet registered, you can register till the end of June, 2023. If you appreciate this tool, you may consider &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;filerun.com&#x2F;enterprise&quot;&gt;purchasing a license&lt;&#x2F;a&gt;. Not cheap, but definitely worth it!&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;As I have mentioned before, the native QNAP WebUI is very slow, not to mention the malfunctioned QFile or QuMagie mobile apps. &lt;strong&gt;The auto upload function often fails and file access speed is very slow.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I endured the situation for a long time and thought it was because of the specification of my NAS (TS-453Bmini). For I realize, it was not necessarily the case, by simply replacing the default QFile with other Webdav enabled app, like Document on iOS, I already enjoy a significant improvement.&lt;&#x2F;p&gt;
&lt;p&gt;And I found a great tool named &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;filerun.com&#x2F;&quot;&gt;FileRun&lt;&#x2F;a&gt;. Yes, it is &lt;strong&gt;NOT open sourced&lt;&#x2F;strong&gt;, but it is free of charge for personal use. For those who self hosts their service with their own hardware, it can be a concern, but for those who use QNAP NAS, it should not be a problem, as &lt;strong&gt;QTS itself is also not open sourced.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Then let&#x27;s choose a &lt;em&gt;better&lt;&#x2F;em&gt; and &lt;em&gt;safer&lt;&#x2F;em&gt; tool!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;FileRun is the combination of QNAP&#x27;s File Station &#x2F; Photo Station &#x2F; Video Station &#x2F; Music Station.&lt;&#x2F;strong&gt; Of course, their functions are not identical, but overall speaking, FileRun provides a mature and stable using experience with many tweaks possible.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;FileRun does not significantly increase the system resources usage, which is quite amazing.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There are many open source projects available, for example Next Cloud or ownCloud, they do provide a good service. Yet I personally think FileRun outperforms them.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;FileRun has a relatively long history&lt;&#x2F;strong&gt; (more than 15 years), this is the reason I eventually opt for this tool. For document management tools, longevity, stability and security is more important than anything else. &lt;strong&gt;You want a stable secure service that can last for years.&lt;&#x2F;strong&gt; Migration of database is always a nightmare.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;FileRun makes good use of your existing file structure.&lt;&#x2F;strong&gt; This is the tutorial of installing FileRun on a QNAP NAS. Again, it can fill in the absence of these knowledge, for there can be some tricks that need to be done.&lt;&#x2F;p&gt;
&lt;p&gt;This tutorial is divided into two parts:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Installation of FileRun&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;savoir-faire.neocities.org&#x2F;static&#x2F;tweaks-of-filerun-on-your-qnap-nas.html&quot;&gt;Tweaks of FileRun on your QNAP NAS&lt;&#x2F;a&gt; (that would be in another page)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;installation-of-filerun&quot;&gt;Installation of FileRun&lt;&#x2F;h2&gt;
&lt;p&gt;Again, this is a very laymen&#x27;s tutorial, if you know the docker structure, you can even skip these parts.&lt;&#x2F;p&gt;
&lt;p&gt;I assume you have downloaded the &lt;strong&gt;Container Station&lt;&#x2F;strong&gt; on your QNAP NAS.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;code&gt;Create&lt;&#x2F;code&gt; and &lt;code&gt;Create Application&lt;&#x2F;code&gt; in &lt;strong&gt;Container Station&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;The benefit of using Container Station to Create this Application is that you may restart the service by using QNAP&#x27;s WebGUI, you don&#x27;t need to login to the SSH management console that often.
&lt;ul&gt;
&lt;li&gt;And you can delete and make some changes to this application without using the console. It can save some time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img width=&quot;935&quot; height=&quot;443&quot; src=&quot;..&#x2F;_resources&#x2F;d9d6f6885d1510ecd936c3ef279610da_1c5c6f5e168f4b71a.png&quot;&#x2F;&gt; # You will need to paste a &lt;strong&gt;Docker compose file&lt;&#x2F;strong&gt;, I share mine here:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;version: &amp;#39;3&amp;#39;
services:
  db:
    image: &amp;#39;mariadb:10.8&amp;#39;
    environment:
      MYSQL_ROOT_PASSWORD: [change it to your password]
      MYSQL_USER: filerun
      MYSQL_PASSWORD: filerun
      MYSQL_DATABASE: filerundb
      TZ: America&#x2F;Toronto
    networks:
      - filerun
    volumes:
      - &amp;#39;.&#x2F;filerun&#x2F;db:&#x2F;var&#x2F;lib&#x2F;mysql&amp;#39;
  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin&#x2F;phpmyadmin
    restart: always
    ports:
      - &amp;#39;777:80&amp;#39;
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: [change it to your password]
      UPLOAD_LIMIT: 300M
    networks:
      - filerun
  web:
    image: filerun&#x2F;filerun:8.1
    environment:
      FR_DB_HOST: db
      FR_DB_PORT: 3306
      FR_DB_NAME: filerundb
      FR_DB_USER: filerun
      FR_DB_PASS: filerun
      APACHE_RUN_USER: www-data
      APACHE_RUN_USER_ID: 33
      APACHE_RUN_GROUP: www-data
      APACHE_RUN_GROUP_ID: 33
      TZ: America&#x2F;Toronto
    depends_on:
      - db
    ports:
      - &amp;#39;888:80&amp;#39;
    networks:
      - filerun
    volumes:
      - &amp;#39;.&#x2F;filerun&#x2F;html:&#x2F;var&#x2F;www&#x2F;html&amp;#39;
      - &amp;#39;&#x2F;share&#x2F;Vault:&#x2F;user-files&amp;#39;
      - &amp;#39;&#x2F;share&#x2F;Multimedia&#x2F;:&#x2F;user-files&#x2F;Multimedia&amp;#39;
      - &amp;#39;&#x2F;share&#x2F;zotero&#x2F;:&#x2F;user-files&#x2F;zotero&amp;#39;
networks:
  filerun:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;In the above document, &lt;strong&gt;you only need to change three things&lt;&#x2F;strong&gt;.
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;MYSQL_ROOT_PASSWORD&lt;&#x2F;code&gt;: give it a strong password of your choice&lt;&#x2F;li&gt;
&lt;li&gt;By default, phpMyAdmin only allows uploading 2 MB SQL backup, which is not enough, so increasing it to 300 MB by using including &lt;code&gt;UPLOAD_LIMIT&lt;&#x2F;code&gt; under &lt;code&gt;environment&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;ports:&lt;&#x2F;code&gt;, you may edit the former one, let&#x27;s say &lt;code&gt;999&lt;&#x2F;code&gt; rather than &lt;code&gt;888&lt;&#x2F;code&gt;, but please don&#x27;t change the latter &lt;code&gt;80&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;volumes&lt;&#x2F;code&gt;, this is the setting to include what folders to your FileRun service. Please do not change the first one &lt;code&gt;&#x2F;var&#x2F;www&#x2F;html&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;For the remaining, here comes the format: &lt;code&gt;:&#x2F;user-files&lt;&#x2F;code&gt; is the root directory of all folders, map it with the most commonly used folder you will be using, in my case, it would be &lt;code&gt;&#x2F;share&#x2F;Vault&lt;&#x2F;code&gt; for me.
&lt;ul&gt;
&lt;li&gt;You can map shared folders from other storage pool to FileRun, &lt;code&gt;&#x2F;share&#x2F;Multimedia&lt;&#x2F;code&gt; is another shared folder located in another storage pool, I map it under &lt;code&gt;&#x2F;user-files&#x2F;Multimedia&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Please note that after the installation, you will be seeing an empty shadow folder when you access through QNAP&#x27;s File Station. It is normal to see that.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;ol&gt;
&lt;li&gt;Now click &lt;code&gt;Create&lt;&#x2F;code&gt; and wait for the installation, it will create two containers named &lt;code&gt;filerun_web_1&lt;&#x2F;code&gt; and &lt;code&gt;filerun_db_1&lt;&#x2F;code&gt; packed in one application. As the docker images are quite big in size, time to have some rest.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;accessing-your-filerun-from-the-internet&quot;&gt;Accessing your FileRun from the Internet&lt;&#x2F;h2&gt;
&lt;p&gt;After that, you will need to make the FileRun container accessible from the Internet!&lt;&#x2F;p&gt;
&lt;p&gt;As I am using the Cloudflare Tunnel service, when you check on the &lt;strong&gt;Network &amp;amp; Virtual Switch&lt;&#x2F;strong&gt; on your QNAP, you may realize the &lt;code&gt;filerun_web_1&lt;&#x2F;code&gt; and &lt;code&gt;cloudflare-1&lt;&#x2F;code&gt; Virtual adaptors are NOT connected to each other.&lt;&#x2F;p&gt;
&lt;p&gt;They cannot communicate with each other. To do that, it is a simple process, courtesy to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;42385977&#x2F;accessing-a-docker-container-from-another-container&quot;&gt;this&lt;&#x2F;a&gt; page, you will need to enter the QNAP console by using SSH. And enter the following:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;docker network create fileruncloudflare
docker network connect fileruncloudflare filerun_web_1
docker network connect fileruncloudflare cloudflare-1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Note that a &lt;code&gt;fileruncloudflare&lt;&#x2F;code&gt; virtual switch will be created and connecting two container services &lt;code&gt;filerun_web_1&lt;&#x2F;code&gt; and &lt;code&gt;cloudflare-1&lt;&#x2F;code&gt; together. After creating that, refresh your &lt;strong&gt;Network &amp;amp; Virtual Switch&lt;&#x2F;strong&gt;, you shall be seeing a new virtual switch appeared and connecting the services you will need. Please see caption below.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It is time to go back to Cloudflare Tunnel, create a Public Hostname of your choice, for example: &lt;code&gt;https:&#x2F;&#x2F;files.example.ga&lt;&#x2F;code&gt;. If you don&#x27;t know how to do so, please refer to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;savoir-faire.neocities.org&#x2F;static&#x2F;how-to-implement-cloudflare-tunnel-on-qnap-nas.html&quot;&gt;this tutorial&lt;&#x2F;a&gt; for the configuration.&lt;&#x2F;p&gt;
&lt;img width=&quot;935&quot; height=&quot;848&quot; src=&quot;..&#x2F;_resources&#x2F;61c1828d153ee16b5ea16df6bdf2222a_77685a3324ae4f628.png&quot;&#x2F;&gt;
&lt;p&gt;This time, for the &lt;strong&gt;Public Hostname Service&lt;&#x2F;strong&gt;, you need to fill in the arrowed IP address with port &lt;code&gt;80&lt;&#x2F;code&gt; as shown in the above caption. In this case, it is &lt;code&gt;172.29.32.3:80&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And voila! You may access your FileRun from the Internet for the first time installation! By using the public hostname you just configured: &lt;code&gt;https:&#x2F;&#x2F;files.example.ga&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Now enjoy the real speed of your NAS brought by FileRun.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;some-notes-on-this-tutorial&quot;&gt;Some notes on this tutorial&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Please note you may add the mapped user files later, by editing the &lt;strong&gt;Docker compose file&lt;&#x2F;strong&gt;, but please note that if you configure some settings in the docker (for example edited the &lt;code&gt;&#x2F;etc&#x2F;crontab&lt;&#x2F;code&gt; for some customized cron jobs), these settings would be replaced. So plan ahead what folders you may need to map.&lt;&#x2F;li&gt;
&lt;li&gt;If you want to use the Photos &#x2F; Album functions on FileRun, you may realize it is empty. FileRun will not perform indexing or thumbnail creation automatically, please refer my Tweak tutorial for more information.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Slow reading is so scarce yet important</title>
          <pubDate>Mon, 28 Aug 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/slow-reading-is-so-scarce-yet-important/</link>
          <guid>https://savoir-faire.neocities.org/posts/slow-reading-is-so-scarce-yet-important/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/slow-reading-is-so-scarce-yet-important/">&lt;p&gt;We read everyday, from news to social media, from memes to ads. We somehow are forced to read.&lt;&#x2F;p&gt;
&lt;p&gt;But as the amount of information we are forced to process skyrocketed, given that limited time we own, the only possible way is to read faster to accommodate such an increase in the amount. &lt;strong&gt;Speed reading&lt;&#x2F;strong&gt; then become a skill that a successful student must master. There are thousands of books on teaching readers how to read faster and more efficiently.&lt;&#x2F;p&gt;
&lt;p&gt;It was perceived that if you can read faster, then you can read more efficiently.&lt;&#x2F;p&gt;
&lt;p&gt;It is not always the case. It is true that for a majority of text, we should only be scanning through them. We should never dedicate that much time to those not-so-nutritious texts. Most of them are simply junk.&lt;&#x2F;p&gt;
&lt;p&gt;But for some texts, like some literature, philosophical works, if you are religious, some scared texts (yes, only some) should be read very carefully and very slowly. They can be very thought provoking, but we are not patient enough to read them slow, word by word, and let thoughts flow. We lack that kind of skills.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Slow reading&lt;&#x2F;strong&gt; is as important as &lt;strong&gt;speed reading&lt;&#x2F;strong&gt;, and the former is even more difficult, as it involves so much more than simply grabbing the textual meaning. It integrates a lot of extra activities - understanding the word, ensuring your understanding matches with the writer&#x27;s meaning, spotting out ambiguities, finding references in real life, criticizing the words by questioning it, and answering the questions raised.&lt;&#x2F;p&gt;
&lt;p&gt;It is a series of activities consuming a lot of mind power. But it is very fruitful. It is a &lt;em&gt;mind transformation process.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We have a tendency to be lazy, or put it into another expression, energy saving. So it is quite common that when you are practicing slow reading, your mind will suddenly stop functioning, and it will flow elsewhere. You are just tired. But with consistent practice, we should be mastering this skill soon.&lt;&#x2F;p&gt;
&lt;p&gt;Grab a text that will inspire you, and read it word by word, write notes of thoughts about it!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How to update a container compose in QNAP container station</title>
          <pubDate>Mon, 21 Aug 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/how-to-update-container-compose-in-qnap-container/</link>
          <guid>https://savoir-faire.neocities.org/posts/how-to-update-container-compose-in-qnap-container/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/how-to-update-container-compose-in-qnap-container/">&lt;ol&gt;
&lt;li&gt;Stop the container&lt;&#x2F;li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Images&lt;&#x2F;strong&gt;, and click &lt;strong&gt;Pull&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Type in the &lt;strong&gt;Image Name&lt;&#x2F;strong&gt;, for example, &lt;code&gt;neosmemo&#x2F;memos&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Edit the corresponding docker compose file, click &lt;strong&gt;Edit Application&lt;&#x2F;strong&gt;, then simply click &lt;strong&gt;Apply&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Since most of the docker compose will contain the phrase &lt;code&gt;latest&lt;&#x2F;code&gt; version, thus when it apply, it will use the latest version of the docker.&lt;&#x2F;li&gt;
&lt;li&gt;Update then completed.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>Adguard on Mikrotik Router</title>
          <pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/adguard-on-mikrotik-router/</link>
          <guid>https://savoir-faire.neocities.org/posts/adguard-on-mikrotik-router/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/adguard-on-mikrotik-router/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is a tutorial on how to install a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AdguardTeam&#x2F;AdGuardHome&quot;&gt;AdGuard Home&lt;&#x2F;a&gt; DNS docker on your Mikrotik router. AdGuard Home is a free service you can use.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I swtiched my Asus router to a Mikrotik Router. As I was one of the unfortunate guy who was using a x86 Asus router, so I cannot use a reliable &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asuswrt-merlin.net&#x2F;&quot;&gt;Asuswrt-Merlin&lt;&#x2F;a&gt;. But after doing some researches online, I realize Mikrotik Router is too good to be true: they are cheap, the RouterOS is too powerful for a home user, and most importantly, it gets updates from time to time. Just that they are often out of stock. But I eventually get a &lt;a href=&quot;https:&#x2F;&#x2F;mikrotik.com&#x2F;product&#x2F;hap_ax3&quot; target=&quot;_blank&quot;&gt;hAP AX&lt;sup&gt;3&lt;&#x2F;sup&gt;&lt;&#x2F;a&gt;. It is a great router, with possibility in using dockers to extend the functions of a router. I Instead of installing a pi-hole, I choose AdGuard Home instead.&lt;&#x2F;p&gt;
&lt;p&gt;The following tutorial is mostly referred to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=_jCKaHl3XM0&quot;&gt;this tutorial by the Network Berg&lt;&#x2F;a&gt; with some editings on steps. I transcript them to words, so that when navigating the tools, we can save a bit of time.&lt;&#x2F;p&gt;
&lt;p&gt;For this tutorial, I am using a &lt;strong&gt;Mikrotik hAP AX&lt;sup&gt;3&lt;&#x2F;sup&gt;&lt;&#x2F;strong&gt; router with &lt;strong&gt;RouterOS 7.10&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!warning]
RouterOS has a major change in 7.14, so some of the procedures might be obsolete.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;preparing-the-router&quot;&gt;Preparing the Router&lt;&#x2F;h2&gt;
&lt;p&gt;You will first need to enable the &lt;strong&gt;Container&lt;&#x2F;strong&gt; function in the router.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mikrotik.com&#x2F;download&quot;&gt;Download &lt;strong&gt;Extra Packages&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt; of the corresponding infrastructure, mine is a ARM64&lt;&#x2F;li&gt;
&lt;li&gt;Unzip the downloaded zip file&lt;&#x2F;li&gt;
&lt;li&gt;Enter router admin console by using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mikrotik.com&#x2F;download&quot;&gt;WinBox&lt;&#x2F;a&gt;, then navigate to &lt;code&gt;Files &amp;gt; Upload&lt;&#x2F;code&gt; (Or alternatively, you can perform the same task by using their webUI)&lt;&#x2F;li&gt;
&lt;li&gt;Upload the &lt;code&gt;container-7.XX-arm64.npk&lt;&#x2F;code&gt; (depends on your Router OS version, the 7.XX will be different)&lt;&#x2F;li&gt;
&lt;li&gt;Reboot the Router by clicking &lt;code&gt;System &amp;gt; Reboot&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Open &lt;code&gt;New Terminal&lt;&#x2F;code&gt;, Key in &lt;code&gt;&#x2F;system&#x2F;device-mode&#x2F;update container=yes&lt;&#x2F;code&gt;, after that, perform another reboot&lt;&#x2F;li&gt;
&lt;li&gt;Insert the Flash Drive, format it as &lt;strong&gt;ext4&lt;&#x2F;strong&gt; by clicking &lt;code&gt;System &amp;gt; Disks &amp;gt; Format Drive&lt;&#x2F;code&gt;, it will take some time. You can use a very small and old one, even 256MB will do. You can configure the following virutal network while wating for the Flash Disk to format&lt;&#x2F;li&gt;
&lt;li&gt;You have prepared the Router for the installation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;configuring-a-virtual-network&quot;&gt;Configuring a virtual network&lt;&#x2F;h2&gt;
&lt;p&gt;The next step would be quite technical, but as a layman, we can just follow the below step to create a virtual network for your Adguard Home&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;In WinBox, choose &lt;code&gt;Bridge &amp;gt; New&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Name the new interface as &lt;code&gt;dockers&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Then navigate to &lt;code&gt;IP &amp;gt; Addresses &amp;gt; New&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Set the address to be &lt;code&gt;10.0.0.1&#x2F;24&lt;&#x2F;code&gt; (Can be your choice). Bind the Interface with &lt;code&gt;dockers&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Create a virtual Ethernet device, by choosing &lt;code&gt;Interfaces &amp;gt; VETH &amp;gt; New&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Name the new interface as &lt;code&gt;veth1-adguard&lt;&#x2F;code&gt;, address will be &lt;code&gt;10.0.0.2&#x2F;24&lt;&#x2F;code&gt; and gateway to be &lt;code&gt;10.0.0.1&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Finally, go to &lt;code&gt;Brdiges &amp;gt; Ports &amp;gt; New&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Bind the interface with bridge: Interface: &lt;code&gt;veth-adguard&lt;&#x2F;code&gt;, bridge: &lt;code&gt;dockers&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Then we have finished configuring the virtual network, time to move on to create a container!&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;creating-a-container-in-routeros&quot;&gt;Creating a container in RouterOS&lt;&#x2F;h2&gt;
&lt;p&gt;We continue to perform the following tasks in Winbox, or the webUI.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We configture the container properties at &lt;code&gt;Container &amp;gt; Config&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Set Registry URL to be &lt;code&gt;https:&#x2F;&#x2F;registry-1.docker.io&lt;&#x2F;code&gt; (this is indeed the link of the docker hub) and Tmp dir to be  your own usb flash disk&lt;&#x2F;li&gt;
&lt;li&gt;We use the &lt;strong&gt;latest&lt;&#x2F;strong&gt; version of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hub.docker.com&#x2F;r&#x2F;adguard&#x2F;adguardhome&quot;&gt;Adguard Home&lt;&#x2F;a&gt;. The tag for the latest version is &lt;code&gt;adguard&#x2F;adguardhome:latest&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;In Router OS, create a new container at &lt;code&gt;Container &amp;gt; New&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Set Remote Image to be &lt;code&gt;adguard&#x2F;adguardhome:latest&lt;&#x2F;code&gt;, Interface: &lt;code&gt;veth1-adguard&lt;&#x2F;code&gt;, Root Dir &lt;code&gt;usb1-part1&#x2F;adguard&lt;&#x2F;code&gt; and Enable &lt;code&gt;Start On Boot&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;By default, the created container will be stopped, start the container&lt;&#x2F;li&gt;
&lt;li&gt;If all things go well, you can access your Adguard Home by accessing &lt;code&gt;http:&#x2F;&#x2F;10.0.0.2:3000&#x2F;&lt;&#x2F;code&gt;, where port 3000 is the default port for this tool&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;forcing-all-your-devices-use-adguard-home-server-as-dns&quot;&gt;Forcing all your devices use Adguard Home Server as DNS&lt;&#x2F;h2&gt;
&lt;p&gt;Just two more steps to force your devices in your network to use Adguard Home as your DNS.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;First one is to ensure your Router is using it as your DNS&lt;&#x2F;li&gt;
&lt;li&gt;Go to &lt;code&gt;IP &amp;gt; DNS&lt;&#x2F;code&gt; and replace your original DNS server with &lt;code&gt;10.0.0.2&lt;&#x2F;code&gt;, it will tell that your router to use your Container as DNS server&lt;&#x2F;li&gt;
&lt;li&gt;Go to &lt;code&gt;IP -&amp;gt; DHCP Server -&amp;gt; Networks tab -&amp;gt; Double-click your LAN network&lt;&#x2F;code&gt;, set DNS Servers to &lt;code&gt;10.0.0.1&lt;&#x2F;code&gt; (this is the address of your router)&lt;&#x2F;li&gt;
&lt;li&gt;If you are using Windoes, open a &lt;code&gt;cmd&lt;&#x2F;code&gt; and type in &lt;code&gt;ipconfig &#x2F;release&lt;&#x2F;code&gt; then &lt;code&gt;ipconfig &#x2F;renew&lt;&#x2F;code&gt; to refresh your DHCP lease with the updated DNS address, pointing to your AdguardHome Server&lt;&#x2F;li&gt;
&lt;li&gt;Also use &lt;code&gt;ipconfig &#x2F;all&lt;&#x2F;code&gt; to confirm that it&#x27;s been updated as expected&lt;&#x2F;li&gt;
&lt;li&gt;Finally, use &lt;code&gt;ipconfig &#x2F;flushdns&lt;&#x2F;code&gt; to remove any Windows-cached resolved addresses so that your next DNS queries are sure to flow to AdguardHome&#x27;s DNS for resolution (and perhaps blocking)&lt;&#x2F;li&gt;
&lt;li&gt;And you are all set!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;enable-some-filters-and-check-whether-adguard-is-really-guarding-your-dns&quot;&gt;Enable some filters and check whether AdGuard is really guarding your DNS&lt;&#x2F;h2&gt;
&lt;p&gt;By default, AdGuard Home only enables some filters, you can introduce to optimize your browsing experience.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;code&gt;http:&#x2F;&#x2F;10.0.0.2:3000&#x2F;&lt;&#x2F;code&gt;, configure &lt;code&gt;Filters&lt;&#x2F;code&gt; to add &#x2F; remove filters&lt;&#x2F;li&gt;
&lt;li&gt;Under &lt;code&gt;Settings &amp;gt; DNS Settings&lt;&#x2F;code&gt;, you will need to input an upstream DNS provider&lt;&#x2F;li&gt;
&lt;li&gt;Use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;d3ward.github.io&#x2F;toolz&#x2F;adblock.html&quot;&gt;this Test Ad Block tool&lt;&#x2F;a&gt; to test whether your AdGuard Home is really blocking the contents. For a more accurate result, please disable your broswer&#x27;s adblocker&lt;&#x2F;li&gt;
&lt;li&gt;You can also check the dashboard of AdGuard Home to see whether there&#x27;s anything being blocked&lt;&#x2F;li&gt;
&lt;li&gt;If you can see a large number being blocked, then you are all good! You can further tweak AdGuard Home to suit your network&#x27;s need&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Adguard on QNAP</title>
          <pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/adguard-on-qnap/</link>
          <guid>https://savoir-faire.neocities.org/posts/adguard-on-qnap/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/adguard-on-qnap/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;AdGuard is a very powerful ad-blocking tool, it provides a network-wide ads &amp;amp; trackers blocking DNS server. In this tutorial, I will demonstrate how to setup AdGuard Home on QNAP Container station.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;As usual, you need to get &lt;strong&gt;Container Station&lt;&#x2F;strong&gt; installed on your QNAP. Then perform the following steps:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;Container Station&lt;&#x2F;strong&gt;, in the left panel, click &lt;strong&gt;Create&lt;&#x2F;strong&gt; and search &lt;code&gt;adguardhome&lt;&#x2F;code&gt;, create the container and ensure you are using the latest version.&lt;&#x2F;li&gt;
&lt;li&gt;In the creation panel, give the container a proper name, or leave it as default.&lt;&#x2F;li&gt;
&lt;li&gt;For the other settings, remain default. Navigate to &lt;strong&gt;Advanced Settings&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Under &lt;strong&gt;Network&lt;&#x2F;strong&gt;, specify the &lt;strong&gt;hostname&lt;&#x2F;strong&gt; to be &lt;code&gt;adguard&lt;&#x2F;code&gt; for easy searching.&lt;&#x2F;li&gt;
&lt;li&gt;In &lt;strong&gt;Network Mode&lt;&#x2F;strong&gt;, choose &lt;code&gt;bridge&lt;&#x2F;code&gt;. &lt;em&gt;This step is important.&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;It is strongly advised to manually determine the &lt;strong&gt;IP address&lt;&#x2F;strong&gt;, so that when we configure the DNS server in our router, it won&#x27;t be pointing nowhere. In my case, I set it as &lt;code&gt;192.168.1.101&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;&#x2F;strong&gt; to initialize the docker, it shall take a minute or so. When it is running properly, go to &lt;code&gt;192.168.1.101&lt;&#x2F;code&gt; in your browser to configure the AdGuard home.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For the remaining configuration, it is quite straight forward. Choose the blocklist to tweak your need. You can see [[tutorials&#x2F;install_adguard_home_on_a_mikrotik_router | this post]] for more details.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Memos - a self-hosted personal twitter</title>
          <pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/memos-a-selfhosted-personal-twitter/</link>
          <guid>https://savoir-faire.neocities.org/posts/memos-a-selfhosted-personal-twitter/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/memos-a-selfhosted-personal-twitter/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I was struggling in finding a good tool to write my diary. I have been using Tiddlywiki for a few years, but &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;usememos.com&#x2F;&quot;&gt;Memos&lt;&#x2F;a&gt; has broaden my horizons and it is worth the trial.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Memos is an open source note-taking service inspird by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;flomoapp.com&#x2F;&quot;&gt;flomo&lt;&#x2F;a&gt;. It&#x27;s implementation is quite straight forward, though it&#x27;s documentation is very limited, but by following it&#x27;s documentation. I can implement this tool happily on my QNAP NAS.&lt;&#x2F;p&gt;
&lt;p&gt;The best thing about Memos is it is very twitter like (now called X liked, what a name), you can quickly jot down the thoughts, notes, take a picuture of nearby stuff and post it for your own record. It would be significantly faster than writing an ordinary diary.&lt;&#x2F;p&gt;
&lt;p&gt;Think of something - Write it down - That&#x27;s it.&lt;&#x2F;p&gt;
&lt;p&gt;If you are using a docker, you can follow &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.usememos.com&#x2F;docs&#x2F;install&#x2F;self-hosting&quot;&gt;its documentation here&lt;&#x2F;a&gt;. It could run properly. But since I using a Cloudflared tunnel, I will need to configure it&#x27;s IP address and network configurations. You may refer to the tutorials here. It applies the same settings.&lt;&#x2F;p&gt;
&lt;p&gt;Memo also provides &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;memos.moe&#x2F;&quot;&gt;third party apps&lt;&#x2F;a&gt;, so that you can access your Memos by using an Android or iOS device.&lt;&#x2F;p&gt;
&lt;p&gt;But since this service would be exposed to the internet, it could induce some security threats. To protect it against unautorized access, you can activate a Cloudflare application to protect it.&lt;&#x2F;p&gt;
&lt;p&gt;By using Cloudflare protection service, you will need to verify your identity before accessing the Memos service. It would cut the connection with your mobile apps. But what make it amazing is that you can use a tailor-made &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;usememos.com&#x2F;docs&#x2F;integration&#x2F;telegram-bot&quot;&gt;Telegram bot&lt;&#x2F;a&gt; to maintain the connection.&lt;&#x2F;p&gt;
&lt;p&gt;In this case, &lt;strong&gt;you can just type to your Telegram bot to upload any notes come across your mind!&lt;&#x2F;strong&gt; It is one of the most accessible tool you can imagine in jotting down what you think.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Use Telegram to receive QNAP SMS notifications</title>
          <pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/use-telegram-to-receive-qnap-sms-notifications/</link>
          <guid>https://savoir-faire.neocities.org/posts/use-telegram-to-receive-qnap-sms-notifications/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/use-telegram-to-receive-qnap-sms-notifications/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;QNAP has a Notification Center, you can receive some alerts and notification through emails, SMS, Instant Messaging and dedicated push apps. But for Instant Mesagging tools, it only includes Skype. But with simple configuration, you can receive the alerts through Telegram.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Sometimes you would like to receive some alerts and notifications from your QNAP, for instance some emerency firmware updates, errors. Receving email notifications is handy, but sometimes you don&#x27;t want to receive a full email just for a single alert. As these alerts are meant to inform, rather than to store for a long time.&lt;&#x2F;p&gt;
&lt;p&gt;You can configure your Telegram to create a Bot that can be used to receive these alerts. Follow the steps below:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;In &lt;em&gt;&lt;strong&gt;Telegram&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;, search &lt;strong&gt;BotFather&lt;&#x2F;strong&gt; and type in &lt;code&gt;&#x2F;new&lt;&#x2F;code&gt; to create a new bot. Follow its instruction and get a token for this bot.&lt;&#x2F;li&gt;
&lt;li&gt;The format of the &lt;em&gt;token&lt;&#x2F;em&gt; should looks something like this: &lt;code&gt;6123456789:AAAAA-tt-_T3_OOOOOOOOOOOOOOO&lt;&#x2F;code&gt;. Protect your token, for anyone who has the access can control this bot.&lt;&#x2F;li&gt;
&lt;li&gt;Get your Telegram user id. To get it, search &lt;strong&gt;userinfobot&lt;&#x2F;strong&gt; (or other bots with the same function), type in &lt;code&gt;&#x2F;start&lt;&#x2F;code&gt;, it would return something like this:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code&gt;@yourusername
Id: 1234567890
First: [Your first name]
Last: [Your last name]
Lang: en-US
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;1234567890&lt;&#x2F;code&gt; is your &lt;em&gt;user id&lt;&#x2F;em&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;In the following link, replace &lt;code&gt;[token]&lt;&#x2F;code&gt; and &lt;code&gt;[userid]&lt;&#x2F;code&gt; with the &lt;em&gt;token&lt;&#x2F;em&gt; and &lt;em&gt;user id&lt;&#x2F;em&gt; you just get:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code&gt;https:&#x2F;&#x2F;api.telegram.org&#x2F;bot[token]&#x2F;sendMessage?chat_id=[userid]&amp;amp;text=@@Text@@&amp;amp;user=@@UserName@@&amp;amp;password=@@Password@@&amp;amp;to=@@PhoneNumber@@
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So it should look something like this:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;https:&#x2F;&#x2F;api.telegram.org&#x2F;bot6123456789:AAAAA-tt-_T3_OOOOOOOOOOOOOOO&#x2F;sendMessage?chat_id=1234567890&amp;amp;text=@@Text@@&amp;amp;user=@@UserName@@&amp;amp;password=@@Password@@&amp;amp;to=@@PhoneNumber@@
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;ul&gt;
&lt;li&gt;Now its time to move back to QNAP, in &lt;em&gt;&lt;strong&gt;Notification Center&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;, under &lt;strong&gt;Service Account and Device Pairing&lt;&#x2F;strong&gt;, choose &lt;strong&gt;SMS&lt;&#x2F;strong&gt; and Click &lt;strong&gt;Add SMSC Service&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;In the pop up panel, choose &lt;strong&gt;SMS service provider&lt;&#x2F;strong&gt; to be &lt;strong&gt;custom&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Give your desired &lt;strong&gt;Alias&lt;&#x2F;strong&gt;, it can be anything.&lt;&#x2F;li&gt;
&lt;li&gt;Paste the the above link to the &lt;strong&gt;URL template text&lt;&#x2F;strong&gt;. And click &lt;strong&gt;Send a test message&lt;&#x2F;strong&gt; (this is the paper flight icon on the right.)&lt;&#x2F;li&gt;
&lt;li&gt;It will ask you to input a phone number, type in your Telegram phone number.&lt;&#x2F;li&gt;
&lt;li&gt;Your Telegram should receive a notification. If you can receive that, that means the service is setup. You can configure what types of alerts you would like to receive.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;By using this tool, your Telegram is more than a simple instant messaging tool to communicate with other human beings, it becomes an All-in-One messaging tool. By reducing the amount of apps installed in your phone, it is always better - to save power &#x2F; storage.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>ChatGPT like Ai will do more harm than good, eventually.</title>
          <pubDate>Thu, 22 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/chatgpt-like-ai-will-do-more-harm-than-good/</link>
          <guid>https://savoir-faire.neocities.org/posts/chatgpt-like-ai-will-do-more-harm-than-good/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/chatgpt-like-ai-will-do-more-harm-than-good/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The 2023 seems to become the Year of Ai. Content creating Ai are all over the place. Countless of news report and analysis are out, for me, Ai can be useful, but at the end of the day, this type of tools will do more harm than good.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;There are many reports saying that ChatGPT will replace a lot of manpower in workplace, it will create an economic chaos. My focus is not on this point, it&#x27;s on &lt;strong&gt;Ai, at this moment, will never be able to verify what&#x27;s right and wrong.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;What I mean right or wrong is not about moral decisions, it involves value judgement, but my point is simpler: &lt;strong&gt;Ai cannot determine whether something is existent or not.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have a friend who works for the government, and she is doing some researches about the legal enforcement of a certain policy in other countries. She uses ChatGPT as the one of the tools. The Ai could return URLs, segments of laws from some places, and they all look very &#x27;real&#x27;, but when she performs a fact check on these created information, they are indeed fake.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;We often complain on the content farms polluting the whole internet, but with ChatGPT, the cost of creating an unprecedented pollution would be just a few clicks away.&lt;&#x2F;p&gt;
&lt;p&gt;We can still perform some fact checks today, however, when the whole internet is flooded with information created by ChatGPT, one day we will be having a lot of difficulty in finding what is a fact and what is not.&lt;&#x2F;p&gt;
&lt;p&gt;This Ai will maximize the nastiness of human nature, such as &lt;em&gt;pride, greed, wrath, envy, lust, gluttony&lt;&#x2F;em&gt; and &lt;em&gt;sloth&lt;&#x2F;em&gt;. The following situation is likely and will certainly happen, and we can hardly do anything about it.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Content creators have the desire to attract more views, as more views means more influential, and eventually ends up in more income ($).&lt;&#x2F;li&gt;
&lt;li&gt;Accuracy is less important than the number of views.&lt;&#x2F;li&gt;
&lt;li&gt;Viewers and content creators sometimes will be lazy to perform fact check when absorbing information created by Ai.&lt;&#x2F;li&gt;
&lt;li&gt;Inaccuracy can hardly be corrected, as the task of correcting the contents will involve men (at least at this stage, or even in the foreseeable future). In terms of efficiency, the speed of reversing or correcting will be significantly slower than the speed of inaccurate creation.&lt;&#x2F;li&gt;
&lt;li&gt;The amount of inaccurate information will eventually surpass accurate information.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.washingtonpost.com&#x2F;technology&#x2F;2021&#x2F;09&#x2F;03&#x2F;facebook-misinformation-nyu-study&#x2F;&quot;&gt;Misinformation is likely to attract more viewers than accurate information.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;When considering the butterfly effect, those &lt;em&gt;sometimes&lt;&#x2F;em&gt; lazy or &lt;em&gt;sometimes&lt;&#x2F;em&gt; inaccurate will accumulate and create a larger and larger impact.&lt;&#x2F;li&gt;
&lt;li&gt;Soon, the internet will be flooded with junk information (though it is already the case, but ChatGPT will escalate it into another dimension).&lt;&#x2F;li&gt;
&lt;li&gt;It is not likely to make the right decision with wrong information. (Garbage in, garbage out)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;With all the above concerns, we can hardly do anything to stop it. As in the near future, Ai can run on personal computers, which cannot be regulated easily. Some devil governments, institutes, companies, or individuals will be using these tools to manipulate the general public or as information warfare. It is simply impossible to completely regulate those institutes.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;What can we do?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Acquire the ability to stay offline.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I found it the essential skills of the generation. In the hyper connected world, being able to disconnect, and disconnect successfully, is itself a luxury and a challenging task.&lt;&#x2F;p&gt;
&lt;p&gt;Have a regular digital sabbath.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Farm Life As an Alternative to Urban City Life</title>
          <pubDate>Sun, 18 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/farm-life-as-an-alternative-to-urban-city-life/</link>
          <guid>https://savoir-faire.neocities.org/posts/farm-life-as-an-alternative-to-urban-city-life/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/farm-life-as-an-alternative-to-urban-city-life/">&lt;p&gt;All developed countries have a stunningly high urbanization rate, and it is doubtless because of the industrialization that took place at the same time. People moved from farms to cities, where they worked in conglomerations and enjoyed the benefits of urban life.&lt;&#x2F;p&gt;
&lt;p&gt;Urban life is convenient, with amenities such as restaurants and shops within easy reach. However, a book titled &lt;em&gt;Bullshit Jobs&lt;&#x2F;em&gt; published in 2018 suggests that more than half of all jobs are meaningless.&lt;&#x2F;p&gt;
&lt;p&gt;The benefits of urbanization are clear: a higher population density facilitates manufacturing processes and logistic networks, allowing for more timely delivery of goods and services.&lt;&#x2F;p&gt;
&lt;p&gt;But a game changer has evolved over time as well. &lt;strong&gt;Technology&lt;&#x2F;strong&gt; enables many services to be done over the internet, and goods can be purchased and delivered through a very well-established logistic network.&lt;&#x2F;p&gt;
&lt;p&gt;However, urban life has its drawbacks. The word &quot;downtown&quot; has become synonymous with negative aspects such as noise, pollution, drug issues, and crime, and these problems have worsened over time, especially with the influx of illegal migrants.&lt;&#x2F;p&gt;
&lt;p&gt;As a result, people are moving to the suburbs, but this comes with its own set of issues, such as car reliance, a slightly lower crime rate, and a lack of diversity in terms of buildings and shops. It is difficult to distinguish a suburb in New England or in Vancouver. McDonald&#x27;s, Walmart, Costco, and Home Depot all seem the same.&lt;&#x2F;p&gt;
&lt;p&gt;Some people may find enjoyment in the limited entertainment options in the suburbs, but far more people are forced to commute to the city for work. This leads to long commute times and the issue of bedroom communities. People are essentially &quot;locked in&quot; to the city.&lt;&#x2F;p&gt;
&lt;p&gt;Many jobs, especially those in the tertiary sector, are in fact meaningless or even toxic. So, what can be our future? Let&#x27;s explore some alternatives, such as returning to farm life?&lt;&#x2F;p&gt;
&lt;p&gt;Our land is facing a real threat from the overuse of chemical fertilizers and pesticides, which has severely affected soil quality. Only 5% of the population is contributing to the industry that feeds the remaining 95%.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Can we move 15% of the population back to the farm?&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Organic farming is a more sustainable future, but it is more labor-intensive. Having more labor force working in the fields can increase the supply of organic food, reducing prices and making it more affordable. This migration can turn into a good cycle.&lt;&#x2F;p&gt;
&lt;p&gt;If more people are willing to move back to rural areas, not only can rural towns thrive again, but the problems within cities can also be alleviated.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Labor work, especially in nature, is good for mental health.&lt;&#x2F;strong&gt; Farmers will face stress due to climate change, but as we reintroduce smaller-scale farming practices and reduce the leverage level, organic farming tends to be more resilient and sustainable. It can generate more wealth, both physically and mentally, and the cost of living in rural areas can be lower than in cities.&lt;&#x2F;p&gt;
&lt;p&gt;There can be many possibilities in a farm life. Maybe it&#x27;s time to return to the nature.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!info] Further readings:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Will Harris: &lt;em&gt;A Bold Return to Giving a Damn - One Farm, Six Generations, and the Future of Food&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;James Howard Kunstler: &lt;em&gt;Living in the Long Emergency - Global Crisis, the Failure of the Futurists, and the Early Adapters Who Are Showing Us the Way Forward&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
</description>
      </item>
      <item>
          <title>Tweaks of FileRun on your QNAP</title>
          <pubDate>Sun, 11 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/tweaks-of-filerun-on-your-qnap/</link>
          <guid>https://savoir-faire.neocities.org/posts/tweaks-of-filerun-on-your-qnap/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/tweaks-of-filerun-on-your-qnap/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Tweaking FileRun can be very troublesome for beginners, as it require some understanding of some specific commands or location. But once you know that, your FileRun should run automatically without little maintenance.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;connecting-filerun-s-webdav-service&quot;&gt;Connecting FileRun&#x27;s Webdav service&lt;&#x2F;h2&gt;
&lt;p&gt;As mentioned in my installation tutorial, FileRun will not automatically index your folders, so any changes made outside of FileRun (for example you upload some files to the folder by using QTS&#x27;s File Station or performed some Qfiling tasks), FileRun will not be aware of that. It might cause some searching errors. So it is advised to upload &#x2F; modify your files by using the FileRun platform.&lt;&#x2F;p&gt;
&lt;p&gt;As Webdav included its own Webdav server, you may use it to replace QNAP&#x27;s own server. And all modifications made through FileRun&#x27;s Webdav will inform FileRun.&lt;&#x2F;p&gt;
&lt;p&gt;To connect that, you may need to bear in mind this path, it will connect to your Home Directory:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;https:&#x2F;&#x2F;[your public hostname]&#x2F;dav.php&#x2F;%40Home&#x2F;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;how-to-enter-filerun-docker-for-tweaking&quot;&gt;How to Enter FileRun docker for Tweaking&lt;&#x2F;h2&gt;
&lt;p&gt;Most of the time, you will need to access your NAS&#x27;s console via SSH. After entering the console, you will need to &lt;strong&gt;enter your FileRun docker console&lt;&#x2F;strong&gt;. Use this command, replace &lt;code&gt;filerun_web_1&lt;&#x2F;code&gt; with the name of the container you may find in your &lt;strong&gt;Container Station&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it filerun_web_1 sh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;installation-of-aes-crypt&quot;&gt;Installation of AES Crypt&lt;&#x2F;h2&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;filerun.com&#x2F;demo&quot;&gt;FileRun&#x27;s demo site&lt;&#x2F;a&gt;, AES Crypt is installed and can perform well. But in the docker image we use on our QNAP NAS, it is not installed by default. Here are the steps of enabling it:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enter your FileRun docker console&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Download AES Crypt by using this command&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;curl https:&#x2F;&#x2F;www.aescrypt.com&#x2F;download&#x2F;v3&#x2F;linux&#x2F;aescrypt-3.16.tgz &amp;gt; install.tgz 
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;You may need to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.aescrypt.com&#x2F;download&#x2F;&quot;&gt;check for the latest version of AES Crypt&lt;&#x2F;a&gt; and replace the above URL with the most update version.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Unzip the file, &lt;code&gt;tar -xzf install.tgz&lt;&#x2F;code&gt;, a folder named &lt;code&gt;aescrypt-x.xx&lt;&#x2F;code&gt; appears (whereas the x.xx is the version)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;You shall find a &lt;code&gt;README.md&lt;&#x2F;code&gt; in that folder, follow the instruction to compile and install it.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;It will show you the installation location: &lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;aescrypt&lt;&#x2F;code&gt;, copy this path&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;You may go to this directory to check the existence of this binary.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Then go back to FileRun, login as &lt;strong&gt;Superuser&lt;&#x2F;strong&gt;, enter the &lt;code&gt;Control panel&lt;&#x2F;code&gt;, navigate to &lt;code&gt;Plugins &amp;gt; AES File Encryption&lt;&#x2F;code&gt; and paste the above copied location to &lt;code&gt;Path the AESCrypt&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;And this is done, you may try to encrypt a file by selecting a file, right click and &lt;strong&gt;Open with AES File Encryption&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;make-libreoffice-preview-and-thumbnail-creation-workable&quot;&gt;Make LibreOffice Preview and Thumbnail creation workable&lt;&#x2F;h2&gt;
&lt;p&gt;As we are using the Docker version of FileRun, the default setting is not working, you will need to do the following things to make the Preview and Thumbnail creation works, you may &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;feedback.filerun.com&#x2F;en&#x2F;communities&#x2F;1&#x2F;topics&#x2F;1080-how-to-get-libreoffice-viewer-plugin-working-in-docker-installation&quot;&gt;need to refer this page for more info&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enter your FileRun docker console&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Create or edit &lt;strong&gt;customizables&#x2F;config.php&lt;&#x2F;strong&gt; by this command&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;vim customizables&#x2F;config.php
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Add the following to the document:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
putenv(&amp;#39;HOME=&#x2F;tmp&amp;#39;);
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Note the &lt;code&gt;&amp;lt;?php&lt;&#x2F;code&gt; is the standard beginning of PHP files.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;Esc&lt;&#x2F;code&gt; button and key in &lt;code&gt;wq!&lt;&#x2F;code&gt; to save the file.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Then go to your FileRun &lt;strong&gt;Control panel&lt;&#x2F;strong&gt;, navigate to &lt;code&gt;Files &amp;gt; Thumbs and previews &amp;gt; Enable LibreOffice support&lt;&#x2F;code&gt;, make sure it is enabled.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;For the previews of Office files, it should work. Please note that the Thumbnail creation needs a little bit of time. It is normal.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Note: In the newest version 2021.1.0, this issue seems to the fixed. Leave it here for future reference.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;show-cjkv-characters-in-libreoffice-docker-version&quot;&gt;Show CJKV characters in LibreOffice (docker version)&lt;&#x2F;h2&gt;
&lt;p&gt;For the default FileRun docker image, it includes no typeface which supports CKJV characters, therefore, for those documents, FileRun would return thumbnails and previews with countless squares.&lt;&#x2F;p&gt;
&lt;p&gt;To fix this issue, we need to perform the following:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Choose a decent font and download them to your server, we use the open sourced Source Hans font developed by Adobe:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;wget https:&#x2F;&#x2F;github.com&#x2F;adobe-fonts&#x2F;source-han-sans&#x2F;raw&#x2F;release&#x2F;Variable&#x2F;TTF&#x2F;SourceHanSansTC-VF.ttf
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Copy the font into FileRun docker:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;docker cp .&#x2F;SourceHanSansTC-VF.ttf [your container id]:&#x2F;usr&#x2F;share&#x2F;fonts&#x2F;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Get your container id by using &lt;code&gt;docker ps&lt;&#x2F;code&gt; command.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Enter your docker:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it filerun_web_1 sh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Scan the font directory and rebuild the cache:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;fc-cache -vf
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;You may see a list of CKJV font installed by checking if they are installed correctly (Chinese characters are shown as an example):&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;fc-list :lang=zh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;If you see a list of fonts shown, then you can just restart your FileRun container, and voila! You can generate thumbnails and preview documents with CJKV characters correctly.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;html-sync-problem-cloudflare-version-fix&quot;&gt;HTML Sync problem - Cloudflare version fix&lt;&#x2F;h2&gt;
&lt;p&gt;If you use FileRun with Nextcloud or Owncloud to perform sync jobs, some documents might fail in syncronization, particularly html files. Owncloud or Nextcloud will return error messages regarding &#x27;e-tag&#x27;. If you use Cloudflare in your network structure, a quick fix can tackle this problem.&lt;&#x2F;p&gt;
&lt;p&gt;Navigate to your Cloudflare dashboard, under &lt;code&gt;Caching&lt;&#x2F;code&gt;, choose &lt;code&gt;Cache Rules&lt;&#x2F;code&gt;(I assume you are as poor as me, using the free version of Cloudflare).&lt;&#x2F;p&gt;
&lt;p&gt;Create a cache rule with the following specifications:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;User Agent contains &lt;code&gt;ownCloud&lt;&#x2F;code&gt; or &lt;code&gt;nextCloud&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Enable strong ETag header&lt;&#x2F;li&gt;
&lt;li&gt;Clear your Cloudflare cache under &lt;code&gt;Caching &amp;gt; Configuration &amp;gt; Purge Cache &amp;gt; Purge Everything.&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It should fix the problem.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Don&#x27;t use the default QNAP Apps if you want to access the files FASTER	</title>
          <pubDate>Fri, 09 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/dont-use-the-default-qnap-apps-if-you-want-to-acc/</link>
          <guid>https://savoir-faire.neocities.org/posts/dont-use-the-default-qnap-apps-if-you-want-to-acc/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/dont-use-the-default-qnap-apps-if-you-want-to-acc/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I don&#x27;t mean to be harsh, but the QNAP developed apps are slow. I once thought that was related to my Internet speed, but realized that was not the case. By replacing QNAP Apps with third party apps, you can access to your files with a even-faster-than-google-drive speed.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;slow-app-slow-internet-slow-nas&quot;&gt;Slow App? Slow Internet? Slow NAS?&lt;&#x2F;h2&gt;
&lt;p&gt;If you are using the QNAP Apps, you may realize the speed are mostly slow. Whenever we open &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.qnap.com&#x2F;en&#x2F;how-to&#x2F;tutorial&#x2F;article&#x2F;accessing-and-sharing-files-on-a-qnap-nas-using-qfile&quot;&gt;QFile&lt;&#x2F;a&gt;, it logins to your NAS, loading... for a long... time. Then you can get a list of your documents. &lt;strong&gt;It really took a minute to have the access to one document.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I originally thought that was related to the Internet speed problem, or my NAS was not as powerful as Google Drive.&lt;&#x2F;p&gt;
&lt;p&gt;Credit to some browsing on reddit, those comments made me do the experiment. And eventually, that was NOT the case. &lt;strong&gt;The reason for such slowness is because of the crappy mobile apps written.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t want to be too harsh to QNAP, for they focus more on the hardware advancement, and their software team is quite greedy in providing a lot of services and apps. There is a Chinese idiom saying that &lt;strong&gt;being greedy will end up in poverty&lt;&#x2F;strong&gt;. That&#x27;s exactly the case for QNAP.&lt;&#x2F;p&gt;
&lt;p&gt;Long story short, if we replace the QFile with other app that supports Webdav, the loading speed is even faster that Google Drive!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-to-replace-qfile&quot;&gt;How to replace QFile?&lt;&#x2F;h2&gt;
&lt;p&gt;To make your file accessible with other apps, you have to enable some file sharing protocol on your NAS.&lt;&#x2F;p&gt;
&lt;p&gt;I would suggest Webdav, for this protocol is quite universal and versatile, you can access it from your Mac &#x2F; PC &#x2F; Linux &#x2F; Android App &#x2F; iOS Apps.&lt;&#x2F;p&gt;
&lt;p&gt;If you are a student or scholar, you may also use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.zotero.org&#x2F;&quot;&gt;Zotero&lt;&#x2F;a&gt; to manage your research documents, or use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;joplinapp.org&#x2F;&quot;&gt;Joplin&lt;&#x2F;a&gt; to store your notes. All these software supports Webdav. With one protocol enabled, we can enjoy multiple services. (Fewer protocols enabled mean fewer ports to be exploited by hackers.)&lt;&#x2F;p&gt;
&lt;p&gt;And &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.qnap.com&#x2F;en&#x2F;how-to&#x2F;tutorial&#x2F;article&#x2F;accessing-your-qnap-nas-remotely-with-webdav&quot;&gt;here are the steps of enabling Webdav on your NAS&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How to make cron job in docker FileRun working</title>
          <pubDate>Fri, 09 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/how-to-make-cron-job-in-docker-filerun-working-sa/</link>
          <guid>https://savoir-faire.neocities.org/posts/how-to-make-cron-job-in-docker-filerun-working-sa/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/how-to-make-cron-job-in-docker-filerun-working-sa/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I have been using Qfiling to organize my file, but FileRun won&#x27;t be able to detect the changes of files automatically. Therefore, a &lt;code&gt;cron&lt;&#x2F;code&gt; job is needed to fetch the metadata of the files, so that I do not need to do that manually.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;As I used the &lt;strong&gt;Owncloud&lt;&#x2F;strong&gt;&#x27; to automatically upload my photos to a folder named &lt;code&gt;Temp Photo&lt;&#x2F;code&gt;, and I used &lt;strong&gt;Qfiling&lt;&#x2F;strong&gt; on my QNAP NAS to organize the photos according to their taken date.&lt;&#x2F;p&gt;
&lt;p&gt;Since this task is performed outside of FileRun, it would not be aware of the changes of photo locations. Therefore, an automatically performed cron job would help me to fetch the metadata of the photos.&lt;&#x2F;p&gt;
&lt;p&gt;In FileRun&#x27;s documentation, they recommended two methods of adding cron job in a &lt;strong&gt;docker&lt;&#x2F;strong&gt;, by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.filerun.com&#x2F;docker-tika&quot;&gt;editing&lt;&#x2F;a&gt; &lt;code&gt;&#x2F;etc&#x2F;crontab&lt;&#x2F;code&gt; or by using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.filerun.com&#x2F;file_indexing#set_index_queue_manager&quot;&gt;command&lt;&#x2F;a&gt; &lt;code&gt;crontab -e&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I will focus on the latter method, as it is more straightforward.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;prepare-a-bash-file&quot;&gt;Prepare a Bash File&lt;&#x2F;h2&gt;
&lt;p&gt;I prepared a &lt;code&gt;customcron.sh&lt;&#x2F;code&gt; file in &lt;code&gt;&#x2F;var&#x2F;www&#x2F;html&#x2F;cron&#x2F;&lt;&#x2F;code&gt;, the location is your choice and the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.filerun.com&#x2F;command_line_tools&quot;&gt;command&lt;&#x2F;a&gt; in the bash file is:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;php &#x2F;var&#x2F;www&#x2F;html&#x2F;cron&#x2F;metadata_index.php myusername &#x2F;user-files&#x2F;Multimedia&#x2F;Photos&#x2F;2022
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Remember to make this bash file executable:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;chmod 755 &#x2F;var&#x2F;www&#x2F;html&#x2F;cron&#x2F;customcron.sh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;adding-a-cron-job&quot;&gt;Adding a Cron Job&lt;&#x2F;h2&gt;
&lt;p&gt;After that I added a cron job by using &lt;code&gt;crontab -e&lt;&#x2F;code&gt; (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;crontab.guru&#x2F;#22_1_*_*_tue&quot;&gt;the task is performed every Tuesday at 0122&lt;&#x2F;a&gt;):&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;22 1 * * tue &#x2F;var&#x2F;www&#x2F;html&#x2F;cron&#x2F;customcron.sh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But simply by adding this command, that cron job was not working, after some debuggings, I found out the following error message:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;&#x2F;var&#x2F;www&#x2F;html&#x2F;cron&#x2F;customcron.sh: line 1: php: command not found
&#x2F;var&#x2F;www&#x2F;html&#x2F;cron&#x2F;customcron.sh: line 2: php: command not found
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In this case, what I need to do is simply add two more lines at the beginning to &lt;strong&gt;crontab&lt;&#x2F;strong&gt; by using &lt;code&gt;crontab -e&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;SHELL=&#x2F;bin&#x2F;sh
PATH=&#x2F;usr&#x2F;local&#x2F;sbin:&#x2F;usr&#x2F;local&#x2F;bin:&#x2F;sbin:&#x2F;bin:&#x2F;usr&#x2F;sbin:&#x2F;usr&#x2F;bin
22 1 * * tue &#x2F;var&#x2F;www&#x2F;html&#x2F;cron&#x2F;customcron.sh
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Voila, the cron job is working, it would automatically fetch the metadata of files.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;miscellaneous-this-is-how-to-get-the-log-for-a-cron-job-in-filerun-docker&quot;&gt;Miscellaneous - This is how to get the log for a cron job in FileRun docker:&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;22 1 * * tue &#x2F;var&#x2F;www&#x2F;html&#x2F;cron&#x2F;customcron.sh &amp;gt;&amp;gt; &#x2F;var&#x2F;log&#x2F;cronjob.log 2&amp;gt;&amp;amp;1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then you can find the &lt;code&gt;cronjob.log&lt;&#x2F;code&gt; at &lt;code&gt;&#x2F;var&#x2F;log&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>My dream list about FileRun</title>
          <pubDate>Fri, 09 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/my-dream-list-about-filerun/</link>
          <guid>https://savoir-faire.neocities.org/posts/my-dream-list-about-filerun/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/my-dream-list-about-filerun/">&lt;h2 id=&quot;my-dream-list-about-filerun&quot;&gt;My dream list about FileRun&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I just found the greatness of the docker hosted FileRun. Just my personal thoughts about the function it can include, so that it can be an all-in-one service.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sharable album&lt;&#x2F;strong&gt;: I realize many services might have underestimate the time consumed on creating and maintaining an album.
&lt;ul&gt;
&lt;li&gt;A normal album can just take seconds to create, but as the numbers of album is only incremental, after accumulating for years, there can be hundreds of albums.&lt;&#x2F;li&gt;
&lt;li&gt;Not many album management services offer the backup &#x2F; export album service. We still do not have a standardized format on album backup.&lt;&#x2F;li&gt;
&lt;li&gt;Currently, FileRun&#x27;s album is fast and thumbnail creation is also fast. It requires only little computer resources when compared with other album dockers, life PhotoPrism &#x2F; LibrePhotos.&lt;&#x2F;li&gt;
&lt;li&gt;However, FileRun does not have an option for sharing albums with users on the same platform.&lt;&#x2F;li&gt;
&lt;li&gt;It is possible though, to create a web accessible link, so that everyone with the link can see that album.&lt;&#x2F;li&gt;
&lt;li&gt;But it is more convenient and secure to share albums across users, so that certain family members can access to certain albums.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Face-recognition&lt;&#x2F;strong&gt;: Yes, it is true that it was well beyond the scope of FileRun - a file management service. But as FileRun offers many funny and useful plug-ins, if a face-recognition plug-in can be introduced, then FileRun can replace most of the album software &#x2F; services.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GUI Configurable Cron Job&lt;&#x2F;strong&gt;: Many people host FileRun on their NAS, and the files that were handled outside FileRun was not being updated automatically in FileRun.
&lt;ul&gt;
&lt;li&gt;We have to introduce some cron jobs to perform these tasks. I think these tasks are quite frequently accessed, if FileRun introduce a Wizard for that, it will significantly flatten the learning curve of FileRun.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Why ChromeOS can never be a good OS.</title>
          <pubDate>Fri, 09 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://savoir-faire.neocities.org/posts/why-chromeos-can-never-be-a-good-os/</link>
          <guid>https://savoir-faire.neocities.org/posts/why-chromeos-can-never-be-a-good-os/</guid>
          <description xml:base="https://savoir-faire.neocities.org/posts/why-chromeos-can-never-be-a-good-os/">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Google is no doubt a very powerful company, with many innovations, its, searching engine has completed changed the life of mankind. But its billion user ChromeOS, can never be a good OS.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Throughout history, Google has &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;killedbygoogle.com&#x2F;&quot;&gt;killed many services&lt;&#x2F;a&gt;, some of the killed services are of very good quality, with great potential, or even with a large number of supporters. ChromeOS, released in 2011, has gather the support from many educators and students. Google promotes ChromeOS with three big highlights: Simplicity, Security and Speed.&lt;&#x2F;p&gt;
&lt;p&gt;We do have to appreciate Google has achieved some of the goal, it is likely to be safer than Windows or Mac. But for Speed and Simplicity, it might not be the case.&lt;&#x2F;p&gt;
&lt;p&gt;Maybe some people would argue that for ordinary user, ChromeOS is simple enough, we don&#x27;t need a lot of settings to make the system works.&lt;&#x2F;p&gt;
&lt;p&gt;Is that the case? If you solely use the notebook to browse the Internet, watch Youtube videos, it is the case. But if you want just a bit more, ChromeOS could become a hassle. A big hassle, sometimes without any tricks to solve an encountered problem.&lt;&#x2F;p&gt;
&lt;p&gt;Say if you want to watch some videos downloaded from the Internet, the built-in player simply does not work. It can only support some format or codec, for the others, you have to find a suitable player to play it.&lt;&#x2F;p&gt;
&lt;p&gt;At this point, you may be given various options: from Google Chrome&#x27;s extension store, from Google Play Store, from Linux virtual machine.&lt;&#x2F;p&gt;
&lt;p&gt;Many options, right? But Chrome&#x27;s extension store is very irritating, there are many dead extensions, and because of the updates of Google Chrome, some extensions failed to function.&lt;&#x2F;p&gt;
&lt;p&gt;And again, Google has killed the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;killedbygoogle.com&#x2F;&quot;&gt;Chrome App&lt;&#x2F;a&gt;. Some usable applications will disappear one day. Yes, Google is pushing hard on Progressive Web Apps (PWAs), but the list of these apps are still limited. I appreciate this concept, but far from mature.&lt;&#x2F;p&gt;
&lt;p&gt;Then, we can use Android Apps! Play Store has many many many apps, some of them are very powerful!&lt;&#x2F;p&gt;
&lt;p&gt;Yes, you do have a lot of choices, but again, there are at least two deadly problems.&lt;&#x2F;p&gt;
&lt;p&gt;Android apps are not designed for ChromeOS. Many apps will not and do not adjust to the ChromeOS, not to mention the interface, but even the functionality. You will then result in a severely discounted using experience.&lt;&#x2F;p&gt;
&lt;p&gt;Big companies are able to invest more to adjust their Android Apps for ChromeOS. But then, many big companies have already offered mature websites that provide the same function. &lt;&#x2F;p&gt;
&lt;p&gt;And the ways of Android app running on ChromeOS is also problematic. It requires a whole bunch of dependencies, though would be installed automatically, the running speed is far from being native.&lt;&#x2F;p&gt;
&lt;p&gt;In short, this is a double discount. Discounted user experience, discounted running speed.&lt;&#x2F;p&gt;
&lt;p&gt;Then we have a Linux virtual machine on ChromeOS. Ah... another disaster. The speed of the virtual machine was simply slow. Loading of the applications is slow, execution is slow, everything runs slow.&lt;&#x2F;p&gt;
&lt;p&gt;I originally thought that might be related to the specifications of my Chromebook. I am using a Samsung Chromebook Plus V2. But when I tried to use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dnschneid&#x2F;crouton&quot;&gt;Crouton&lt;&#x2F;a&gt; (again, this project is killed by Google). I realized my Chromebook can run Linux software in a native environment fast, and very fast. I tried to run some a javascript speed test named &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;testdrive-archive.azurewebsites.net&#x2F;performance&#x2F;chalkboard&#x2F;&quot;&gt;Chalkboard&lt;&#x2F;a&gt;, surprisingly, the Firefox running crouton, is much faster than the Chrome in ChromeOS. (Not to mention the Firefox in the Crostini Linux virtual machine.)&lt;&#x2F;p&gt;
&lt;p&gt;And when I run a Debian in crouton, the speed of loading applications is very fast! I do have an even better user experience than ChromeOS itself. (What makes it sad is that I need to return to ChromeOS on my Samsung Chromebook Plus V2, the reason is Debian does not have the driver for the speaker. And as Google abandoned crouton, the support on Linux is very minimal. The general ChromeOS support is already minimal, you can see how struggling it can be for a user who wish to use crouton now.)&lt;&#x2F;p&gt;
&lt;p&gt;The Speed of ChromeOS is a myth when compared with a proper Linux.&lt;&#x2F;p&gt;
&lt;p&gt;Sometimes, we do need to spend a lot of time on Google searching for some workaround that only exists on ChromeOS.&lt;&#x2F;p&gt;
&lt;p&gt;I needed to use a lot of time to find the actual solution to use a built-in OpenVPN function without the need to enable the Android working environment. If I was using MacOS &#x2F; Windows &#x2F; Linux, using these functions can be just a few buttons. ChromeOS makes it very difficult to use.&lt;&#x2F;p&gt;
&lt;p&gt;Just a reminder, I just showed the hassle of playing different videos on ChromeOS. You might need to download an Android app with limited function, a Linux application with many settings needed.&lt;&#x2F;p&gt;
&lt;p&gt;To add on this point, by the way, I cannot find a native method to access my NAS through Webdav. Maybe the meaning of simplicity for Google is not to provide enough functions.&lt;&#x2F;p&gt;
&lt;p&gt;And I forgot to mention the files of ChromeOS, Android Apps and Linux Virtual Machines are located in three different file systems, accessing these documents are often a nightmare. You need to find their location.&lt;&#x2F;p&gt;
&lt;p&gt;Then, Simplicity? Really that simple?&lt;&#x2F;p&gt;
&lt;p&gt;Speed? What is your definition of speed?&lt;&#x2F;p&gt;
&lt;p&gt;As a user, ChromeOS is not comprimising enough and often end up in disappointment. So this is why ChromeOS can never be a good OS.&lt;&#x2F;p&gt;
&lt;p&gt;We do have hope, Google has another project, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;9to5google.com&#x2F;2022&#x2F;02&#x2F;10&#x2F;bruschetta-linux-chrome-os&#x2F;&quot;&gt;you may be able to choose your linux distro&lt;&#x2F;a&gt;. But similar to the dark mode in ChromeOS, which spent a few years in experimental functions. Just stay hopeful, when Google finally release this function, my Chromebook is still functioning.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
