<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	xmlns:media="http://search.yahoo.com/mrss/"
	>
  <channel>
    <title><![CDATA[每特17劃]]></title>
    <atom:link href="https://6bcf7279.info/feed/" rel="self" type="application/rss+xml" />
    <link>https://6bcf7279.info/</link>
    <description><![CDATA[每特17劃]]></description>
    <lastBuildDate>Mon, 02 Jun 2025 00:00:00 +0000</lastBuildDate>
    <language>zh</language>
    <sy:updatePeriod> weekly </sy:updatePeriod>
    <sy:updateFrequency> 1 </sy:updateFrequency>
    <generator>Hugo 0.140.2 modified</generator>
    <image>
      <url>https://6bcf7279.info/img/logo.png</url>
      <title><![CDATA[每特17劃]]></title>
      <link>https://6bcf7279.info/</link>
    </image>
    <item>
      <title><![CDATA[決勝於千里之外]]></title>
      <link>https://6bcf7279.info/2025/06/02/109ff9b2/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Mon, 02 Jun 2025 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2025/06/02/109ff9b2/</guid>
      <description><![CDATA[<h1 id="決勝於千里之外">決勝於千里之外</h1>
<p>有時候路過一間旅館時，覺得其外觀、環境、&hellip; 都很吸引人，讓人很想進去住一晚，便心想，這旅館條件很棒，生意應該很好吧？！</p>
<p>然而，旅館的生意好壞，是取決於當下街道路人經過所看到的外觀嗎？</p>]]></description>
      <content:encoded><![CDATA[<h1 id="決勝於千里之外">決勝於千里之外</h1>
<p>有時候路過一間旅館時，覺得其外觀、環境、&hellip; 都很吸引人，讓人很想進去住一晚，便心想，這旅館條件很棒，生意應該很好吧？！</p>
<p>然而，旅館的生意好壞，是取決於當下街道路人經過所看到的外觀嗎？</p>
<p>很少人是到當地，看到門面，才決定直接入住的，而是在出發前，就已透過訂房網頁、Google Maps、旅遊情報就決定要住那一家的。</p>
<p>因此，決勝的關鍵，並不在當地旅館的外觀，而是在千里之外的訂房網站、旅遊情報網頁的曝光處。</p>
]]></content:encoded>
          
      <media:content url="https://6bcf7279.info/2025/06/02/109ff9b2/" medium="image">
        <media:title type="html"></media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[Unofficial Markdown embed、小語法、大影響]]></title>
      <link>https://6bcf7279.info/2024/10/11/def781bf/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2024/10/11/def781bf/</guid>
      <description><![CDATA[<h1 id="unofficial-markdown-embed小語法大影響">Unofficial Markdown embed、小語法、大影響</h1>
<p>幾日前(2024-09-30)，我意外在<a href="https://forum.obsidian.md/t/displaying-embedded-file-content/69337/3">論壇</a>上發現 <a href="https://obsidian.md/">Obsidian</a> 支援一個小語法：</p>
<pre tabindex="0"><code>![some_note](some_note.md#section_name)
</code></pre><p>其作用是，將 <code>some_note.md</code> 的指定 <code>section_name</code> 段落，embed 到眼前的 Markdown 文件裡直接顯示。</p>]]></description>
      <content:encoded><![CDATA[<h1 id="unofficial-markdown-embed小語法大影響">Unofficial Markdown embed、小語法、大影響</h1>
<p>幾日前(2024-09-30)，我意外在<a href="https://forum.obsidian.md/t/displaying-embedded-file-content/69337/3">論壇</a>上發現 <a href="https://obsidian.md/">Obsidian</a> 支援一個小語法：</p>
<pre tabindex="0"><code>![some_note](some_note.md#section_name)
</code></pre><p>其作用是，將 <code>some_note.md</code> 的指定 <code>section_name</code> 段落，embed 到眼前的 Markdown 文件裡直接顯示。</p>
<p>這個 embed 的需求不是什麼新概念，從最早的 HTML 的 <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe">iframe</a> 跟 <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed">embed</a> 到後來 Jekyll 的 <a href="https://jekyllrb.com/docs/includes/#including-files-relative-to-another-file">include</a> ，都有類似的用法。</p>
<p>但 Obsidian 所支援的這語法，方便而直覺，因為跟原本 embed 圖檔、PDF的語法相近，例如：</p>
<pre tabindex="0"><code>![some_picture](some_picture.jpg)
![some_document](some_document.pdf)
</code></pre><p>而其後的 <code>#</code> 後綴，也跟 URL 的標準用法一致，例如：</p>
<pre tabindex="0"><code>https://url.spec.whatwg.org/#dom-url-hash
</code></pre><p>（註：上述直接指向目標網頁的 &ldquo;dom-url-hash&rdquo; 的段落）</p>
<p>可說是最接近自然預期的理想語法了。</p>
<h2 id="筆記需求">筆記需求</h2>
<p>那，這有什麼影響？</p>
<p>以近日看到 Fourdollars 於 TOSSUG 的臉書分享了一篇文章 <a href="https://xairy.io/articles/thinkpad-xdci">🤫 Unlocking secret ThinkPad functionality for emulating USB devices | Andrey Konovalov</a> 為例。</p>
<p>若我想整理心得到筆記裡的話，要編輯到的地方可能有好幾處：</p>
<ul>
<li><code>Fourdollars, 李世元, Shih-Yuan Lee.md</code>
<ul>
<li>此處留個標記。因為日後可能會以：“&hellip;印象中 Fourdollars 好像曾分享過一篇文章&hellip;”像這樣的方式回憶起來。</li>
</ul>
</li>
<li><code>Andrey Konovalov.md</code>
<ul>
<li>於原作者的條目下，記錄主要內容。</li>
</ul>
</li>
<li><code>ACPI.md</code>
<ul>
<li>標記用到 <code>acpixtract</code>, <code>iasl</code> 的實際案例。</li>
</ul>
</li>
<li><code>FT2232H.md</code>
<ul>
<li>提到用 <code>flashrom</code> 跟 FT2232H 刷 Flash 記憶體的方式。</li>
</ul>
</li>
<li><code>SPI.md</code>
<ul>
<li>提到刷主機板上 SPI 晶片 的問題。</li>
</ul>
</li>
<li><code>USB.md</code>
<ul>
<li>關聯到 USB OTG, USB Raw Gadget 的知識。</li>
</ul>
</li>
<li><code>ThinkPad.md</code>
<ul>
<li>文中 提到 ThinkPad X1 Carbon 機型。</li>
</ul>
</li>
<li><code>XPS 13.md</code>
<ul>
<li>文尾提到 XPS 13 也能開啟同樣功能。</li>
</ul>
</li>
</ul>
<p>算起來至少有 8 個地方。</p>
<h2 id="那麼該怎麼編輯">那麼，該怎麼編輯？</h2>
<h3 id="複本法">複本法</h3>
<p>若採“複本法”，即在一處寫下來，然後複製到其他 7 處。</p>
<p>雖能留下內容，但會遇到困境如下：</p>
<ul>
<li>有 8 處重複的文本內容</li>
<li>若其中一處修改，必須同步更新其他 7 處</li>
<li>若無法同步更新，則會產生資料不一致，而折損對資料的信任感</li>
</ul>
<h3 id="連結法">連結法</h3>
<p>若採“連結法”，即在一處寫下來，再以 URL 捷徑、內部連結、等傳送門機制，轉連接到其他 7 處。</p>
<p>此法雖能避免重複內容，但缺點也很明顯。就是只看 URL 跟連結，不易回想起相關的心得內容 ，以致於搜尋瀏覽時，容易跳過。而若要一一點擊進去看，則效率低落，而且容易分神。</p>
<h3 id="分拆法">分拆法</h3>
<p>而介於“複本法”與“連結法”的之一作法，是將心得的內文依主題分拆，而分別存放到對應的筆記條目去。例如，分拆部分內容，而記到 ACPI 、 USB、 等等的條目下，再附連結回原始心得文本。</p>
<p>這樣作雖可避開內容重複的問題，卻無可避免的造成筆記內容的支離破碎，而不易吸收跟重用。更要命的是，要分拆、分類、編修多處文件，才能記好一份心得。這成本太高，難以持續。</p>
<h3 id="embed-法">Embed 法</h3>
<p>綜上所述， embed 法，也就是最開頭提到的功能，其實就是（就我所知的）最好的解答。</p>
<p>一行簡單的語法就能重複引用並顯示到多個地方，同時變更編輯只在原始條目一處，從根本上就滿足資料的一致性。</p>
<h2 id="案例-todo-用法">案例： TODO 用法</h2>
<p>每個專案有各自的 TODO list ， 自己也有個人的總 TODO list 清單，該如何組織？</p>
<p>假設個人總清單為 <code>TODO.md</code> ，並有其他專案 <code>Project01.md</code>, <code>Project02.md</code>，例舉測試內容如下：</p>
<ul>
<li>
<p><code>TODO.md</code>:</p>
<pre tabindex="0"><code>## My TODOs

- [ ] task01
- [ ] task02
- [x] task03


## Project01

![Project01](Project01.md#TODO)


## Project02

![Project02](Project02.md#TODO)
</code></pre></li>
<li>
<p><code>Project01.md</code>:</p>
<pre tabindex="0"><code>## TODO

- [x] task01
- [ ] task02
- [ ] task03

## Notes

... blahblah ...
</code></pre></li>
<li>
<p><code>Project02</code>:</p>
<pre tabindex="0"><code>## TODO

- [ ] task01
- [x] task02
- [ ] task03

## Notes

... blahblah ...
</code></pre></li>
</ul>
<p>在 Obsidian 下， <code>TODO.md</code> 總清單的瀏覽效果如下：</p>
<p>
  <img src="attachments/28e874a8a8caa0b05e708aa56af62a26.png" alt="Pasted image 20241011201953.png">

</p>
<p>如此安排的好處如下：</p>
<ul>
<li>在個人 <code>TODO.md</code> 總清單，可一處集成顯示所有他處的 TODO list
<ul>
<li>方便每日例行檢視，而不用再一一點開每個子項目</li>
</ul>
</li>
<li>各個專案的文件專注顯示並維護自己局部的 TODO list</li>
<li>在 embed 的框頁面 裡，不能直接編輯內容。而是，注意到右邊有個連接圖示，點入進到對應的頁面再編輯。</li>
<li>另外，我意外發現，在 embed 的框頁面裡，checkbox 是可以直接 toggle 更新的。</li>
</ul>
<h2 id="小語法大影響">小語法、大影響</h2>
<p>從上述的討論可以瞭解到，此一 Embed 的語法，不僅僅只是方便顯示的功能而已，而是會聯動到知識內容的整體組織方法。</p>
<p>改變有多大，還不曉得。因為發現這才幾天的時間，目前還在摸索適應的重構中。</p>
<p>但至少最明顯的差異之一是，不用再糾結於某個段落要放分類 A ，還是放分類 B 。在新方法下，可以不用作選擇，直接全都要。</p>
]]></content:encoded>
          
          
      <enclosure url="https://6bcf7279.info/2024/10/11/def781bf/attachments/28e874a8a8caa0b05e708aa56af62a26.png" length="42384" type="image/png" />
      <media:content url="https://6bcf7279.info/2024/10/11/def781bf/attachments/28e874a8a8caa0b05e708aa56af62a26.png" medium="image">
        <media:title type="html">Pasted image 20241011201953.png</media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[以 docker 安裝設定 Zephyr 編譯環境 for ESP32]]></title>
      <link>https://6bcf7279.info/2024/07/08/a9ef1d06/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Mon, 08 Jul 2024 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2024/07/08/a9ef1d06/</guid>
      <description><![CDATA[<h1 id="以-docker-安裝設定-zephyr-編譯環境-for-esp32">以 docker 安裝設定 Zephyr 編譯環境 for ESP32</h1>
<p>因作  Bluetooth thermometer + esp32 hacking 之故，加上 pepe2k 也推薦這個，便決定試試 <a href="https://zephyrproject.org/">Zephyr</a> 。後來克服過程中一些障礙，也順利試出來了。在此整理分享一二。</p>
<p>首次接觸的人，推薦先從官方提供的 <a href="https://docs.zephyrproject.org/latest/develop/getting_started/index.html">Getting Started Guide</a> 文件入手。依文件一一操作完成編譯並運作 sample demo 的流程，而對 Zephyr 的運作有了具體的感覺之後，再進入編寫應用程式的階段即可。Zephyr 附有許多結構良好的範例程式(見 <a href="https://github.com/zephyrproject-rtos/zephyr/tree/main/samples">zephyr/samples</a> )，在撰寫應用程式時，有許多可以參考對照的地方，幫助很大。</p>]]></description>
      <content:encoded><![CDATA[<h1 id="以-docker-安裝設定-zephyr-編譯環境-for-esp32">以 docker 安裝設定 Zephyr 編譯環境 for ESP32</h1>
<p>因作  Bluetooth thermometer + esp32 hacking 之故，加上 pepe2k 也推薦這個，便決定試試 <a href="https://zephyrproject.org/">Zephyr</a> 。後來克服過程中一些障礙，也順利試出來了。在此整理分享一二。</p>
<p>首次接觸的人，推薦先從官方提供的 <a href="https://docs.zephyrproject.org/latest/develop/getting_started/index.html">Getting Started Guide</a> 文件入手。依文件一一操作完成編譯並運作 sample demo 的流程，而對 Zephyr 的運作有了具體的感覺之後，再進入編寫應用程式的階段即可。Zephyr 附有許多結構良好的範例程式(見 <a href="https://github.com/zephyrproject-rtos/zephyr/tree/main/samples">zephyr/samples</a> )，在撰寫應用程式時，有許多可以參考對照的地方，幫助很大。</p>
<p>在 Linux 的部份，Zephyr 文件是以 Ubuntu 為準。對於非 Ubuntu/Debian 的 Linux 用戶，若沒把握自行搞定中間差異的話，建議直接使用 <code>docker</code> 另開一個 Ubuntu container 來操作。</p>
<p>不過，開 container 雖然方便，但也會面臨幾個基本問題：</p>
<ul>
<li>Ubuntu container 內的 <code>UID</code> 和 Host OS 的 <code>UID</code> 不一致</li>
<li>於 Ubuntu container 內能否存取 Host OS 的 <code>/dev/ttyUSB0</code> 並刷 firmware</li>
</ul>
<p>所幸摸索後，都一一找到方法解決了。後面會逐一解說。這過程我於下方整理成一份 script ，提供一個直達車的捷徑，方便有需要的人更容易獲取使用。</p>
<h2 id="step-by-step-hello-world">Step-by-step hello world</h2>
<p>需要預先準備的事項有：</p>
<ul>
<li>Linux 系統</li>
<li><code>docker</code></li>
<li>17 GB 的硬碟空間</li>
<li>預留 30~40 分鐘的時間，主要等 Zephyr git repos 跟 SDK tarball 的下載</li>
<li>目標硬體，例如: ESP32-C3</li>
</ul>
<p>初入門就先從建立環境並編譯試跑 <code>samples/hello_world</code> 開始。</p>
<h3 id="step-1">Step 1.</h3>
<p>先建一個專案目錄，例如 <code>~/my_zephyr_test/</code></p>
<pre tabindex="0"><code>mkdir -p ~/my_zephyr_test/
</code></pre><h3 id="step-2">Step 2.</h3>
<p>於該目錄內，建立一 script 檔案 <code>run_zephyr_docker</code> 並 <code>chmod +x</code> 給予執行權限。script 檔案內容如下:</p>
<pre tabindex="0"><code>#!/usr/bin/env bash

function run_as_root() {
	cd /home/ubuntu/zephyrproject || exit

	# Guest OS&#39; UID might be different with Host OS&#39; UID
	# Here we update the UID(default is 1000) to the Host OS&#39; UID first before setup
	username=&#34;ubuntu&#34;
	UID_OLD=$(id --user $username)
	UID_NEW=$(stat -c %u .)
	if [ -n &#34;$UID_NEW&#34; -a &#34;$UID_OLD&#34; != &#34;$UID_NEW&#34; ]; then
		groupmod -g $UID_NEW $username
		usermod -u $UID_NEW $username
		find / \( -path &#34;/proc&#34; -o -path &#34;/dev&#34; \) -prune -group $UID_OLD -exec chgrp -v -h $UID_NEW {} \;
		find / \( -path &#34;/proc&#34; -o -path &#34;/dev&#34; \) -prune -user $UID_OLD -exec chown -v -h $UID_NEW {} \;
	fi

	# Modify Guest OS&#39; uucp GID and add default user to uucp group
	# for permission of accessing /dev/ttyUSB0
	UUCP_GID=$(getent group uucp | cut -d: -f3)
	HOSTOS_UUCP_GID=$(stat -c %g /dev/ttyS0)
	if [ -n &#34;$UUCP_GID&#34; -a &#34;$UUCP_GID&#34; != &#34;$HOSTOS_UUCP_GID&#34; ]; then
		groupmod -g $HOSTOS_UUCP_GID uucp
	fi
	usermod -aG uucp $username

	# Install and configure tzdata first to bypass the waiting prompt
	apt update
	echo &#34;tzdata tzdata/Areas select Asia&#34; | debconf-set-selections
	echo &#34;tzdata tzdata/Zones/Asia select Taipei&#34; | debconf-set-selections
	DEBIAN_FRONTEND=noninteractive apt install -y tzdata

	# Preinstall required tools
	apt install -y sudo picocom expect
	echo &#34;$username ALL=(ALL) NOPASSWD:ALL&#34; &gt;/etc/sudoers.d/$username
	sudo -i -u $username run_zephyr_docker user
}

# Ref: https://docs.zephyrproject.org/latest/develop/getting_started/index.html#get-zephyr-and-install-python-dependencies
function get_zephyr_and_install_python_dependencies() {
	sudo env DEBIAN_FRONTEND=noninteractive apt install -y python3-venv
	python3 -m venv ~/zephyrproject/.venv
	source ~/zephyrproject/.venv/bin/activate

	sudo apt install -y --no-install-recommends git cmake ninja-build gperf \
		ccache dfu-util device-tree-compiler wget \
		python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
		make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1

	pip install west
	west init ~/zephyrproject
	cd ~/zephyrproject
	west update || west update || west update # retry 3 times
	west zephyr-export
	pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt
}

# Ref: https://docs.zephyrproject.org/latest/develop/getting_started/index.html#install-the-zephyr-sdk
function install_the_zephyr_sdk() {
	(
		cd ~/zephyrproject
		wget --continue https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.8/zephyr-sdk-0.16.8_linux-x86_64.tar.xz
		tar xf zephyr-sdk-0.16.8_linux-x86_64.tar.xz
		cd zephyr-sdk-0.16.8
		expect -c &#34;spawn ./setup.sh; expect -re \&#34;.*Install host tools.*\&#34;; send \&#34;y\r\n\&#34;; expect -re \&#34;.*Register Zephyr SDK CMake package.*\&#34;; send \&#34;y\r\n\&#34;; interact;&#34;
	)
}

function install_esp32_dependencies() {
	west blobs fetch hal_espressif || west blobs fetch hal_espressif || west blobs fetch hal_espressif
}

function setup_shortcut() {
	cat &gt;&gt;~/.bash_aliases &lt;&lt;EOD
alias lls=&#39;ls --time-style=full-iso -l&#39;
EOD
}

function run_as_user() {
	get_zephyr_and_install_python_dependencies
	install_the_zephyr_sdk
	install_esp32_dependencies
	setup_shortcut

	printf &#34;Entering shell...\n&#34;
	bash
}

case &#34;$1&#34; in
root)
	run_as_root
	;;
user)
	run_as_user
	;;
*)
	[ -e /.dockerenv ] &amp;&amp; {
		echo &#34;Already in docker, skip.&#34;
		break
	}
	docker run -it --rm \
		--privileged -v /dev:/dev \
		-v $(pwd):/home/ubuntu/zephyrproject/ \
		-v $(readlink -f $0):/usr/local/bin/run_zephyr_docker \
		ubuntu:24.04 \
		run_zephyr_docker root
	;;
esac
</code></pre><p>備註:</p>
<ul>
<li><code>docker</code> 的選項說明:
<ul>
<li><code>--rm</code> , 於終止後刪除該 container ，避免佔空間</li>
<li><code>--priviledge -v /dev:/dev</code> , 用於 flash firmware 時存取 Host OS 的 <code>/dev/ttyUSB0</code></li>
</ul>
</li>
</ul>
<h3 id="step-3">Step 3.</h3>
<p>之後進到該目錄，並執行指令如下:</p>
<pre tabindex="0"><code>cd ~/my_zephyr_test/
./run_zephyr_docker
</code></pre><p>執行完成後，預計會得到畫面如下：</p>
<p>
  <img src="attachments/ef1d9829667cbc796b395c802f0aa05e.png" alt="Pasted image 20240711021410.png">

</p>
<p>此時，Zephyr 的編譯環境已經安裝好了。</p>
<h3 id="step-4">Step 4.</h3>
<p>於 container 環境內，進一步下指令:</p>
<pre tabindex="0"><code>cd ~/zephyrproject/zephyr/
west build -p always -b esp32c3_devkitm samples/hello_world/
</code></pre><p>預期會得到結果如下:</p>
<p>
  <img src="attachments/03389c23cf7ee9bb522475c10740857b.png" alt="Pasted image 20240716004131.png">

</p>
<p>而 build 出來的 image 檔案，預計會在 <code>~/zephyrproject/zephyr/build/zephyr/zephyr.bin</code> 的位置。</p>
<h3 id="step-5">Step 5.</h3>
<p>之後再刷到目標硬體上，指令如下：</p>
<pre tabindex="0"><code>cd ~/zephyrproject/zephyr/build/
west flash -d . --skip-rebuild
</code></pre><p>預期結果如下：</p>
<p>
  <img src="attachments/06da9720b8919b7a93880eaaf310d5de.png" alt="Pasted image 20240716004619.png">

</p>
<p>之後再透過 <code>picocom</code> 工具觀看目標硬體的 console logs 即可，例如:</p>
<pre tabindex="0"><code>picocom -b 115200 /dev/ttyUSB0
</code></pre><p>參考 demo 如下：</p>
<p>
  <img src="attachments/a9c154095ad532eaf47f0ab1700368b0.png" alt="Pasted image 20240716005155.png">

</p>
<p>至此，就完成整個流程了。</p>
<p>後續的應用程式開發，只要將 <code>samples/hello_world</code> 代換成要開發的目標程式即可。</p>
<h2 id="reinstall">Reinstall</h2>
<p>若要重來一次的話，要留意前一次執行留下的檔案，會影響後一次的執行。因此需要先清理目錄如下：</p>
<p>（注意！若 <code>zephyr/</code> 有修改的部分，記得要先備份。）</p>
<pre tabindex="0"><code>rm -rf bootloader/ modules/ tools/ .venv/ .west/ zephyr-sdk-0.16.8/
rm -rf zephyr/ 
</code></pre><h2 id="何不用-zephyr-build-docker-image">何不用 <code>zephyr-build</code> docker image？</h2>
<p>在弄完 script 之後，我才發現到 <a href="https://hub.docker.com/r/zephyrprojectrtos/zephyr-build">zephyr-build</a> 的存在。</p>
<p>實際試用後，觀察如下：</p>
<ul>
<li>主要文件為: <a href="https://github.com/zephyrproject-rtos/docker-image">zephyrproject-rtos/docker-image</a>
<ul>
<li>官方文件網站 <a href="https://docs.zephyrproject.org/latest/index.html">Zephyr Project Documentation</a> 似乎沒有對應的文件</li>
</ul>
</li>
<li>內建預裝需要的 Python 套件以及 SDK</li>
<li>沒有初始化 zephyr workplace , 要自行 init</li>
<li>有 VNC server</li>
<li>一樣有 Host OS 的 UID/GID 不一致問題，以及 <code>/dev/ttyUSB0</code> 存取問題</li>
<li>由 CI/CD 的 container image 延伸而來</li>
<li>其 container image 約佔 14GB 上下</li>
</ul>
<p>因 <code>zephyr-build</code> 未在官方文件網站中提及，未來也可能會隨 CI/CD 而需求而變化。比較適合已經熟悉 Zephyr 用法的開發者，對於初學者可能還是建議以 <a href="https://docs.zephyrproject.org/latest/develop/getting_started/index.html">Getting Started Guide</a> 為主。</p>
<p>為方便一鍵執行使用，也比照整理了一份 script 如下。</p>
<p>於 <code>~/my_zephyr_test/</code> 目錄裡建立一個 <code>run_zephyr-build</code> 的 script 檔案如下:</p>
<pre tabindex="0"><code>#!/usr/bin/env bash

TMPF=$(mktemp)

cat &gt;$TMPF &lt;&lt;&#39;EOD&#39;
# Generate executable file to run as root
cat &gt; /tmp/run_cmd_root &lt;&lt;EODD
#!/usr/bin/env bash

USERNAME=$(whoami)
UID_OLD=$(id -u)
UID_NEW=$(stat -c %u $(readlink -f $0))
usermod -u \$UID_NEW \$USERNAME
groupmod -g \$UID_NEW \$USERNAME
find / \( -path &#34;/proc&#34; -o -path &#34;/dev&#34; \) -prune -group \$UID_OLD -exec chgrp -v -h \$UID_NEW {} \;
find / \( -path &#34;/proc&#34; -o -path &#34;/dev&#34; \) -prune -user \$UID_OLD -exec chown -v -h \$UID_NEW {} \;

# Modify Guest OS&#39; uucp GID and add default user to uucp group
# for permission of accessing /dev/ttyUSB0
GID_UUCP=$(stat -c %g /dev/ttyS0)
groupmod -g \$GID_UUCP uucp
usermod -aG uucp \$USERNAME

PWD=/workdir sudo --preserve-env=PWD -u \$USERNAME bash
EODD

chmod +x /tmp/run_cmd_root
sudo -u root /tmp/run_cmd_root
EOD
chmod a+rxx $TMPF

docker run -ti --rm -v $(pwd):/workdir \
	--privileged -v /dev:/dev \
	-v $TMPF:/usr/local/bin/run_cmd \
	ghcr.io/zephyrproject-rtos/zephyr-build:main \
	run_cmd

rm $TMPF
</code></pre><p>並於 <code>~/my_zephyr_test/</code> 的目錄中執行即可。</p>
<h2 id="問題解說">問題解說</h2>
<h3 id="與-host-os-的-uid-不同">與 Host OS 的 UID 不同</h3>
<p>在  Ubuntu container 裡，預設的使用者 <code>ubuntu</code> 的 UID 是 <code>1000</code>。可能和 Host OS 的 Linux 的 UID 不一致，那掛載進去的檔案就會遇到讀寫權限的問題。</p>
<p>解決辦法是在 container 啟動之初, 就先變更 <code>ubuntu</code> 的 UID/GID 到和 Host OS 一致。具體指令如下:</p>
<pre tabindex="0"><code>UID_NEW=$(stat -c %u .)
groupmod -g $UID_NEW ubuntu
usermod -u $UID_NEW ubuntu
find / \( -path &#34;/proc&#34; -o -path &#34;/dev&#34; \) -prune -group 1000 -exec chgrp -v -h $UID_NEW {} \;
find / \( -path &#34;/proc&#34; -o -path &#34;/dev&#34; \) -prune -user 1000 -exec chown -v -h $UID_NEW {} \;
</code></pre><h3 id="存取-devttyusb0-刷-firmware">存取 /dev/ttyUSB0 刷 firmware</h3>
<p>在 Ubuntu ccontainer 裡要順利用 <code>west flash</code> 刷 firmware。大致需要兩項設定。</p>
<p>其一, <code>docker run</code> 指令需要加上一些選項允許 container 存取 Host OS 的裝置。例如 <code>--device=/dev/ttyUSB0</code> 或 <code>--privileged -v /dev:/dev</code> 。</p>
<p>註： <code>--privileged -v /dev:/dev</code> 的用法比較不安全，但卻是成功率比較高的作法。因為此處是單人本機使用，所以故採用之。進一步的探討，可參考 Stack Overflow 上的討論串: <a href="https://stackoverflow.com/questions/24225647/docker-a-way-to-give-access-to-a-host-usb-or-serial-device">Docker - a way to give access to a host USB or serial device?</a></p>
<p>其二, 需要將使用者 <code>ubuntu</code> 加到 <code>uucp</code> 的群組裡。具體指令如下:</p>
<pre tabindex="0"><code>usermod -aG uucp ubuntu
</code></pre><p>另外，要注意的是， Host OS 的 <code>uucp</code> GID 跟 container 裡的 <code>uucp</code> GID 可能不同。若不同時，會需要將 container 裡的 GID 修改和 Host OS 一致。</p>
<pre tabindex="0"><code>groupmod -g $HostOS_GID_UUCP uucp
</code></pre><h3 id="apt-install-的-timezone-設定-prompt">apt install 的 timezone 設定 prompt</h3>
<p>在 Ubuntu container 第一次執行 <code>apt install</code> 時, 程序會停下來等使用者輸入選擇時區，而阻礙了全自動進行。</p>
<p>解法之一是利用 <code>debconf-set-selections</code> 的機制，先餵指定時區供 <code>apt</code> 取用，參考指令如下：</p>
<pre tabindex="0"><code>echo &#34;tzdata tzdata/Areas select Asia&#34; | debconf-set-selections
echo &#34;tzdata tzdata/Zones/Asia select Taipei&#34; | debconf-set-selections
DEBIAN_FRONTEND=noninteractive apt install -y tzdata
</code></pre><h3 id="安裝-sdk-時的-prompt">安裝 SDK 時的 prompt</h3>
<p>會遇到 prompt 而停下來等待用戶 yes/no 的輸入，而阻礙自動執行。</p>
<p>解法是用 <code>expect</code> 來自動應答，指令如下：</p>
<pre tabindex="0"><code>expect -c &#34;spawn ./setup.sh; expect -re \&#34;.*Install host tools.*\&#34;; send \&#34;y\r\n\&#34;; expect -re \&#34;.*Register Zephyr SDK CMake package.*\&#34;; send \&#34;y\r\n\&#34;; interact;&#34;
</code></pre>]]></content:encoded>
          
          
      <enclosure url="https://6bcf7279.info/2024/07/08/a9ef1d06/attachments/ef1d9829667cbc796b395c802f0aa05e.png" length="113216" type="image/png" />
      <media:content url="https://6bcf7279.info/2024/07/08/a9ef1d06/attachments/ef1d9829667cbc796b395c802f0aa05e.png" medium="image">
        <media:title type="html">Pasted image 20240711021410.png</media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[邏輯分析儀 Lcsot Mini Board, CY7C68013A, Geeetech]]></title>
      <link>https://6bcf7279.info/2024/06/12/c052e42a/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Wed, 12 Jun 2024 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2024/06/12/c052e42a/</guid>
      <description><![CDATA[<h1 id="邏輯分析儀-lcsot-mini-board-cy7c68013a-geeetech">邏輯分析儀 Lcsot Mini Board, CY7C68013A, Geeetech</h1>
<p>為了分析 LCD 七段顯示器的訊號，而購置邏輯分析儀。我買的是 <a href="https://sigrok.org/wiki/Lcsoft_Mini_Board">Lcsoft Mini Board(Geeetech)</a> , 最終實物如下:</p>
<p>
  <img src="attachments/c7337bc786727de61d84691bf0d55ae5.png" alt="">

</p>
<p>邏輯分析儀有多種等級規格。
因為是初學者，沒有實際經驗下，憑空比較規格沒有感覺。
於是打算先買初階入門級使用，待有了使用體驗後，未來有機緣需要再進行擴充。</p>]]></description>
      <content:encoded><![CDATA[<h1 id="邏輯分析儀-lcsot-mini-board-cy7c68013a-geeetech">邏輯分析儀 Lcsot Mini Board, CY7C68013A, Geeetech</h1>
<p>為了分析 LCD 七段顯示器的訊號，而購置邏輯分析儀。我買的是 <a href="https://sigrok.org/wiki/Lcsoft_Mini_Board">Lcsoft Mini Board(Geeetech)</a> , 最終實物如下:</p>
<p>
  <img src="attachments/c7337bc786727de61d84691bf0d55ae5.png" alt="">

</p>
<p>邏輯分析儀有多種等級規格。
因為是初學者，沒有實際經驗下，憑空比較規格沒有感覺。
於是打算先買初階入門級使用，待有了使用體驗後，未來有機緣需要再進行擴充。</p>
<h2 id="linux-下可以用嗎">Linux 下可以用嗎?</h2>
<p>身為 Linux 使用者，買硬體前一定會問個問題：在 Linux 下可以用嗎？</p>
<p>這通常會分成兩道關卡:</p>
<ul>
<li>Linux 下的驅動程式</li>
<li>配套的應用軟體，及其支援硬體</li>
</ul>
<p>以上兩者都可以，可以放心買沒問題。</p>
<h2 id="驅動程式">驅動程式</h2>
<p>這個裝置的主晶片是 CY7C68013A，USB 的 VID:PID 是 <code>04b4:8613</code> 。在 <a href="https://linux-hardware.org/">Linux Hardware Database</a> 可查得支援資訊如下:</p>
<ul>
<li><a href="https://linux-hardware.org/?id=usb:04b4-8613">Cypress Semiconductor CY7C68013 EZ-USB FX2 USB 2.0 Development Kit</a></li>
</ul>
<p>於 Linux kernel 內建支援，不用另裝驅動程式。</p>
<h2 id="sigrok-pulseview">Sigrok, PulseView</h2>
<p>在 Linux 下有 <a href="https://sigrok.org">sigrok</a> 軟體專案支援邏輯分析儀、示波器、數位三用電錶的設備，其 GUI 則是 <a href="https://sigrok.org/wiki/PulseView">PulseView</a> 。</p>
<p>網頁上有列目前支援的硬體相容性清單:</p>
<ul>
<li><a href="https://sigrok.org/wiki/Supported_hardware#Logic_analyzers">Supported hardware - sigrok</a></li>
</ul>
<p>我的需求大致上有:</p>
<ul>
<li>需要 16 channel (因為要分析到 13~14 pinout)</li>
<li>有 Linux driver 支援</li>
<li>容易負擔取得</li>
</ul>
<p>以此篩選後，大致上鎖定以 CY7C68013A based 的數個型號。</p>
<h2 id="3d列印外殼">3D列印外殼</h2>
<p>在多個 CY7C68013A based 的型號選擇下，最終選擇了:</p>
<ul>
<li><a href="https://sigrok.org/wiki/Lcsoft_Mini_Board">Lcsoft Mini Board - sigrok</a></li>
</ul>
<p>其中一個關鍵的因素是，它有數個 3DP 社群製作的貼心配件。
例如，蒐集到的有(依創作時間排序):</p>
<ul>
<li>2012-06-02 , <a href="https://www.thingiverse.com/thing:24086">Case for LCsoft CY7C68013A logic analyser clone by jamesglanville - Thingiverse</a></li>
<li>2017-03-05 , <a href="https://www.thingiverse.com/thing:2153437">CY7C68013A box for logic analyzer by bobtidey - Thingiverse</a></li>
<li>2018-10-23 , <a href="https://www.thingiverse.com/thing:3171005">Case for Cypress Logic Analyzer LCSOFT by goddisignz - Thingiverse</a></li>
<li>2019-01-22 , <a href="https://www.thingiverse.com/thing:3371019">EZ-USB FX2LP CY7C68013A USB logic analyzer core board housing by decoder - Thingiverse</a></li>
<li>2019-05-27 , <a href="https://www.thingiverse.com/thing:3654933">CY7C68013A box for logic analyzer by reibuehl - Thingiverse</a></li>
<li>2021-08-22 , <a href="https://www.thingiverse.com/thing:4938424">Lcsoft CY7C68013A Mini Board Dev Kit Logic Analyzer Probe Case by firepower9966 - Thingiverse</a></li>
<li>2022-06-29 , <a href="https://www.thingiverse.com/thing:5421515">CY7C68013A Logic analyzer box by FelinoMaker - Thingiverse</a></li>
</ul>

<style media="screen">
     
    div.notices {
        margin: 2rem 0;
        position: relative;
    }
    div.notices p {
        padding: 15px;
        white-space: pre-wrap;
        display: block;
         
        margin-top: 0rem;
        margin-bottom: 0rem;
        color: #666;
    }
    div.notices p:first-child:before {
        position: absolute;
        top: 2px;
        color: #fff;
        font-family: "Font Awesome 5 Free";
        font-weight: 900;
        content: "\f06a";
        left: 10px;
    }
    div.notices p:first-child:after {
        position: absolute;
        top: 2px;
        color: #fff;
        left: 3rem;
    }
    div.notices.info p {
        border-top: 30px solid #F0B37E;
        background: #FFF2DB;
    }
    div.notices.info p:first-child:after {
        content: 'Info';
    }
    div.notices.warning p {
        border-top: 30px solid rgba(217, 83, 79, 0.8);
        background: #FAE2E2;
    }
    div.notices.warning p:first-child:after {
        content: 'Warning';
    }
    div.notices.note p {
        border-top: 30px solid #6AB0DE;
        background: #E7F2FA;
    }
    div.notices.note p:first-child:after {
        content: 'Note';
    }
    div.notices.tip p {
        border-top: 30px solid rgba(92, 184, 92, 0.8);
        background: #E6F9E6;
    }
    div.notices.tip p:first-child:after {
        content: 'Tip';
    }
</style>
<div class="notices note" ><p>逛資料的過程發現到，一個很不錯的作品，往往存在前一代作品，以及前前一代作品。
它們之間的程式碼、設計稿未必能直接 Reuse，但前一人做的嘗試，卻有可能因此啟發後一個人，繼續向前挑戰改善。
因此整理資料時，便多列上了創作時序。</p>
</div>

<p>在目前列表中，我最中意 <a href="https://www.thingiverse.com/felinomaker/designs">FelinoMaker</a> 的作品 <a href="https://www.thingiverse.com/thing:5421515">CY7C68013A Logic analyzer box by FelinoMaker - Thingiverse</a> 。除了其外殼完整外，更重要的是特別為 D0~D15 的針腳開孔並有面板標示。這貼心設計在使用上帶來很大的便利。</p>
<p>面板標示的部分，作者有提供 SVG 檔案，可自行編輯。編輯時，要留意該檔案的紙張尺寸是 US letter (216mm x 279mm)，而非常用的 A4 尺寸。</p>
<p>
  <img src="attachments/f030e337d79c13342855729792b12837.png" alt="Pasted image 20240822173430.png">

</p>
<p>同時電腦上看到的，跟實際列印出來的會有落差，要稍作校正才能一致。自己也是來回調整好幾次，才完全吻合。</p>
<p>
  <img src="attachments/dbb021dc3439f75e8aeab1b5edb5ca4c.png" alt="Pasted image 20240822175914.png">

</p>
<h2 id="lcsoft-和-geeetech-版本差異">LCSOFT 和 Geeetech 版本差異</h2>
<p>就 <a href="https://sigrok.org/wiki/Lcsoft_Mini_Board">Lcsoft Mini Board - sigrok</a> 記錄，有分 LCSOFT(lctech-inc,艾尔赛科技) 原版跟 Geeetech 版。目前查得兩個版本的官方資訊如下：</p>
<p><strong>LCSOFT (艾尔赛科技, lctech-inc):</strong></p>
<ul>
<li><a href="http://www.lctech-inc.com/cpzx/3/51kfb/2019/0402/392.html">EZ-USB FX2LP CY7C68013A USB 核心板 开发板 逻辑分析仪_深圳市艾尔赛科技有限公司</a></li>
<li><a href="https://web.archive.org/web/20160426230606/http://www.lctech-inc.com/Hardware/Detail.aspx?id=7cadef7b-359a-4e3d-b980-76ffa15171e0">Shenzhen LC Technology Co.,Ltd.</a>(Wayback Machine)</li>
</ul>
<p><strong>Geeetech:</strong></p>
<ul>
<li><a href="https://www.geeetech.com/wiki/index.php/CY7C68013">CY7C68013 - Geeetech Wiki</a></li>
</ul>
<p>就 <a href="https://sigrok.org/wiki/Lcsoft_Mini_Board">Lcsoft Mini Board - sigrok</a> 的說明:</p>
<blockquote>
<p>Differences from the LCSoft board:</p>
<ul>
<li>two LEDs, on pins PA0 and PA1</li>
<li>two jumpers: J1 connects/disconnects the LEDs from Vcc, J2 sets the EEPROM address bit A0</li>
<li>construction quality is higher</li>
</ul>
<p>The Geeetech board&rsquo;s J2 is logically opposite to the LCSoft board&rsquo;s jumper: pin A0 is tied HIGH via a 10kOhm resistor, inserting J2 pulls it LOW. i.e. inserting J2 on the Geeetech is functionally the same as removing the jumper on the LCSoft board.</p>
</blockquote>
<p>兩者的差異不大。</p>
<p>不過要注意，兩者的 Reset 鍵位置不同。若是搭配 3D 列印外殼的話，要注意開孔的位置是否一致。</p>
<h2 id="實測">實測</h2>
<p>在 Arch Linux 上，安裝相關的套件:</p>
<pre tabindex="0"><code>pulseview sigrok-firmware-fx2lafw sigrok-cli
</code></pre><p>在接上硬體後，打開 <code>pluseview</code> 就能直接使用，完全不用苦惱驅動程式或是支援問題來回折騰。</p>
<p>實際使用 <code>pulseview</code> 取得訊號的運作如下:</p>
<p>
  <img src="attachments/6bbf9aef8c2abc5c45d7ded5b8a85e7e.png" alt="Pasted image 20240822180814.png">

</p>
<h2 id="注意事項">注意事項</h2>
<p>這個裝置的接腳電壓上限只到 5V ，所以超過很可能會壞掉，因此使用前要留意電壓的問題。網路上有人注意到這個問題，並嘗試討論與製作保護電路等工具。這裡將參考連接列出如下，供參考：</p>
<ul>
<li><a href="https://sigrok.org/wiki/Circuits_for_barebone_boards">Circuits for barebone boards - sigrok</a></li>
<li>2020-03-23 , <a href="https://hackaday.io/project/170532-adding-buffering-to-lcsoft-cy7c68013a-mini-board">Adding Buffering to LCSoft CY7C68013A Mini Board | Hackaday.io</a></li>
<li>2021-08-22 , <a href="https://www.thingiverse.com/thing:4938424">Lcsoft CY7C68013A Mini Board Dev Kit Logic Analyzer Probe Case by firepower9966 - Thingiverse</a></li>
<li>2021-10-07, <a href="https://www.cnblogs.com/milton/p/15376584.html">Sigrok逻辑分析仪软件(基于CY7C68013A) - Milton - 博客园</a></li>
</ul>
<h2 id="哪裡買">哪裡買?</h2>
<p>參考連接如下:</p>
<ul>
<li><a href="https://shopee.tw/EZ-USB-FX2LP-CY7C68013A-USB-%E6%A0%B8%E5%BF%83%E6%9D%BF-%E9%96%8B%E7%99%BC%E6%9D%BF-%E9%82%8F%E8%BC%AF%E5%88%86%E6%9E%90%E5%84%80-i.405745673.23454023471">EZ-USB FX2LP CY7C68013A USB 核心板 開發板 邏輯分析儀 | 蝦皮購物</a>
<ul>
<li>目前正在使用中的是於此處購買</li>
<li>買了兩片。但發現其中一片有兩處焊接有誤（按鈕與被動元件），但不影響使用。</li>
<li>屬於 Geeetech 版本</li>
</ul>
</li>
<li><a href="https://shopee.tw/%E6%96%B0%E6%AC%BE-EZ-USB-FX2LP-CY7C68013A-USB-%E6%A0%B8%E5%BF%83%E6%9D%BF-%E9%96%8B%E7%99%BC%E6%9D%BF-%E9%82%8F%E8%BC%AF%E5%88%86%E6%9E%90%E5%84%80-i.6760059.44429948">新款 EZ-USB FX2LP CY7C68013A USB 核心板 開發板 邏輯分析儀 | 蝦皮購物</a>
<ul>
<li>原本打算於此購買 LCSOFT 原版。但後來實際拿到的是 Geeetech 的版本，與預期不符，就換了購買管道。</li>
</ul>
</li>
</ul>
]]></content:encoded>
          
          
      <enclosure url="https://6bcf7279.info/2024/06/12/c052e42a/attachments/c7337bc786727de61d84691bf0d55ae5.png" length="527336" type="image/png" />
      <media:content url="https://6bcf7279.info/2024/06/12/c052e42a/attachments/c7337bc786727de61d84691bf0d55ae5.png" medium="image">
        <media:title type="html"></media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[我所知 screen 的奇技淫巧]]></title>
      <link>https://6bcf7279.info/2024/05/12/9ae1add6/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Sun, 12 May 2024 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2024/05/12/9ae1add6/</guid>
      <description><![CDATA[<h1 id="我所知-screen-的奇技淫巧">我所知 screen 的奇技淫巧</h1>
<h2 id="序">序</h2>
<p>近日在整理 <code>$HOME</code> 下的 <a href="https://en.wikipedia.org/wiki/Hidden_file_and_hidden_directory#Unix_and_Unix-like_environments">dotfiles</a> 時，遇到 <code>.screenrc</code> 的部分，覺得束之高閣可惜。決定稍作記錄與分享。</p>
<h2 id="設定檔">設定檔</h2>
<p>分享設定檔 <code>~/.screenrc</code> 如下:</p>
<pre tabindex="0"><code>caption always &#34;%{= wk} %{= KY} [%n]%t @ %H %{-} %= %{= KR} %l %{-} | %{= KG} %Y-%m-%d %{-} &#34;
hardstatus alwayslastline &#34; %-Lw%{= Bw}%n%f %t%{-}%+Lw %=| %0c:%s &#34;
termcapinfo xterm* ti@:te@
</code></pre><p>效果如下:</p>]]></description>
      <content:encoded><![CDATA[<h1 id="我所知-screen-的奇技淫巧">我所知 screen 的奇技淫巧</h1>
<h2 id="序">序</h2>
<p>近日在整理 <code>$HOME</code> 下的 <a href="https://en.wikipedia.org/wiki/Hidden_file_and_hidden_directory#Unix_and_Unix-like_environments">dotfiles</a> 時，遇到 <code>.screenrc</code> 的部分，覺得束之高閣可惜。決定稍作記錄與分享。</p>
<h2 id="設定檔">設定檔</h2>
<p>分享設定檔 <code>~/.screenrc</code> 如下:</p>
<pre tabindex="0"><code>caption always &#34;%{= wk} %{= KY} [%n]%t @ %H %{-} %= %{= KR} %l %{-} | %{= KG} %Y-%m-%d %{-} &#34;
hardstatus alwayslastline &#34; %-Lw%{= Bw}%n%f %t%{-}%+Lw %=| %0c:%s &#34;
termcapinfo xterm* ti@:te@
</code></pre><p>效果如下:</p>
<p>
  <img src="attachments/788b66672ddbf8c9d1a60b82d20d5707.png" alt="Pasted image 20240512140845.png">

</p>
<p>說明：</p>
<ul>
<li>最下面一行是由 <code>hardstatus alwayslastline</code> 設定的
<ul>
<li>具備多分頁 tab 的效果</li>
</ul>
</li>
<li>倒數第二行則是 <code>caption always</code> 的設定</li>
<li><code>%</code> 開頭的設定變數，可參考官方文件: <a href="https://www.gnu.org/software/screen/manual/html_node/String-Escapes.html">Screen User’s Manual: String Escapes</a></li>
<li><code>termcapinfo</code> 的那一行設定，則是應付滑鼠捲動。</li>
</ul>
<p>總之，用了就會眼睛一亮。</p>
<p>因時日久遠，已忘了是從哪裏發掘這款設定的。原本印象是從 yungyuc 那裏學來的。但考古了一下，yungyuc 的 <a href="https://web.archive.org/web/20070528073439/http://blog.seety.org/everydaywork/2007/4/25/669/">新生的 screenrc - Everyday Work</a> 一文卻說是從我這裏學去的。這下我自己也懵了。</p>
<p>不過，看截圖應該是出自我的版本沒錯。記憶中，我先從某處得知了有 <code>hardstatus</code>, <code>caption</code> 的參數跟用法，但當時多是置底一行。因當時重度在 virtual console 的環境下作業，一時靈感之下拼湊出置底二行這樣的用法。</p>
<p>感謝有 yungyuc 當時的記錄與分享。</p>
<h2 id="attachdetach">attach/detach</h2>
<ul>
<li><code>Ctrl-a + d</code>, detach 目前所在的 session</li>
<li><code>screen -list</code> , 列出目前的 sessions</li>
<li><code>screen -r &lt;session&gt;</code> , resume 先前的 session
<ul>
<li>若只有一個 session ，只要打 <code>screen -r </code> 即可</li>
</ul>
</li>
</ul>
<p>當 Terminal 掛掉時，該 Terminal 所在的程式也就跟着中斷了。用 screen 的好處就是，讓程式主體保持在背景執行，而允許前端的 Terminal session 隨時 attach/detach 。如此一來，即使不小心關掉了 Terminal (不論是 XWindow 當掉重啓)，或是登出再登入，都能快速接續先前的狀態。</p>
<h2 id="共用-session">共用 session</h2>
<ul>
<li><code>screen -x &lt;session&gt;</code></li>
</ul>
<p>這個功能在幾個情境下非常好用。我用過的情境如下：</p>
<p>其一， 在 XWindow 跟 Linux virtual console 頻繁切換使用。</p>
<p>我可能先在 XWindow 下編寫 window manager 的設定檔，同時在 console 下開好 ssh 連線預留後路。若是在調整 XWindow 設定有誤，則可退到 console 查看 log 、改設定跟重啓。萬一鍵盤鎖死無反應時，也還可從他處以 ssh 連回挽救。</p>
<p>其二， pair programming。</p>
<p>在緊湊討論 Linux 的 CLI, vim, debug 參數之時，最快的就是湊到對方的電腦前去看。但遇到要輸入時，就得共用鍵盤，不甚方便。加上每人各有自己偏好的熱鍵設定，實際操作往往卡卡的不甚流利。後來發現一技巧，就是開 ssh 連線到對方的電腦上，用 screen 的共用 session 功能。如此一來，雙方都能快速看到對方的 CLI ，也能直接改參數，起執行的 log 訊息也都無時差的同時 review ，整個效率提升很多。</p>
<p>此技法是從 <a href="https://www.hackingthursday.org/yahoohackingdaythoughts">HackingThursday 參加 2009 Yahoo Hacking Day 活動</a> 時學來的，印象中是 Rex, Tsung, hychen 那一組發掘出來的。</p>
<p>順帶一提，後來出現有 <a href="https://tmate.io/">tmate</a> ，能節省開頭的 ssh 設定折騰，也非常推薦。不過，該工具的連線資料會過外部雲端，使用前需留意。</p>
<h2 id="serial-工具">serial 工具</h2>
<p>示例如下：</p>
<pre tabindex="0"><code>screen /dev/ttyUSB0 115200
</code></pre><pre tabindex="0"><code>screen -c /dev/null telnet -8 ptt.cc
Ctrl-a :encoding big5 utf-8
</code></pre><p>(註：參數說明可參閱 <a href="https://www.gnu.org/software/screen/manual/html_node/Window-Types.html">Screen User’s Manual: Window Types</a>)</p>
<p>若說到現在還在用 screen 這工具，這絕對是最關鍵的理由。</p>
<p>這祕技其實是從 Thinker 那裏學來的。印象中好像是在請教他有無推薦的 serial 連線工具，例如: <code>minicom</code>, <code>kermit</code>, &hellip;之類的？ 然後他就回說：</p>
<blockquote>
<p>可以用 screen 啊！</p>
</blockquote>
<p>這回答太出乎我的意料，因為 screen 在我心中的定位一直都是分割終端機畫面的工具，從沒想過用於 serial port 的操作，因而特別印象深刻。
長期使用後，發覺有諸多優點：</p>
<ul>
<li>十分穩定。之前用 minicom, 或其他工具，可能受 terminal 字元影響，而有閃退、中斷的問題。但印象中，screen 從以前用到現在，還沒有不正當當掉過。</li>
<li>內建支援轉碼，例如： <code>Ctrl-a :encoding big5 utf8</code></li>
<li>畫面紀錄與紀錄檔功能。<code>Ctrl-a h</code> , <code>Ctrl-a H</code></li>
<li>不依賴 ncurses 或 prompt, 可和 expect/pexpect 搭配使用於automation scripts</li>
</ul>
<p>唯一的缺點大概是要送出 <code>Ctrl-a</code> (screen的特殊鍵)時，要多跳脫一層。</p>
<h2 id="解-lock">解 lock</h2>
<p>用 Terminal 久了，偶爾會遇到輸入被鎖住的情況，主要原因是<a href="https://en.wikipedia.org/wiki/Software_flow_control">Software flow control</a> ，如下：</p>
<ul>
<li><code>Ctrl-s</code>, <code>Ctrl-q</code>, 是 Terminal 的 flow control on/off 熱鍵。</li>
<li><code>Ctrl-a + s</code>, <code>Ctrl-a + q</code> 是 screen 的 flow control on/off 熱鍵。</li>
</ul>
<p>當 screen 被鎖住時，可以就 <code>Ctrl-a + q</code> 和 <code>Ctrl-q</code> 反覆交叉按個數次，就可以解開了。</p>
<h2 id="複製貼上">複製貼上</h2>
<p>操作流程如下：</p>
<ul>
<li><code>Ctrl-a + [</code> 進入 copy mode</li>
<li>用方向鍵移動到開頭的位置，按下 <code>ENTER</code> 或 <code>SPACE</code></li>
<li>用方向鍵移動到結尾的位置，再按下 <code>ENTER</code> 或  <code>SPACE</code>，完成標定範圍的內容複製</li>
<li>之後到要輸入的地方，按下 <code>Ctrl-a + ]</code> 進行貼上</li>
</ul>
<p>因爲 XWindow terminal 一般的滑鼠複製貼上，遇有特殊字元或斷行偶爾會有問題，加上歷史記錄不一定夠長。相較之下， screen 的資料完整一些。所以，即使 Terminal 已經很方便了，遇到比較刁鑽的地方，還是不時會搭配 screen 來使用。</p>
<h2 id="screen-裏的-screen">screen 裏的 screen</h2>
<p>有時候會遇到一些情況是，在筆電裏開了 screen ，然後連到遠端主機，而遠端主機也開了 screen 。就成了 screen 裏的 screen 的情況。這時候按 <code>Ctrl-a , Ctrl-a</code> 的組合鍵，就會被本地端的 screen 先攔截，變成是切換本地端的 screen ，而不是切換遠端的 screen 。解法是改爲 <code>Ctrl-a + a</code>。 條列如下:</p>
<ul>
<li><code>Ctrl-a + a , Ctrl-a</code> ，切換遠端的 screen</li>
<li><code>Ctrl-a , Ctrl-a</code> ，切換本地端的 screen</li>
</ul>
<h2 id="滑鼠-scroll">滑鼠 scroll</h2>
<p>一般在 XWindow terminal 下開 screen 後， 畫面就框定住了，而沒能像一般 terminal 那樣 scroll up/down 。若是習慣用滑鼠 scroll 去看先前的畫面記錄。可以考慮在設定檔 <code>~/.screenrc</code> 加上：</p>
<pre tabindex="0"><code>termcapinfo xterm* ti@:te@
</code></pre><h2 id="重置邊框">重置邊框</h2>
<p>若開 screen 時，是 80x24 的大小。而後在另一處改用 120x30 的 Terminal 連回時，會發現多了邊框。示意如下：</p>
<p>
  <img src="attachments/86992337010df530bbab864eccba1c33.png" alt="Pasted image 20240513000203.png">

</p>
<p>那如何改善呢？使用下述指令即可：</p>
<pre tabindex="0"><code>Ctrl-a :fit
</code></pre>]]></content:encoded>
          
          
      <enclosure url="https://6bcf7279.info/2024/05/12/9ae1add6/attachments/788b66672ddbf8c9d1a60b82d20d5707.png" length="119699" type="image/png" />
      <media:content url="https://6bcf7279.info/2024/05/12/9ae1add6/attachments/788b66672ddbf8c9d1a60b82d20d5707.png" medium="image">
        <media:title type="html">Pasted image 20240512140845.png</media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[天堂於地獄的區別]]></title>
      <link>https://6bcf7279.info/2024/05/04/eed10287/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Sat, 04 May 2024 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2024/05/04/eed10287/</guid>
      <description><![CDATA[<h1 id="天堂於地獄的區別">天堂於地獄的區別</h1>
<p>近日讀到<a href="https://zh.wikipedia.org/zh-tw/%E7%A8%BB%E7%9B%9B%E5%92%8C%E5%A4%AB">稻盛和夫</a>的著作<a href="https://www.taaze.tw/products/11100250321.html">成功與失敗的法則</a>中，提到一段關於“天堂與地獄”的哲理故事時，深有所感。摘錄段落全文如下：</p>
<blockquote>
<p>一位在寺廟修行的僧人雲水請教方丈大師：</p>
<p>「大家都說人死後的世界裡有地獄也有極樂，這是真的嗎？如果真有地獄，那地獄又長得什麼模樣呢？」</p>
<p>方丈回答：「當然，死後的世界裡有地獄也有極樂。但是，兩者之間的差別並沒有你想像的那麼大。外觀上地獄和極樂幾乎完全一樣。不同的只是居住在那裡的人們所擁有的心態啊！居住在地獄的人成天只想著自己的好處，抱持的是利己的心態；而居住在極樂世界的人懷抱的則是充滿著善體人意的利他之心，終日為他人著想。」</p>]]></description>
      <content:encoded><![CDATA[<h1 id="天堂於地獄的區別">天堂於地獄的區別</h1>
<p>近日讀到<a href="https://zh.wikipedia.org/zh-tw/%E7%A8%BB%E7%9B%9B%E5%92%8C%E5%A4%AB">稻盛和夫</a>的著作<a href="https://www.taaze.tw/products/11100250321.html">成功與失敗的法則</a>中，提到一段關於“天堂與地獄”的哲理故事時，深有所感。摘錄段落全文如下：</p>
<blockquote>
<p>一位在寺廟修行的僧人雲水請教方丈大師：</p>
<p>「大家都說人死後的世界裡有地獄也有極樂，這是真的嗎？如果真有地獄，那地獄又長得什麼模樣呢？」</p>
<p>方丈回答：「當然，死後的世界裡有地獄也有極樂。但是，兩者之間的差別並沒有你想像的那麼大。外觀上地獄和極樂幾乎完全一樣。不同的只是居住在那裡的人們所擁有的心態啊！居住在地獄的人成天只想著自己的好處，抱持的是利己的心態；而居住在極樂世界的人懷抱的則是充滿著善體人意的利他之心，終日為他人著想。」</p>
<p>雲水進一步請求開示：「為什麼就只因為心態的不同，而有極樂和地獄的分別呢？」</p>
<p>對此詢問，方丈以下面的比喻回應。</p>
<p>善體人意創造的世界和諧美好</p>
<p>對不分晝夜刻苦修行的雲水而言，烏龍麵便是極品珍饈。方丈於是打個比方：假設放置在房間正中央的大鍋裡現在正煮著美味的烏龍麵，旁邊還已經備妥了蘸汁。</p>
<p>只不過，吃這烏龍麵有個規矩：必須用長約一公尺的筷子夾食，而且得要握住頂端。所謂的地獄和極樂，到此為止都是一模一樣的。</p>
<p>也就是說，鍋的大小和圍鍋用食的人數都相同，不同的只是坐在那裡的人的心態。</p>
<p>「你試著想像一下接下來會發生什麼事！」方丈反問雲水說。</p>
<p>如果一鍋看似美味無比的烏龍麵就擺在一群飢腸轆轆的人眼前，然後有人告知：「別客氣！大家用吧！」這下子到底會出現怎樣的光景呢？</p>
<p>如果是在地獄，大家莫不一拿起那長約一公尺的筷子，便立刻以迅雷不及掩耳的速度夾取烏龍麵，連忙放進自己身邊的蘸汁裡。可是雖然蘸了汁，但筷子實在太長，老送不進自己的嘴裡。坐在對面的人則不願眼睜睜地看到別人吃到麵，所以用筷子硬扯了別人夾好的麵條。就這樣，一幅眾人墮入阿鼻地獄痛哭哀號的景象出現了。好不容易煮好的烏龍麵打翻灑了一地，結果沒有一個人可以吃上一口，所有人都陷入了餓鬼道。</p>
<p>相反地，如果是在極樂，裡面住的都是充滿體貼之心的人們。所以，只要有人開口說：「烏龍麵已經煮好了。大家共同享用吧！」大家就會拿起筷子夾取鍋中的麵條，蘸好醬汁，然後伸出筷子說：「來！你先請！」讓坐在對面的人先行享用。</p>
<p>坐在面前的人也會回道：「啊！真是太好吃了。現在換你嚐嚐！」然後幫對方夾取烏龍麵。所以麵條沒有半根掉到鍋外，每個人都能穩當地享受眼前美食，於是乎個個雙手合十，一邊心懷感恩，一邊吃麵。</p>
<p>「這正是極樂世界啊！但是外觀和地獄可沒有絲毫差別。」方丈開示雲水。</p>
<p>如同這故事所教誨的，現實世界裡，我們究竟身處地獄亦或極樂，端視自己所持的心態而定。</p>
</blockquote>
<p>(出處: &ldquo;成功與失敗的法則&quot;的第 58 頁, 由京都圓福寺方丈告訴稻盛和夫的故事)</p>
]]></content:encoded>
          
      <media:content url="https://6bcf7279.info/2024/05/04/eed10287/" medium="image">
        <media:title type="html"></media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[拆解Philips電鬍刀]]></title>
      <link>https://6bcf7279.info/2024/03/02/8662bb89/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Sat, 02 Mar 2024 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2024/03/02/8662bb89/</guid>
      <description><![CDATA[<h1 id="拆解philips電鬍刀">拆解Philips電鬍刀</h1>
<p>2018 年 10 月買了一把電鬍刀:</p>
<ul>
<li>產品名稱: <code>【Philips 飛利浦】銀離子抗菌水洗充電電鬍刀S111</code></li>
<li>型號: <code>MSIP-REI-PCE-S111</code></li>
</ul>
<p>去年時，完全充不了電，便買了一把新的。但同一型號，用不到一年，電池力道衰減很快。不確定是不是電池料件不佳，便尋思是否能 DIY 更換電池。網路上查不到相關的資料，決定自行試試看，就算失敗了也留個記錄供參。</p>]]></description>
      <content:encoded><![CDATA[<h1 id="拆解philips電鬍刀">拆解Philips電鬍刀</h1>
<p>2018 年 10 月買了一把電鬍刀:</p>
<ul>
<li>產品名稱: <code>【Philips 飛利浦】銀離子抗菌水洗充電電鬍刀S111</code></li>
<li>型號: <code>MSIP-REI-PCE-S111</code></li>
</ul>
<p>去年時，完全充不了電，便買了一把新的。但同一型號，用不到一年，電池力道衰減很快。不確定是不是電池料件不佳，便尋思是否能 DIY 更換電池。網路上查不到相關的資料，決定自行試試看，就算失敗了也留個記錄供參。</p>
<p>拆解後的部件主要如下:</p>
<p>
  <img src="attachments/3665f12d0106b90bca188ac0dca8f06c.png" alt="2024-03-03_010255.png">

</p>
<h2 id="拆解過程">拆解過程</h2>
<p>一開始先拆外殼，就我的比對，應該是對應 <code>T8</code> 的螺絲起子。但因爲其中一個螺絲鏽了，只好暴力破壞。</p>
<p>
  <img src="attachments/b6afb8eab2b8df4f8c0059a3c2cc9f72.png" alt="Pasted image 20240303012750.png">

</p>
<p>解掉螺絲後，再拆外殼。從拆後的結構，發現是有個平移卡榫。</p>
<p>
  <img src="attachments/e872e146c2476fdb4ccdb263cc6c8983.png" alt="Pasted image 20240303023356.png">

</p>
<p>理論上只要由底部往前推即可鬆開，並不需動到上面疑似卡榫的部份。</p>
<p>
  <img src="attachments/77508aecedddb0bb089f843be747fc70.png" alt="Pasted image 20240303023738.png">

</p>
<p>取下白色外殼後，可看到密封的隔板。</p>
<p>
  <img src="attachments/2fe93236630521b54edd1334ef7de79d.png" alt="Pasted image 20240303014049.png">

</p>
<p><strong>以下爲錯誤過程，請跳過不要重蹈覆轍</strong></p>
<p>用鉗子可夾住外拉:</p>
<p>
  <img src="attachments/18e5234bd6c0c1d0f0c50b7e5df4f0d1.png" alt="Pasted image 20240303014405.png">

</p>
<p>
  <img src="attachments/7e08ced0a248c9f088b835856a6fc007.png" alt="Pasted image 20240303014426.png">

</p>
<p>更裏面的還有隔板，試拉但拉不出來，像有地方卡住。有兩個螺絲，對應的是 <code>PH0</code> 的螺絲起子。</p>
<p>
  <img src="attachments/777e81b425aa54c12c50aeb7d75022e1.png" alt="Pasted image 20240303014604.png">

</p>
<p>硬拆下後，看到跟裏面的結構:</p>
<p>
  <img src="attachments/1bb8e358aae701753bca9339f93d8f3d.png" alt="Pasted image 20240303015036.png">

</p>
<p>
  <img src="attachments/f08954a9376b73644033210d87cb53a0.png" alt="Pasted image 20240303015053.png">

</p>
<p>發現卡住的地方是上面的轉軸:</p>
<p>
  <img src="attachments/875c378e9152d2653cb09d8b4f80f4e7.png" alt="Pasted image 20240303015200.png">

</p>
<p>拔出轉軸後，就可拉出裏面的機艙主體:</p>
<p>
  <img src="attachments/a72bf86bcc3a33a2ca9481ab787ab93f.png" alt="Pasted image 20240303015219.png">

</p>
<p>
  <img src="attachments/051bec0d2e486e0f0192df802e7c61b6.png" alt="Pasted image 20240303015352.png">

</p>
<p>
  <img src="attachments/50353ab59730d2dad87be649a996364c.png" alt="Pasted image 20240303015414.png">

</p>
<p>電池無法輕易卸下，細看是用點焊的:</p>
<p>
  <img src="attachments/594e40edb7707f614c66c06351ff3a8e.png" alt="Pasted image 20240303015602.png">

</p>
<p>破壞剪開取下後，電池的型號資訊如下:</p>
<p>
  <img src="attachments/30185a72191353ab55431ae8a9a3afbe.png" alt="Pasted image 20240303015715.png">

</p>
<p>
  <img src="attachments/73ac32cd387b6bdafa4aaa5384634d83.png" alt="Pasted image 20240303015730.png">

</p>
<p>
  <img src="attachments/95c181c395e7a17d038baa6301439894.png" alt="Pasted image 20240303015753.png">

</p>
<p>
  <img src="attachments/4858a88b59931fae53a485ef27317085.png" alt="Pasted image 20240303015805.png">

</p>
<p>另記驅動馬達的型號爲 <code>LD-180FF-4025P1</code> :</p>
<p>
  <img src="attachments/51454997a329b1e2d687ee0a5790ccb6.png" alt="Pasted image 20240303015943.png">

</p>
<p>艙體外殼如下:</p>
<p>
  <img src="attachments/f08e8f62567ce8f7641debf073288c0c.png" alt="Pasted image 20240303015900.png">

</p>
<p>底部是靠橡皮圈密封，沒有卡榫，用力推出即可。拆到此處後，才明白前面走了冤枉路。</p>
<p>
  <img src="attachments/5d2d7bc85749e0945e57bcc931c25408.png" alt="Pasted image 20240303020218.png">

</p>
<h2 id="建議拆法">建議拆法</h2>
<ol>
<li>用 <code>T8</code> 起子卸下外殼螺絲、推出卸下外殼。</li>
<li>拔出轉軸</li>
<li>於底部尾巴出力，將機艙推出。</li>
</ol>
<p>
  <img src="attachments/52ef8c1891f952163b80431c23b7b213.png" alt="Pasted image 20240303020821.png">

</p>
<p>至於電池更換的部分，需要解焊點焊的部分我不會，可能要另請教專業的人。</p>
<p>據之前於 mobile01 上看到的<a href="https://www.mobile01.com/topicdetail.php?f=168&amp;t=5546766">一則討論文</a> ，提到光華商場有家<a href="https://maps.app.goo.gl/BptW5kM7uQK9Pu26A">電池醫院</a>似乎有提供更換電池的服務，有需要的或可前往一詢。</p>
]]></content:encoded>
          
          
      <enclosure url="https://6bcf7279.info/2024/03/02/8662bb89/attachments/3665f12d0106b90bca188ac0dca8f06c.png" length="1492696" type="image/png" />
      <media:content url="https://6bcf7279.info/2024/03/02/8662bb89/attachments/3665f12d0106b90bca188ac0dca8f06c.png" medium="image">
        <media:title type="html">2024-03-03_010255.png</media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[摩茲工寮近期募款]]></title>
      <link>https://6bcf7279.info/2023/12/21/ddc538de/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Thu, 21 Dec 2023 21:36:09 +0800</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2023/12/21/ddc538de/</guid>
      <description><![CDATA[<h1 id="摩茲工寮近期募款">摩茲工寮近期募款</h1>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>前陣子，聽到 <a href="https://moztw.org/space/">摩茲工寮</a> 要自籌社羣空間的租金的消息。</p>
<pre tabindex="0"><code>感謝 Mozilla 過去九年半的資助。自 2024 年起，工寮空間的營運費用，將由 MozTW 社群全額自籌。

(source: https://medium.com/mozilla-related/moztw-space-status-2023-27dd60ffe7d8)
</code></pre><p>想到先前參加過不少辦在摩茲工寮的活動，加上 <a href="https://www.hackingthursday.org">H4</a> 社羣也數次借用社羣空間舉辦主題分享的活動(感謝 <a href="http://rjhsiao.me">RJ Hsiao</a> 多次協助)。決定比照上次 &ldquo;<a href="https://6bcf7279.info/2023/02/17/273cab03/">捐款支持無國界醫生的工作</a>&rdquo; ，加入定期小額捐款表示支持。</p>]]></description>
      <content:encoded><![CDATA[<h1 id="摩茲工寮近期募款">摩茲工寮近期募款</h1>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>前陣子，聽到 <a href="https://moztw.org/space/">摩茲工寮</a> 要自籌社羣空間的租金的消息。</p>
<pre tabindex="0"><code>感謝 Mozilla 過去九年半的資助。自 2024 年起，工寮空間的營運費用，將由 MozTW 社群全額自籌。

(source: https://medium.com/mozilla-related/moztw-space-status-2023-27dd60ffe7d8)
</code></pre><p>想到先前參加過不少辦在摩茲工寮的活動，加上 <a href="https://www.hackingthursday.org">H4</a> 社羣也數次借用社羣空間舉辦主題分享的活動(感謝 <a href="http://rjhsiao.me">RJ Hsiao</a> 多次協助)。決定比照上次 &ldquo;<a href="https://6bcf7279.info/2023/02/17/273cab03/">捐款支持無國界醫生的工作</a>&rdquo; ，加入定期小額捐款表示支持。</p>
<p>這裏分享操作資訊如下:</p>
<h2 id="操作流程">操作流程</h2>
<p>步驟 1 :</p>
<p>首先，打開摩茲工寮的募資網頁: <a href="https://donate.moztw.space">https://donate.moztw.space</a> 。
接着會導到它在 <a href="https://ocf.tw/">OCF開放文化基金會</a> 的頁面。
(示意圖如下)</p>
<p>
  <img src="https://i.imgur.com/vbmoLrw.png" alt="Imgur">

</p>
<p>步驟 2 :</p>
<p>逐一填寫必要欄位，填完之後按 &ldquo;下一步&rdquo;。另補充幾個細節提醒:</p>
<ul>
<li>&ldquo;金額&rdquo; 的欄位，可以選 &ldquo;自訂金額&rdquo;，再於下一欄 &ldquo;自訂金額&rdquo; 填上指定數字即可。</li>
<li>&ldquo;選擇付款方式&rdquo;，我是選 &ldquo;信用卡&rdquo; 。
<ul>
<li>原本想選 &ldquo;行動支付&rdquo;，但似乎不支援，而出現錯誤訊息(如下)。因而改用 &ldquo;信用卡&rdquo;</li>
<li>
  <img src="https://i.imgur.com/zozDcRz.png" alt="Imgur">

</li>
</ul>
</li>
<li>&ldquo;訂閱 OCF 電子報?&rdquo; 預設是訂閱。這裏我是取消勾選。</li>
<li>&ldquo;捐款徵信是否顯示全名&rdquo;，這裏我是勾選 &ldquo;是&rdquo; 。不習慣徵信的人建議可選 &ldquo;否&rdquo;</li>
</ul>
<p>(示意圖如下)</p>
<p>
  <img src="https://i.imgur.com/7j1dd9w.png" alt="Imgur">

</p>
<p>步驟 3 :</p>
<p>繼上一步後，下一步會顯示表單資料預覽。確認 OK 後，按 &ldquo;下一步&rdquo; 。
(示意圖如下)</p>
<p>
  <img src="https://i.imgur.com/gVb836J.png" alt="Imgur">

</p>
<p>步驟 4 :</p>
<p>接下來的頁面是，填寫信用卡付款資訊。稍檢查一下各項欄位是否相符，再填上持卡人資訊。
持卡人資訊，我只填 &ldquo;持卡人姓名&rdquo; 、 &ldquo;手機號碼&rdquo; 兩個必填欄位。
然後再按 &ldquo;立即付款 Pay now&rdquo;。</p>
<p>備註: 按下按鈕之後，才正式進入線上付款作業。在這一頁以前，都不會扣款。</p>
<p>(示意圖如下)</p>
<p>
  <img src="https://i.imgur.com/XgeBO2o.png" alt="Imgur">

</p>
<p>步驟 5 :</p>
<p>進入到線上付款作業。付款平臺是綠界的系統。
跟一般網購相同，通過手機簡訊驗證就完成訂單。</p>
<p>步驟 6 (完成) :</p>
<p>完成線上付款作業後。系統顯示網頁如下:</p>
<p>
  <img src="https://i.imgur.com/t0AdZCW.png" alt="Imgur">

</p>
<h2 id="取消捐款">取消捐款</h2>
<p>取消捐款的方法是，目前是需要個別寫 email 到 <code>pay@ocf.tw</code> 的電子信箱。</p>
<p>
  <img src="https://i.imgur.com/1qhi58d.png" alt="Imgur">

</p>
<h2 id="徵信資訊">徵信資訊</h2>
<p>捐款記錄可至 OCF 的網頁查詢，目前列表是多個專案的記錄混合在一起。現況看起來是一個月合併發佈一次，當月的捐款預期可能要等到下一個月時才能查詢。</p>
<ul>
<li><a href="https://blog.ocf.tw/search/label/%E6%8D%90%E6%AC%BE%E5%BE%B5%E4%BF%A1">開放文化基金會 Open Culture Foundation</a>
<ul>
<li><a href="https://blog.ocf.tw/2023/11/2023-10.html">2023-10 捐款徵信</a></li>
<li><a href="https://blog.ocf.tw/2023/12/2023-11.html">2023-11 捐款徵信</a></li>
</ul>
</li>
</ul>
<p>另有摩茲工寮的成果報告如下:</p>
<ul>
<li><a href="https://medium.com/mozilla-related/moztw-space-status-2023-27dd60ffe7d8">摩茲工寮成果報告, 2014~2023 | Mozilla related</a></li>
</ul>
]]></content:encoded>
          
      <enclosure url="https://i.imgur.com/vbmoLrw.png" length="2003351" type="image/png" />
      <media:content url="https://6bcf7279.info/2023/12/21/ddc538de/https://i.imgur.com/vbmoLrw.png" medium="image">
        <media:title type="html">Imgur</media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[初識 debuginfod]]></title>
      <link>https://6bcf7279.info/2023/10/08/c265e99b/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Sun, 08 Oct 2023 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2023/10/08/c265e99b/</guid>
      <description><![CDATA[<h1 id="初識-debuginfod">初識 debuginfod</h1>
<p>讀到 fcamel 的一篇文章 <a href="https://fcamel-life.blogspot.com/2017/09/gccg.html">fcamel 技術隨手記: 讀出 gcc/g++ 編譯的參數</a> ，文中揭示可利用 <code>readelf</code> 指令來抓取該 binary 的 gcc/g++ 編譯參數：</p>
<pre tabindex="0"><code>readelf --debug-dump f | grep DW_AT_producer
</code></pre><p>進一步想，手邊正在使用的 Arch Linux 系統， 是否也能用相同方法取得資訊？</p>]]></description>
      <content:encoded><![CDATA[<h1 id="初識-debuginfod">初識 debuginfod</h1>
<p>讀到 fcamel 的一篇文章 <a href="https://fcamel-life.blogspot.com/2017/09/gccg.html">fcamel 技術隨手記: 讀出 gcc/g++ 編譯的參數</a> ，文中揭示可利用 <code>readelf</code> 指令來抓取該 binary 的 gcc/g++ 編譯參數：</p>
<pre tabindex="0"><code>readelf --debug-dump f | grep DW_AT_producer
</code></pre><p>進一步想，手邊正在使用的 Arch Linux 系統， 是否也能用相同方法取得資訊？</p>
<p>就以往的經驗， Linux 系統上程式的 debug 資訊通常另外由 <code>*-dbg</code> 或 <code>*-dbgsym</code> 的套件提供。例如 <code>coreutils</code> 套件會另外有  <code>coreutils-dbgsym</code> 的套件。</p>
<p>不過，目前主流的趨勢已改由新的 <strong>debuginfod</strong> 的機制來取代。</p>
<p>Arch Linux 也於 2022-02-02 上線了 debuginfod 的服務(註: <a href="https://archlinux.org/news/debug-packages-and-debuginfod/">Arch Linux - News: Debug packages and debuginfod</a>)。資訊主頁爲：<a href="https://debuginfod.archlinux.org/">Debuginfod service - Arch Linux</a> 。</p>
<p>
  <img src="attachments/bf1b001b047b9b842dbe7cdb76772566.png" alt="Pasted image 20240428221656.png">

</p>
<p>另外，從其伺服器提供的報表: <a href="https://dashboards.archlinux.org/d/U0xac1x7z/debuginfod?orgId=1">debuginfod - Dashboards - Grafana</a>，也可一窺實際使用的流量。</p>
<p>而在 Arch Linux 上使用 debuginfod 的入口文件爲: <a href="https://wiki.archlinux.org/title/Debuginfod">Debuginfod - ArchWiki</a></p>
<h2 id="試用">試用</h2>
<p>在 Arch Linux 上試用的方法如下:</p>
<h3 id="step-1-先安裝-debuginfod-的套件">Step 1. 先安裝 <code>debuginfod</code> 的套件</h3>
<p>指令如下:</p>
<pre tabindex="0"><code>pacman -S debuginfod
</code></pre><p>其中 <code>libelf</code> 作爲 <code>debuginfod</code> 的 dependency 也會一併安裝進來。
安裝後，預計會有下述的執行檔跟設定檔：</p>
<ul>
<li><code>/usr/bin/debuginfod-find</code></li>
<li><code>/etc/profile.d/debuginfod.sh</code></li>
<li><code>/etc/debuginfod/archlinux.urls</code></li>
</ul>
<h3 id="step-2-設定-debuginfod_urls-的環境參數">Step 2. 設定 <code>$DEBUGINFOD_URLS</code> 的環境參數</h3>
<p>手動設定環境的指令如下：</p>
<pre tabindex="0"><code>export DEBUGINFOD_URLS=&#34;https://debuginfod.archlinux.org&#34;
</code></pre><p>但不必每次都手動執行，若重啓系統（重新登入、重開機）的話，系統會自動讀入 <code>/etc/profile.d/debuginfod.sh</code> 、 <code>/etc/debuginfod/archlinux.urls</code> 的設定，而自動初始化 <code>$DEBUGINFOD_URLS</code> 的環境參數。</p>
<h3 id="step-3-測試-debuginfod-find-工具">Step 3. 測試 <code>debuginfod-find</code> 工具</h3>
<p>執行測試指令如下：</p>
<pre tabindex="0"><code>debuginfod-find debuginfo `which ls`
</code></pre><p>若成功的話，預期會有如下的結果：</p>
<pre tabindex="0"><code>$ debuginfod-find debuginfo `which ls`
/home/users/.cache/debuginfod_client/7aa8f52223e371fb77314d9a363129574096093b/debuginfo
</code></pre><h3 id="step-4-測試-readelf--抓取資訊">Step 4. 測試 <code>readelf</code>  抓取資訊</h3>
<pre tabindex="0"><code>readelf --debug-dump `which ls` | grep -e &#34;DW_AT_producer\s*:&#34; | head -1
</code></pre><p>若成功的話，預期會得到結果如下：</p>
<pre tabindex="0"><code>$ readelf --debug-dump `which ls` | grep -e &#34;DW_AT_producer\s*:&#34; | head -1
    &lt;d&gt;   DW_AT_producer    : (indirect string, offset: 0x8f): GNU GIMPLE 13.2.1 20230801 -march=x86-64 -mtune=generic -g -g -O2 -O2 -fno-openmp -fno-openacc -fPIC -fcf-protection=full -fno-plt -fexceptions -fstack-clash-protection -fcf-protection=full -fltrans
</code></pre><p>如此，就也能得到上述 fcamel 方法的結果。</p>
<h3 id="step-5-測試-gdb">Step 5. 測試 <code>gdb</code></h3>
<p>執行指令：</p>
<pre tabindex="0"><code>gdb `which ls`
</code></pre><p>在遇到提示問題時，回答 <code>y</code>，如下：</p>
<pre tabindex="0"><code>Enable debuginfod for this session? (y or [n]) y
</code></pre><p>之後就照往常的方式使用。預期過程如下：</p>
<pre tabindex="0"><code>$ gdb `which ls`
GNU gdb (GDB) 14.2
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type &#34;show copying&#34; and &#34;show warranty&#34; for details.
This GDB was configured as &#34;x86_64-pc-linux-gnu&#34;.
Type &#34;show configuration&#34; for configuration details.
For bug reporting instructions, please see:
&lt;https://www.gnu.org/software/gdb/bugs/&gt;.
Find the GDB manual and other documentation resources online at:
    &lt;http://www.gnu.org/software/gdb/documentation/&gt;.

For help, type &#34;help&#34;.
Type &#34;apropos word&#34; to search for commands related to &#34;word&#34;...
Reading symbols from /usr/bin/ls...

This GDB supports auto-downloading debuginfo from the following URLs:
  &lt;https://debuginfod.archlinux.org&gt;
Enable debuginfod for this session? (y or [n]) y
Debuginfod has been enabled.
To make this setting permanent, add &#39;set debuginfod enabled on&#39; to .gdbinit.
Reading symbols from /home/users/.cache/debuginfod_client/7aa8f52223e371fb77314d9a363129574096093b/debuginfo...                                                
(gdb) break main
Breakpoint 1 at 0x3050: file src/ls.c, line 1655.                                                                                                            
(gdb) run
Starting program: /usr/bin/ls 
[Thread debugging using libthread_db enabled]                                                                                                                
Using host libthread_db library &#34;/usr/lib/libthread_db.so.1&#34;.

Breakpoint 1, main (argc=1, argv=0x7fffffffe868) at src/ls.c:1655
1655	{
(gdb) 
</code></pre><h2 id="遇過的問題">遇過的問題</h2>
<p>分享一些遇到的問題跟檢查的方法如下：</p>
<h3 id="check--1-確認環境參數且網站連線正常">Check  1. 確認環境參數，且網站連線正常</h3>
<pre tabindex="0"><code>echo $DEBUGINFOD_URLS
</code></pre><pre tabindex="0"><code>curl -vL $DEBUGINFOD_URLS
</code></pre><h3 id="check-2-不是所有的套件都有-debug-info">Check 2. 不是所有的套件都有 debug info</h3>
<p>有提供 debug info 的，大多是 C/C++ based 的程式。而像是 <code>d-feet</code> 這類由 python 寫的程式，是沒有 debug info 的。</p>
<p>可查詢線上的套件清單資訊，看是否有包含：</p>
<ul>
<li><a href="https://debuginfod.archlinux.org/packages">debuginfod.archlinux.org/packages</a></li>
</ul>
<p>查所在的套件可參考下述指令:</p>
<pre tabindex="0"><code>pacman -F /usr/bin/ls
</code></pre><pre tabindex="0"><code>pacman -Ql | grep -e &#34;\s/usr/bin/ls$&#34;
</code></pre><h3 id="check-3-確認版本一致">Check 3. 確認版本一致</h3>
<p>要注意到，本地端的版本和遠端是否一致。例如，以上述 <code>/usr/bin/ls</code> 所在的 <code>coreutils</code> 套件爲例。若本機端的版本是 <code>coreutils-9.4-3</code> 而 Arch Linux 伺服器上的版本是 <code>coreutils-9.5-1</code> ，那就會取不到 debug info 的資料。</p>
<h2 id="關於-debuginfod">關於 debuginfod</h2>
<p>debuginfod 是 elfutils 的一部分。就目前溯源的部分，最早的紀錄是 2019-10-28 的 <a href="https://sourceware.org/git/?p=elfutils.git;a=commit;h=288f6b199a8b1a60d4fb1f54ca7b883cdd5afca2">sourceware.org Git - elfutils.git/commit</a> ，主要作者爲 Aaron Merey 、 Frank Ch. Eigler。</p>
<p>在其<a href="https://sourceware.org/elfutils/Debuginfod.html">專案主頁</a>，也列有早期的文件，例如：</p>
<ul>
<li>2019-09-13, <a href="https://gcc.gnu.org/wiki/cauldron2019#cauldron2019talks.The_elfutils_debuginfo_server">GNU Tools Cauldron 2019 的活動</a> 及其<a href="https://gcc.gnu.org/wiki/cauldron2019talks?action=AttachFile&amp;do=view&amp;target=dbgserver.pdf">投影片</a></li>
<li>2019-10-14, <a href="https://developers.redhat.com/blog/2019/10/14/introducing-debuginfod-the-elfutils-debuginfo-server">Introducing debuginfod, the elfutils debuginfo server | Red Hat Developer</a></li>
<li>2019-12-17, <a href="https://developers.redhat.com/blog/2019/12/17/deploying-debuginfod-servers-for-your-developers">Deploying debuginfod servers for your developers | Red Hat Developer</a></li>
</ul>
<h2 id="ref">Ref.</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=_iaK9L7akJU">The elfutils debuginfod server - YouTube</a></li>
<li><a href="https://remonstrate.wordpress.com/2023/02/21/%e4%b8%80%e4%ba%9b%e6%9c%89%e7%94%a8%e7%9a%84%e5%bc%80%e5%8f%91%e8%b0%83%e8%af%95%e5%b7%a5%e5%85%b7/">一些有用的开发调试工具 – demonstrate 的 blog</a></li>
</ul>
<h2 id="2023-10-09">2023-10-09</h2>
<p>參考 <a href="https://ice1187.github.io/setup-glibc-debug-symbols-on-arch-linux/">Setup Glibc Debug Symbols on Arch Linux | Ice1187’s Blog</a> 一文。
提到在 <code>~/.gdbinit</code> 的設定檔可設定 <code>set debuginfod enabled ask</code>。</p>
<p>更詳細的設定方式可參考上游文件: <a href="https://sourceware.org/gdb/current/onlinedocs/gdb.html/Debuginfod-Settings.html">Debuginfod Settings (Debugging with GDB)</a></p>
<p>參考指令:</p>
<pre tabindex="0"><code>show debuginfod enabled
show debuginfod urls
show debuginfod verbose
</code></pre><p>其中 <code>enabled</code> 有 <code>on</code>, <code>off</code>, <code>ask</code> 三個選項。</p>
]]></content:encoded>
          
          
      <enclosure url="https://6bcf7279.info/2023/10/08/c265e99b/attachments/bf1b001b047b9b842dbe7cdb76772566.png" length="62090" type="image/png" />
      <media:content url="https://6bcf7279.info/2023/10/08/c265e99b/attachments/bf1b001b047b9b842dbe7cdb76772566.png" medium="image">
        <media:title type="html">Pasted image 20240428221656.png</media:title>
      </media:content>
    </item>
    <item>
      <title><![CDATA[對流層 vs 平流層]]></title>
      <link>https://6bcf7279.info/2023/09/07/bfda13e4/</link>
      <dc:creator><![CDATA[Chun-Yu Lee (Mat)]]></dc:creator>
      <pubDate>Thu, 07 Sep 2023 00:00:00 +0000</pubDate>
      <category><![CDATA[post]]></category>
      
      <guid>https://6bcf7279.info/2023/09/07/bfda13e4/</guid>
      <description><![CDATA[<h1 id="對流層-vs-平流層">對流層 vs 平流層</h1>
<p>長途客機飛行常經歷對流層與平流層兩種不同情境。</p>
<p>因對流層的天氣不穩定、變化很快，若不能適時應對，全機同遭滅頂之禍。在此背景下，一切便以遵從單一權威者(即機長)的獨裁領導、當機立斷為主。</p>]]></description>
      <content:encoded><![CDATA[<h1 id="對流層-vs-平流層">對流層 vs 平流層</h1>
<p>長途客機飛行常經歷對流層與平流層兩種不同情境。</p>
<p>因對流層的天氣不穩定、變化很快，若不能適時應對，全機同遭滅頂之禍。在此背景下，一切便以遵從單一權威者(即機長)的獨裁領導、當機立斷為主。</p>
<p>然而爬升到平流層之後，天氣穩定很多。客艙的用餐時間，以及駕駛間的輪替休息，往往都是選在這時期。為了增進眾人的和諧共持，往往會傾向採行有更多討論與協調空間的管理合作方式。</p>
<p>組織的運作也是相同的道理。
當組織遇有緊急事件或面臨存滅之際，如同對流層時期，需要的是決斷力與意志力。然而承平時期，權威與獨斷的效果有限，甚而反噬。</p>
<p>所以說，治理手法之民主與獨裁並無絕對，端看所處的時空背景而定。</p>
<h2 id="2023-09-07">2023-09-07</h2>
<p>早年，內心總期望理想與手段前後一致，能一以貫之。
若，所謂民主是進步、是真理的話，何不能從一而終？
然經過一番經歷與反思，才漸漸明白，所謂民主、獨裁，都只是治理手段而已，最終還是取決當下面臨的局勢是什麼。
什麼樣的情境，就用什麼樣的方法去應對。</p>
<h2 id="2024-08-09">2024-08-09</h2>
<p>看到 gslin 的 blog 提到 Go 的領導交棒的消息: <a href="https://blog.gslin.org/archives/2024/08/07/11926/russ-cox-%e5%be%9e-go-%e7%9a%84-tech-lead-%e8%ba%ab%e5%88%86%e4%ba%a4%e6%a3%92%e5%87%ba%e4%be%86/">Russ Cox 從 Go 的 tech lead 身分交棒出來 – Gea-Suan Lin&rsquo;s BLOG</a> 。</p>
<p>不禁聯想到 2019-07-17 時 Guido van Rossum 步下 <a href="https://en.wikipedia.org/wiki/Benevolent_dictator_for_life">BDFL</a> 的消息: <a href="https://www.mail-archive.com/python-committers@python.org/msg05628.html">[python-committers] Transfer of power</a> 。</p>
<p>BDFL(終身的仁慈獨裁者) 一詞的起源是 1995 年 PSA(Python Software Association, or Python Software Activity) 籌辦過程的內部信件 <a href="https://www.artima.com/weblogs/viewpost.jsp?thread=235725">Origin of BDFL</a> 而來。</p>
<p>可在多個 open source 專案中看到這樣的角色。從 BDFL 的交棒與弱化，也代表該專案早已進入平流層階段了。</p>
]]></content:encoded>
          
      <media:content url="https://6bcf7279.info/2023/09/07/bfda13e4/" medium="image">
        <media:title type="html"></media:title>
      </media:content>
    </item>
  </channel>
</rss>
