<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on LCY's Notes</title><link>https://blog.lcy.one/post/</link><description>Recent content in Posts on LCY's Notes</description><generator>Hugo</generator><language>zh-tw</language><copyright>lcy</copyright><lastBuildDate>Mon, 30 Dec 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://blog.lcy.one/post/feed.xml" rel="self" type="application/rss+xml"/><item><title>透過 USB/IP 把印表機接到 Windows 電腦上</title><link>https://blog.lcy.one/2024/12/30/usb-ip-printer.html</link><pubDate>Mon, 30 Dec 2024 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2024/12/30/usb-ip-printer.html</guid><description>&lt;p&gt;幾個月前的文章 &lt;a href="https://blog.lcy.one/2024/10/20/epson-l360-on-raspberry-pi.html"&gt;將 Raspberry Pi 接上 Epson L360 設定成印表機伺服器&lt;/a&gt;&lt;br&gt;
提到了需要把印表機接上 Raspberry Pi 來分享給家裡的其它電腦用&lt;br&gt;
最後是透過 Samba + CUPS 做到&lt;br&gt;
並對 ENPC 的請求封包回傳一個空的回應來解決驅動程式會卡住的困擾&lt;/p&gt;
&lt;p&gt;結果之後發現印表機還是會出現一些問題&amp;hellip;&lt;br&gt;
後來研究半天，決定改成透過 USB/IP 來把印表機接到 Windows 電腦上&lt;/p&gt;</description><content:encoded><![CDATA[<p>幾個月前的文章 <a href="/2024/10/20/epson-l360-on-raspberry-pi.html">將 Raspberry Pi 接上 Epson L360 設定成印表機伺服器</a><br>
提到了需要把印表機接上 Raspberry Pi 來分享給家裡的其它電腦用<br>
最後是透過 Samba + CUPS 做到<br>
並對 ENPC 的請求封包回傳一個空的回應來解決驅動程式會卡住的困擾</p>
<p>結果之後發現印表機還是會出現一些問題&hellip;<br>
後來研究半天，決定改成透過 USB/IP 來把印表機接到 Windows 電腦上</p>
<h2 id="前情提要">前情提要</h2>
<p>一些背景就不重複了，可以參考<a href="/2024/10/20/epson-l360-on-raspberry-pi.html#%e5%89%8d%e6%83%85%e6%8f%90%e8%a6%81">前一篇文章</a><br>
簡單來說就是要把一台接到 Raspberry Pi 的印表機<br>
不透過實體 USB 線，弄到可以從 Windows 電腦上列印</p>
<h3 id="前一篇文章的最終方案出現的問題">前一篇文章的最終方案出現的問題</h3>
<p>前一篇文章提到的 Samba + CUPS + 空 ENPC 封包方案<br>
剛設定完後<br>
列印都沒問題，操作延遲也都在可接受範圍內</p>
<p>但是過一段時間<br>
打開印表機，從 Windows 電腦列印的時候<br>
印表機卻會印到約 95% 就把紙送出來<br>
然後停住、亮缺紙／夾紙燈</p>
<p>正常來說真的發生缺紙或夾紙的話<br>
把紙處理好，按下印表機上的送紙鍵就會繼續列印</p>
<p>可是現在按下任何按鍵都沒反應<br>
即使把印表機重開都沒辦法解決<br>
最後發現要到 Raspberry Pi 上清掉列印工作、重開 CUPS 才能解決</p>
<p>然後過一陣子又會再發生一樣的情況</p>
<h3 id="是-enpc-封包的問題嗎">是 ENPC 封包的問題嗎&hellip;？</h3>
<p>本來猜說是不是 ENPC 封包的問題<br>
回應空封包可能會讓驅動程式出問題？</p>
<p>於是把印表機暫時接到一台 Windows 電腦上<br>
裝好 Epson 官方的驅動程式，打開 Windows 的分享功能<br>
到另一台 Windows 電腦上安裝驅動程式透過 SMB 連上那台印表機<br>
再用 WireShark 看看正常情況下的 ENPC 封包是要回應什麼</p>
<p>結果發現這種情況下<br>
客戶端的驅動程式根本就不會發送 ENPC 請求封包<br>
這就表示對 Epson 的驅動程式來說<br>
遠端印表機是接在 Samba + CUPS 的組合上，跟接到 Windows 電腦上，是有差異的</p>
<p>到這一步就可以知道要解決 Samba + CUPS 的問題不會很容易<br>
甚至可能是不可能的了<br>
畢竟我們不知道 Epson 的驅動程式具體做了什麼</p>
<h2 id="usbip">USB/IP</h2>
<p>後來決定改試試看 USB/IP 協定<br>
這個協定簡單來說，就是伺服器端把 USB 設備透過網路分享出去<br>
客戶端就可以把這個設備當作是接在自己的電腦上一樣使用</p>
<p>詳細說明可以參考以下幾個連結：</p>
<ul>
<li><a href="https://www.kernel.org/doc/html/latest/usb/usbip_protocol.html">https://www.kernel.org/doc/html/latest/usb/usbip_protocol.html</a></li>
<li><a href="https://usbip.sourceforge.net/">https://usbip.sourceforge.net/</a></li>
<li><a href="https://wiki.archlinux.org/title/USB/IP">https://wiki.archlinux.org/title/USB/IP</a></li>
</ul>
<p>其實一開始就有考慮過這個方案了<br>
雖然 USB/IP 在 Linux 上是<a href="https://github.com/torvalds/linux/tree/master/tools/usb/usbip">內建在 kernel 裡</a>，又已經有一段時間了<br>
應該算穩定<br>
但我的使用情境裡，客戶端是 Windows<br>
之前查了一下，發現現在 Windows 上的 USB/IP 驅動程式好像還有一些問題<br>
就想說先試試看其它的作法</p>
<p>不過現在看來<br>
還是得試試看這個方案了</p>
<h3 id="大致流程">大致流程</h3>
<h4 id="伺服器端raspberry-pi">伺服器端（Raspberry Pi）</h4>
<ol>
<li>安裝 <a href="https://packages.debian.org/bookworm/usbip">usbip</a></li>
<li>啟動 <code>usbipd</code> 服務</li>
<li>把印表機 bind 到 USB/IP 分享出去</li>
</ol>
<h4 id="客戶端windows">客戶端（Windows）</h4>
<ol>
<li>安裝 <a href="https://github.com/cezanne/usbip-win">cezanne/usbip-win</a> 的驅動程式</li>
<li>Attach 到伺服器端的印表機</li>
</ol>
<h3 id="額外說明">額外說明</h3>
<h4 id="伺服器端在重開重接後自動-bind">伺服器端在重開、重接後自動 bind</h4>
<p>由於 USB 裝置因為拔掉或關機而與系統斷開連線時<br>
USB/IP 會取消 bind 的狀態<br>
重新連上也不會自動 bind 回去<br>
所以會需要一些機制來自動把印表機 bind 上去</p>
<p>另外 <code>usbipd</code> 這個服務在 Debian 上的 <code>usbip</code> 套件裡是沒有包含 systemd 服務的<br>
所以也不會自動在系統開機時啟動</p>
<p>所以我就參考一些網路上看到的作法<br>
寫了一個 systemd unit 檔案來自動啟動 <code>usbipd</code> 服務<br>
以及一個 udev rule，在印表機連上時自動跑 <code>usbip bind</code></p>
<p><a href="https://github.com/lcy0321/systemd-udev-usbip-printers">https://github.com/lcy0321/systemd-udev-usbip-printers</a></p>
<h4 id="客戶端的驅動程式">客戶端的驅動程式</h4>
<p>前面提到 Windows 上的 USB/IP 驅動程式好像有一些問題<br>
是指說歷史比較悠久、驅動程式有簽章的 <a href="https://github.com/cezanne/usbip-win">cezanne/usbip-win</a> 已經沒在維護了<br>
而有持續在開發的 <a href="https://github.com/vadimgrn/usbip-win2">vadimgrn/usbip-win2</a> 目前還沒有驅動程式簽章<br>
沒有簽章的話，Windows 必須要開啟 <code>TESTSIGNING</code> 模式才能安裝並使用這個驅動程式<br>
這會降低系統的安全性，而且據說有些銀行的程式會不給在這個模式下使用</p>
<p>我還是先選擇舊的 <code>cezanne/usbip-win</code> 來試試看<br>
使用的是有簽章的版本 <a href="https://github.com/cezanne/usbip-win/releases/tag/v0.3.6-dev">0.3.6-dev</a><br>
目前看起來沒出現什麼問題<br>
不過還是希望能有公司出現幫 <code>vadimgrn/usbip-win2</code> 的驅動程式簽章</p>
<h4 id="客戶端自動-attach">客戶端自動 attach</h4>
<p>類似伺服器端的問題<br>
伺服器端的 USB/IP 裝置因為關機之類的問題而消失時<br>
客戶端也會自動取消 attach<br>
所以需要一個機制來自動 attach</p>
<p>本來是想透過 Windows 的工作排程器來實作<br>
每隔一段時間就執行一次 <code>usbip attach</code> 指令<br>
反正如果已經 attach 了，再 attach 也不會有問題<br>
伺服器端的 USB/IP 裝置不在的話，指令會失敗，也不會有什麼問題</p>
<p>不過這樣有兩個問題</p>
<p>第一是工作排程器的最小間隔是 1 分鐘<br>
這就表示打開印表機到客戶端 attach 的時間最多會延遲 1 分鐘</p>
<p>第二是伺服器端上會出現一大堆 error log<br>
顯示有客戶端試圖 attach 一個不存在的 USB/IP 裝置<br>
或是試圖 attach 一個已經被 attach 的裝置</p>
<p>所以後來寫了一個 PowerShell script<br>
只在目前沒有 attach 的情況下<br>
執行 list 指令，看看伺服器端上的 USB/IP 裝置在不在<br>
在的話就 attach；不在的話就不做任何事情<br>
等個幾秒後再重複這個動作</p>
<p>然後再用 <a href="https://github.com/winsw/winsw">winsw</a> 把它包裝成 Windows 服務<br>
讓它開機時自動啟動，並在意外關閉時自動重啟</p>
<h2 id="結論">結論</h2>
<p>目前試起來是沒有問題<br>
不過前幾次的問題也是過一陣子才會出現&hellip;<br>
所以還是要再觀察一陣子才能確定</p>]]></content:encoded></item><item><title>新屋裝修與設計</title><link>https://blog.lcy.one/2024/12/07/house-renovation.html</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2024/12/07/house-renovation.html</guid><description>&lt;p&gt;這篇文章與平常的技術文章不同，是紀錄新家裝修與設計的過程&lt;/p&gt;
&lt;p&gt;最近我們家購入新屋，是一棟 15～20 年的中古屋&lt;br&gt;
原本是隔成許多戶分租給學生，屋況不是很好&lt;br&gt;
所以要搬進去住一定得整個重新裝修&lt;br&gt;
考慮到預期是要長期居住的（至少我父母是），所以想說要找設計師來做整體的規劃和設計&lt;/p&gt;</description><content:encoded><![CDATA[<p>這篇文章與平常的技術文章不同，是紀錄新家裝修與設計的過程</p>
<p>最近我們家購入新屋，是一棟 15～20 年的中古屋<br>
原本是隔成許多戶分租給學生，屋況不是很好<br>
所以要搬進去住一定得整個重新裝修<br>
考慮到預期是要長期居住的（至少我父母是），所以想說要找設計師來做整體的規劃和設計</p>
<h2 id="大致時間線">大致時間線</h2>
<ul>
<li>N：與原屋主簽約，確定購屋。同時開始找設計公司。 </li>
<li>N + 1 週 ～ 4 週：找幾家設計公司諮詢、丈量、報價，然後決定了其中一家。 </li>
<li>N + 1 個月：交屋。開始與設計公司討論設計方案。 </li>
<li>N + 3 個月：開工。 </li>
<li>N + 7 個月：完工驗收。 </li>
<li>N + 8 個月：搬家入住。 </li>
</ul>
<h2 id="找設計公司">找設計公司</h2>
<h3 id="考量因素">考量因素</h3>
<p>找設計公司的過程中，主要是考量以下因素：</p>
<h4 id="地點">地點</h4>
<p>希望設計公司不要離我們新家和舊家太遠<br>
一方面溝通成本比較低，另一方面之後施工的時候對方也比較方便</p>
<h4 id="設計風格">設計風格</h4>
<p>我們家的共識主要是想要簡潔的風格，不要太多花俏的裝飾<br>
這個應該也是現在主流的風格，像是北歐風或日式風之類的<br>
所以就是參考各家設計公司在官方網站或社群平台上的作品集，看看會不會離我們的期待太遠</p>
<h4 id="評價">評價</h4>
<p>主要就 Google 地圖上的評價，再加上拿公司名稱去搜尋看看有沒有什麼評論<br>
不過住家附近的一些小設計公司可能就沒有太多評價，比較不好分辨<br>
我是評論數太少、Google 找不到的就先略過</p>
<h4 id="室內裝修業登記">室內裝修業登記</h4>
<p>雖然新北市不像台北市，會嚴格要求裝修需要申請室內裝修許可證<br>
但是想說還是找個有合法登記的公司比較保險（可以到<a href="https://cloudbm.nlma.gov.tw/CPTL/cpt0603m.do">這裡</a>查）</p>
<h3 id="最終選擇">最終選擇</h3>
<p>根據以上考量，最後是找到兩間設計公司<br>
一個是連鎖的大公司，在新家附近有據點<br>
另一個是小型的公司，也是在新家附近</p>
<p>綜合考慮報價和討論過程中的體驗<br>
最後選擇了小型的公司</p>
<h2 id="討論及施工過程">討論及施工過程</h2>
<p>基本上每一間設計公司要走的流程都差不多<br>
諮詢、丈量、報價、討論、施工、驗收</p>
<p>討論又分為幾個階段<br>
其中每項都討論了非常多細節，也花了很多時間在跟家人還有設計師討論<br>
每次討論也都會有前幾次的項目需要再修改討論<br>
以下只列大致內容，並提一些比較特別的部分</p>
<h3 id="平面配置圖">平面配置圖</h3>
<p>平面配置圖就是丈量後最初步的設計<br>
規劃家裡的隔間和用途，以及大致的家具配置<br>
以及指定一些裝修材料、設備，以及工法<br>
以我們家為例，主要是討論：</p>
<ul>
<li>廚房一字型要改 L 型</li>
<li>系統櫃擺設的位置</li>
<li>一間輕隔間與外面系統櫃分配的空間</li>
<li>水管不用重拉；電線要重拉</li>
</ul>
<p>在這階段也會有初步的報價<br>
要再往後走流程的話就要簽約了</p>
<blockquote>
<p>[!NOTE]<br>
這邊有一個點是我提出了要把網路線的 CAT-5e 換成 CAT-6<br>
想說價差不大，沒什麼理由用 CAT-5e</p>
</blockquote>
<h3 id="平面系統圖">平面系統圖</h3>
<p>在這階段就會提供幾張更詳細的平面圖來討論，包括：</p>
<ul>
<li>平面配置圖</li>
<li>拆除圖</li>
<li>木作隔間圖</li>
<li>系統櫃配置圖</li>
<li>泥作圖</li>
<li>天花板圖</li>
<li>木地板圖</li>
<li>冷氣空調圖</li>
<li>插座弱電圖</li>
<li>燈具迴路圖</li>
<li>塗裝玻璃圖</li>
</ul>
<p>會一張一張的討論<br>
看大家哪邊有意見或是有什麼想法<br>
這些圖在後續每次討論，都會再拿出來修修改改<br>
每次討論都會有更新</p>
<blockquote>
<p>[!NOTE]<br>
我自己算一算我自己房間的用電量<br>
每項都多抓一點，就發現可能會需要第二個迴路<br>
就有提出來，還有要求插座多一點</p>
</blockquote>
<h3 id="系統櫃立面圖白模圖">系統櫃立面圖、白模圖</h3>
<p>前面的圖都是平面圖，這邊就是立體的圖</p>
<p>立面圖是系統櫃具體的的設計<br>
看隔層和高度的設計、抽屜和門的選擇、把手的樣式等</p>
<p>白模圖就是整個房間的未上色 3D 模型圖<br>
可以比較直觀地看到整個房間的樣子，看跟預期有沒有差異</p>
<p>也在這時候會讓我們回去討論選擇各個牆面、系統櫃、地板、天花板等的顏色或花紋</p>
<h3 id="彩圖">彩圖</h3>
<p>這邊幾乎就是開工前的最後討論了<br>
設計師會拿出各個空間已經上色的 3D 模型渲染圖<br>
看看跟預期有沒有差異，有沒有什麼地方需要修改</p>
<blockquote>
<p>[!NOTE]<br>
這階段的時候我有提出想採用比較好看的插座和開關<br>
原本都是 Panasonic 的<a href="https://www.panasonic.com/tw/homeliving/housing/wiring/switches/deco-lite.html">星光系列</a><br>
後來把公共空間顯眼位置的開關改成 <a href="https://www.panasonic.com/tw/homeliving/housing/wiring/switches/risna.html">RISNA 系列</a><br>
主要是讓雙切開關不會有看起來開關跟實際狀態不一致的問題<br>
我跟妹妹比較在意外觀，把房間顯眼位置的開關和插座改成 <a href="https://www.panasonic.com/tw/homeliving/housing/wiring/switches/glatima.html">GLATIMA 系列</a></p>
</blockquote>
<h3 id="開工前以及施工中">開工前以及施工中</h3>
<p>從最開始討論，一直到開工前，甚至是施工中<br>
中間每次有想法或是有問題都會透過 LINE 或電話再跟設計師討論確認<br>
會需要現場見面的，通常都是要針對圖面討論，比較不方便單純用文字或語音</p>
<h3 id="浴室配件與窗簾">浴室配件與窗簾</h3>
<p>施工到最終階段前<br>
會再約一次到裝修現場，確認浴室配件和窗簾<br>
主要是這個階段才確切地知道浴室的配置和大小<br>
也才能現場感受未來的使用情境</p>
<h3 id="完工驗收">完工驗收</h3>
<p>最後驗收的時候<br>
會再次確認每個空間的設計和裝修是否符合預期<br>
操作每個開關、抽屜、門窗，看看有沒有問題<br>
像我們就遇到有少數幾個櫃子門有點卡卡的，還有一些木作的邊角有點尖<br>
不過幾乎都沒有太大問題</p>
<h3 id="其它">其它</h3>
<p>中間除了與設計公司接洽外<br>
還有一些其它與裝修相關的事情要另外處理</p>
<h4 id="家具行">家具行</h4>
<p>找了幾間家具行，跟家人一起去物色有沒有適合的<br>
除了一些地方的家具行之外<br>
還去逛了像是 <a href="https://www.ikea.com.tw/">IKEA</a> 和<a href="http://www.decorhouse.com.tw/">特力家居</a>這類的連鎖展示中心</p>
<h4 id="瞬熱飲水機">瞬熱飲水機</h4>
<p>想說都重新裝修了，順便裝個瞬熱飲水機<br>
也找家人跑去 <a href="https://www.voca.com.tw/">VOCA</a> 的展示據點體驗看看<br>
然後選擇想要的配備</p>
<h4 id="浴室配件">浴室配件</h4>
<p>浴室配件光看設計師和網頁上的圖片沒什麼感覺<br>
於是在浴室配件討論前，也跟家人一起去 <a href="https://ovotoilet.com/">OVO</a> 的展示中心看看<br>
現場看展示品，比較能感受到實際的使用情境<br>
幫助我們在跟設計師討論前，決定想要的配備</p>
<h4 id="冷氣廠商">冷氣廠商</h4>
<p>這間設計公司不直接經手冷氣空調的部分<br>
而是我們要自己找冷氣廠商，再請他們跟設計公司接洽</p>
<p>設計公司也有介紹一間冷氣廠商<br>
我們自己詢問了幾間之後，最後還是選擇了設計公司介紹的那間</p>
<p>這邊本來有想到要不要裝全熱交換器和全戶除濕機<br>
後來跟家人討論後覺得可能必要性不高，就還是只有裝分離式冷氣</p>
<p>五台室內機 + 兩台室外機<br>
加上要拉到統一的室外機位置<br>
冷氣主機費用，加上施工費及材料費<br>
總價是新台幣 280,000 元</p>
<h4 id="玄關門噴漆">玄關門噴漆</h4>
<p>玄關門是那種經典的硫化銅門<br>
不知道是年久還是保養不當，已經有點生鏽和掉漆<br>
導致看起來很老舊，與新裝修的風格不太符合</p>
<p>本來設計公司是建議可以找廠商貼膜<br>
不過聯絡貼膜廠商後，他們認為我們的門上有一些凹凸造型<br>
貼膜會很費工，成本很高<br>
建議我們改用噴漆</p>
<p>後來就連絡了廠商來噴漆<br>
報價是新台幣 13,000 元<br>
噴完後看起來跟新的一樣，效果不錯</p>
<h4 id="電子鎖">電子鎖</h4>
<p>家人對電子鎖有興趣<br>
不過由於我們是雙玄關門的設計，款式上有點限制<br>
推拉式的幾乎都會卡到另一個門的手把<br>
所以只能選擇手把式</p>
<p>我本來想選擇 <a href="https://www.tiscservice.com/prod/ailock">AiLock</a> 的電子鎖<br>
但家人比較偏好<a href="https://www.ljtwm.com/">飛利浦</a>的款式<br>
所以後來就選擇了飛利浦的電子鎖</p>
<h3 id="後續">後續</h3>
<p>入住後<br>
陸續還是會遇到一些小問題需要處理<br>
像是矽利康不夠、電燈開關卡住、油漆因地震裂開等<br>
目前跟設計師聯絡都會過來處理<br>
不確定一年保固後還會不會願意幫忙</p>
<h2 id="事後檢討">事後檢討</h2>
<p>目前入住後約半年了<br>
整體而言，包含設計和施工雖然有一些瑕疵<br>
但是問題都不太大，或是有來處理<br>
再加上價格的綜合考量，我自己是覺得還算滿意</p>
<p>而我自己事後是還有想到一些當初沒有想到的、或是應該重新考慮的事情：</p>
<h3 id="弱電廠商">弱電廠商</h3>
<p>這個設計公司是找水電廠商來做弱電工程<br>
其實大部分設計公司應該都是這樣，不會再另外找弱電廠商</p>
<p>但是我覺得如果當初有找弱電廠商<br>
不管在設計階段或是施工階段，可能都會有比較專業的建議或做法<br>
像是說不定就會有方法直接拉線給印表機，見<a href="/2024/10/20/epson-l360-on-raspberry-pi.html">前一篇文章</a></p>
<p>當然應該會再多一筆費用，以及更多的溝通成本</p>
<h3 id="智慧家電">智慧家電</h3>
<p>裝修完、入住後才開始想到智慧家電的部分<br>
才知道要做到比較好的智慧家電整合，其實要在裝修階段就要考慮<br>
包括開關可能要預留中性線等<br>
事後要再補上可能會比較麻煩</p>
<h3 id="水線重拉">水線重拉</h3>
<p>幾間設計公司其實都認為我們 15 年左右的水電管線要不要重拉都可以<br>
當初考慮到電力比較會影響到安全，所以只有電線重拉<br>
不過後來才想到說既然都預期要久住了，應該要連水線都重拉<br>
不然過幾年真的遇到問題才要重發的話，肯定會麻煩很多</p>
<h3 id="全熱交換器與全戶除濕機">全熱交換器與全戶除濕機</h3>
<p>如上面提到的，當初是有考慮要不要裝全熱交換器和全戶除濕機<br>
這兩種裝置都是要在裝修階段就要考慮的<br>
事後除非拆掉天花板，不然是很難再裝的</p>
<p>不過還是認為北部的空氣品質不會太差，所以全熱交換器需求不高<br>
擺一台空氣清淨機就好<br>
濕度感覺也不會太高，所以全戶除濕機也不太需要<br>
需要的時候再擺一台一般的除濕機就好</p>
<p>萬一之後又有別間房子要裝修（至少短期內不會有）<br>
可能會在重新考慮這兩個裝置看看</p>
<h3 id="油漆">油漆</h3>
<p>當初沒有跟設計公司確認到油漆施作時<br>
會不會先處理掉舊有的油漆才上新的</p>
<p>後來發現廠商應該是直接在舊油漆上再上新的<br>
導致油漆的吸附力好像不太好<br>
沒辦法在上面黏東西，整個油漆會一起掉下來</p>
<p>容易有裂痕也不太確定是不是因為這個原因</p>]]></content:encoded></item><item><title>將 Raspberry Pi 接上 Epson L360 設定成印表機伺服器</title><link>https://blog.lcy.one/2024/10/20/epson-l360-on-raspberry-pi.html</link><pubDate>Sun, 20 Oct 2024 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2024/10/20/epson-l360-on-raspberry-pi.html</guid><description>&lt;p&gt;最近搬到新家，客廳的印表機沒辦法拉線接到原本的電腦&lt;br&gt;
所以想說弄一台 Raspberry Pi 接上去，然後透過 Wi-Fi 分享給家裡的其他電腦用&lt;br&gt;
結果遇到了不少問題&lt;/p&gt;</description><content:encoded><![CDATA[<p>最近搬到新家，客廳的印表機沒辦法拉線接到原本的電腦<br>
所以想說弄一台 Raspberry Pi 接上去，然後透過 Wi-Fi 分享給家裡的其他電腦用<br>
結果遇到了不少問題</p>
<h2 id="2024-12-30-更新">2024-12-30 更新</h2>
<p>這篇的最終解法在幾個月後還是出現了問題<br>
後來的解法可見<a href="/2024/12/30/usb-ip-printer.html">新的文章</a></p>
<h2 id="前情提要">前情提要</h2>
<h3 id="印表機">印表機</h3>
<p>家裡的印表機是 Epson L360，是連續供墨的機型<br>
用了快十年，還沒換過幾次墨水匣，滿划算的</p>
<p>本來在舊家放在客廳，是用 USB 接到一台 Windows 電腦上<br>
再透過 Windows 的印表機共用功能，讓家裡的其它電腦可以用</p>
<p>不過搬到新家後，客廳配置不太一樣<br>
放在弱電櫃上方，離電腦有一段距離，沒辦法直接接 USB 線</p>
<h3 id="華碩無線路由器">華碩無線路由器</h3>
<p>本來是先透過 USB 接上華碩的無線路由器（RT-AC66U B1）<br>
搭配這台路由器的<a href="https://www.asus.com/tw/support/faq/114046/">網路印表機伺服器功能</a>，分享給其它電腦用</p>
<p>正常的時候，不論是用華碩 EZ 印表機分享或 LPR 協定分享哪種方式<br>
都可以在客戶端連上印表機後，透過 Epson 本身的驅動程式正常列印<br>
只有一個小問題，用 LPR 協定分享的話，客戶端啟動列印到印表機開始列印之間會有一段 10 到 20 秒的延遲</p>
<p>可是不知道是什麼原因<br>
每次重開印表機的時候，路由器都有機率把它認成 modem 裝置<br>
導致印表機分享功能沒有啟動<br>
這時候就要重開這個功能、重插印表機的 USB 線，或是重開印表機看看能不能解決</p>
<p>對我來說已經算麻煩了<br>
更不用說對家人來說根本不知道怎麼處理</p>
<p>再加上網路上搜尋類似問題的時候，也看到也有人在抱怨<a href="https://www.snbforums.com/threads/ez-printer-sharing-problems-solution.13915/">華碩的網路印表機伺服器功能不太穩定</a><br>
所以就考慮看能不能換個方式</p>
<h3 id="raspberry-pi">Raspberry Pi</h3>
<p>後來就想說搞一台單板電腦像是 Raspberry Pi 來當作印表機伺服器<br>
剛好同事有一台 Raspberry Pi 3 Model B 可以借我<br>
就跟他借來試試看<br>
OS 是以 Debian 12 為基礎的 Raspberry Pi OS</p>
<h2 id="在-raspberry-pi-上安裝驅動程式再透過-cups-分享有問題">在 Raspberry Pi 上安裝驅動程式，再透過 CUPS 分享（有問題）</h2>
<p>首先嘗試的是在 Raspberry Pi 上安裝 Epson L360 的驅動程式<br>
然後再用 CUPS 透過 IPP 協定分享給其它電腦用</p>
<p>CUPS 的安裝和設定這邊就不贅述了，沒有什麼特別的地方</p>
<h3 id="安裝驅動程式">安裝驅動程式</h3>
<p>由於這台印表機有點年代了<br>
什麼 driverless 或 IPP Everywhere 都沒有支援<br>
所以還是要想辦法安裝驅動程式</p>
<p>然後 Epson 官方網站上也沒有提供 ARM64 架構的 Linux 驅動程式<br>
所以也只能找第三方的方案<br>
不過即使是第三方的方案，也沒有直接支援 L360 的驅動程式</p>
<p>幸好 Google 了一下發現不少人表示說可以用 Gutenprint 裡的 Epson L210 或 L310 驅動程式替代<br>
只要安裝 <code>printer-driver-gutenprint</code><br>
之後在 CUPS 加入印表機的時候，model 選擇 Epson L210 或 L310 就可以了</p>
<h3 id="分享印表機">分享印表機</h3>
<p>然後參考 <a href="https://wiki.archlinux.org/title/CUPS/Printer_sharing">ArchWiki 這篇教學</a>的 2.1 和 2.2 章節設定好分享<br>
就可以在區域網路內其它電腦上看到這台印表機了<br>
有開 DNS-SD 的話，Windows 應該直接按一下「搜尋印表機」就可以看到<br>
沒有的話手動加入 <code>http://&lt;HOSTNANME&gt;:631/printers/&lt;PRINTER_NAME&gt;</code> 也可以</p>
<h3 id="成功列印">成功列印&hellip;？</h3>
<p>Windows 加入這台印表機後會透過 IPP 協定去列印<br>
除了選項比較少之外，基本上還是可以列印的</p>
<p>&hellip;本來是這樣想的<br>
結果家父要列印的時候才發現邊界特別大<br>
原本透過官方的驅動程式列印的時候，邊界只有 0.3 公分左右<br>
現在這種方式列印的時候，邊界變成約 1 公分，尤其下邊界更是大到約 1.5 公分<br>
Windows 上的程式要列印的時候就有類似「列印範圍超出紙張範圍」的警告<br>
硬要列印的話，就會有一部分內容被切掉</p>
<p>不過我直接在 Raspberry Pi 上列印同樣的檔案，邊界就是正常的<br>
所以應該是 CUPS 和 Windows 之間 IPP 溝通上有問題</p>
<h4 id="試圖解決">試圖解決</h4>
<p>用 IPP 的工具去看 CUPS 回覆的資訊看不出所以然<br>
後來乾脆直接去改 PPD 檔案，把裡面除了 A4 以外的紙張尺寸都刪掉<br>
然後再到客戶端上重新加入印表機</p>
<p>結果上、左、右邊界好像比較正常了<br>
可是印出來的時候似乎內容會變得更靠邊，變得比設定的邊界小<br>
然後下邊界好像還是有點大<br>
而且更嚴重的是有時候最後一行會整個錯位，然後一頁內容被印表機印到兩頁<br>
整個還是不能用的狀態</p>
<h2 id="透過-samba-分享印表機成功但需要額外處理">透過 Samba 分享印表機（成功但需要額外處理）</h2>
<p>後來發現說還可以有另一種方式分享印表機<br>
就是不在伺服器端安裝驅動程式，直接以 raw 的方式透過 Samba 分享印表機<br>
讓客戶端自己透過驅動程式直接跟印表機溝通</p>
<h3 id="設定-samba-印表機分享">設定 Samba 印表機分享</h3>
<p>可以參考上面提過的 ArchWiki 教學的 2.3 章節，或是 <a href="https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Print_Server#Enabling_the_Print_Server_Support_in_Samba">Samba 官方 wiki 中分享印表機的教學</a><br>
設定好後，從其它 Windows 客戶端打開檔案總管輸入 <code>\\&lt;HOSTNAME&gt;</code> 就可以看到這台印表機了<br>
這種方法要客戶端自備驅動程式（沒有在 Sambda 伺服器上附上驅動程式的話）</p>
<h3 id="成功列印-1">成功列印</h3>
<p>這種方法就完全是透過 Epson 官方的驅動程式直接跟印表機溝通<br>
所有功能都是正常的，邊界問題也沒了<br>
除了&hellip;</p>
<h3 id="延遲問題">延遲問題</h3>
<p>透過這種方式加入印表機<br>
每次對印表機進行操作（例如列印、打開「印表機內容」或「列印喜好設定」視窗）都會有一個 30 秒左右的延遲<br>
雖然不影響列印，但是每次操作都要等一段時間還是很怪</p>
<h4 id="觀察">觀察</h4>
<p>去 Raspberry Pi 上打開 CUPS 和 Samba 的 debug log<br>
看起來在客戶端進行操作的時候，同樣的 request 都會重覆發幾次，中間隔個幾秒<br>
不過看起來沒有什麼錯誤訊息</p>
<p>再用 Wireshark 監控網路封包<br>
發現客戶端在進行操作的時候，都會對伺服器的 3289 port 發送幾次 UDP 封包<br>
不過伺服器沒有聽這個 port 當然沒有回應<br>
模式大概是</p>
<ol>
<li>客戶端發送 UDP 封包到伺服器的 3289 port</li>
<li>伺服器立刻以 ICMP port unreachable 回應</li>
<li>客戶端等 3 秒左右後再發送下一個 UDP 封包</li>
<li>重複這個過程 8 次</li>
</ol>
<p>這樣算一算差不多就是將近 30 秒的延遲</p>
<h4 id="釐清">釐清</h4>
<p>查了一下 UDP 3289 port 會發現 <a href="https://download4.epson.biz/sec_pubs/l6260_series/useg/tc/GUID-5F7CDE39-97A0-4BC3-A096-A9F11CC2E7C0.htm">Epson 官方許多機型的文件</a>都會提到<br>
是 Epson 用來透過 ENPC 協定「從 EpsonNet Config、印表機驅動程式及掃描器驅動程式等應用程式中發現印表機」<br>
不過網路上都找不到 ENPC 協定的相關資訊或實作<br>
有看到一些討論（例如 <a href="https://github.com/mike42/escpos-php/issues/923">escpos-php</a> 和 <a href="https://stackoverflow.com/questions/62870327/where-to-find-the-documentation-of-enpc-udp-port-3289-printer-discovery">Stack Overflow</a>），但是大家也都沒有詳細資訊</p>
<h4 id="解決">解決</h4>
<p>反正也不知道 ENPC 協定的 request 下來要回覆什麼<br>
我乾脆就用 Python 寫個簡單的 UDP server<br>
讓它聽 3289 port，然後都回一個空的訊息回去</p>
<p>🎉然後延遲就降到剩 5 秒左右了🎉<br>
基本上就是省下了那段不斷重試 UDP 封包的時間<br>
剩下的應該就是 Samba 或 CUPS 本身的延遲了</p>
<p>到這裡印表機的使用上就算是沒有什麼問題了</p>
<h2 id="結語">結語</h2>
<p>當初想說印表機用得好好的，不想換新的<br>
沒想到花了好幾天的時間在自己搞印表機伺服器上<br>
幸好最後還是解決了</p>
<p>主要困難點大概是以下幾點：</p>
<ol>
<li>Epson 官方沒有提供 ARM64 架構的 Linux 驅動程式</li>
<li>CUPS 相關的開放原始碼社群也沒有提供 Epson L360 的驅動程式，不確定會不會是這台印表機沒有在國外發售？</li>
<li>Epson 驅動程式本身用到的 ENPC 協定沒有相關資訊</li>
</ol>
<p>以後要買印表機的話<br>
應該要考慮直接買有無線網路分享功能的印表機&hellip;<br>
近幾年的印表機應該對 IPP Everywhere 的支援比較好，也就比較沒有驅動程式的問題了</p>]]></content:encoded></item><item><title>Golang 新手的抱怨</title><link>https://blog.lcy.one/2024/04/16/golang-newbie-complaints.html</link><pubDate>Tue, 16 Apr 2024 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2024/04/16/golang-newbie-complaints.html</guid><description>&lt;p&gt;睽違了兩年多的部落格更新&lt;br&gt;
是要來抱怨這幾個月學 + 用 Golang 的使用體驗&lt;/p&gt;</description><content:encoded><![CDATA[<p>睽違了兩年多的部落格更新<br>
是要來抱怨這幾個月學 + 用 Golang 的使用體驗</p>
<h2 id="個人使用程式語言的經驗">個人使用程式語言的經驗</h2>
<p>我個人算上學生時代除了作業以外，開始會自己課餘寫程式開始<br>
大概有八年的程式開發經驗</p>
<p>其中最熟 Python，不管業餘還是工作上都有用到，寫了六年多<br>
不過沒有碰過 ML、AI、資料分析之類的<br>
主要是在寫後端服務和一些有大有小的工具程式</p>
<p>Java 是在工作上寫過，接觸約兩年<br>
JavaScript 工作上和業餘斷斷續續寫過<br>
工作上也有多少碰到 C、C++、Groovy、Lua 之類的，大概就到略熟悉的程度<br>
還有碰過像是架這個網站用的 Ruby，之前寫過的 PHP，不過都只有入門等級而已</p>
<h2 id="開始寫-golang">開始寫 Golang</h2>
<p>最近在公司裡被轉去一個新領域，主要也是開發後端服務<br>
大部分的團隊都是用 Golang 開發，多數專案也是 Golang 寫的<br>
雖然真的硬要用 Python 開發可能也可以<br>
不過一方面懶得去爭論，另一方面想說學一下這個也算熱門的語言也不錯</p>
<h2 id="寫這篇文章的原因">寫這篇文章的原因</h2>
<p>邊學邊寫 Golang 大概三個月了<br>
目前都覺得越學越覺得不太喜歡這語言，覺得不吐不快</p>
<p>以下列出一些我覺得的優缺點，主要還是跟我最熟悉的 Python 比較</p>
<h2 id="覺得-golang-的優點">覺得 Golang 的優點</h2>
<p>先提一些優點</p>
<ul>
<li>
<p>效能<br>
雖然可能略輸 C/C++<br>
不過在大部分的情況下肯定比 Python 和 JavaScript 快</p>
</li>
<li>
<p>單一二進制檔案<br>
不用像 Python 和 JavaScript 之類的語言，部署的時候要想辦法準備環境<br>
Golang 是編譯成二進制檔案，直接執行就好</p>
</li>
<li>
<p><code>go fmt</code><br>
官方直接有格式化工具，不用像其它大部分的語言要另外裝第三方工具<br>
開發者沒有藉口不跑格式化</p>
</li>
</ul>
<h2 id="覺得-golang-的缺點">覺得 Golang 的缺點</h2>
<p>接下來就是各種抱怨了</p>
<h3 id="缺乏文件">缺乏文件</h3>
<p>不確定具體原因，但我覺得各種 Golang 套件的文件都不是很完整<br>
常常都要進去看原始碼才知道怎麼用</p>
<h4 id="例子gin">例子：Gin</h4>
<p>像是 Golang 前幾大的 web 框架－ <a href="https://gin-gonic.com/docs/">Gin 的文件</a><br>
根本沒有多少教學或說明，只有一些帶有一兩句說明的範例<br>
API reference 很多也都只有簡短說明，有時候都看不出具體的用法<br>
看起來完全不像是一個有 75k+ stars 的專案<br>
這個也有人開 <a href="https://github.com/gin-gonic/gin/issues/3152">issue</a> 在抱怨</p>
<h4 id="例子gomock">例子：gomock</h4>
<p><a href="https://github.com/golang/mock">gomock</a> 是用來產生 mock 物件的工具<br>
Google 後來不維護了，Uber <a href="https://github.com/uber-go/mock">接去維護</a><br>
同樣也是只有基礎的教學<br>
像是比較進階的 <code>matcher</code> 用法要自己點進去看原始碼參考</p>
<h4 id="對比-python-套件的文件">對比 Python 套件的文件</h4>
<p>以熱門的 web 框架來說<br>
不論是 <a href="https://flask.palletsprojects.com">Flask</a>、<a href="https://docs.djangoproject.com">Django</a>，還是 <a href="https://fastapi.tiangolo.com/">FastAPI</a> 的文件都遠遠比 Golang 的 Gin 完整<br>
不用一直去翻原始碼，看看文件就知道怎麼用</p>
<h3 id="錯誤處理">錯誤處理</h3>
<p>Golang 沒有 try-catch<br>
通常都是讓函式多回傳一個 <code>error</code> 物件<br>
再從呼叫方 <code>if err != nil</code> 來判斷是否有錯誤發生</p>
<p>我個人是覺得這種作法寫起來沒有 try-catch 直覺<br>
而且相較於 Golang 連要分辨錯誤的類型都有點麻煩<br>
Python 那樣可以做 <a href="https://docs.python.org/3/tutorial/errors.html#exception-chaining">exception chaining</a>、<a href="https://docs.python.org/3/tutorial/errors.html#raising-and-handling-multiple-unrelated-exceptions">exception grouping</a><br>
還可以根據 exception 的 parent class 來捕捉不同類型的錯誤<br>
整個體驗差滿多的</p>
<h3 id="套件管理">套件管理</h3>
<p>Golang 在 1.11 之後加入 module 的概念<br>
套件管理用起來就會比較像 Python 的 Pipenv 或是 JavaScript 的 npm<br>
把套件的版本號寫在 <code>go.mod</code> 裡面<br>
工具自動產生套件的 hash 值和版本號到 <code>go.sum</code></p>
<p>不過相較於 <a href="https://pipenv.pypa.io/en/stable/pipfile.html#package-category-groups">Pipenv</a> 和 <a href="https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file">npm</a> 有 dev dependencies 的概念<br>
Golang 這邊沒有將 dependencies 分類<br>
雖然 Golang 不像 Python 和 JavaScript 需要在執行環境安裝套件<br>
但是仍然可能會有一些「tool dependencies」是只用在開發或 CI/CD 的時候</p>
<p><a href="https://go.dev/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module">官方的解法</a>是把這些套件寫進 <code>tools.go</code><br>
這樣 build 的時候就不會把這些套件包進去<br>
&hellip;這什麼繞路的解法，加一個 tool dependency 還要記得改兩個地方</p>
<h3 id="缺少一些語言特性">缺少一些語言特性</h3>
<p>這個有可能只是因為我還不習慣寫 Golang<br>
Golang 作為一個相對新的熱門程式語言<br>
（2009年發行，Python 3.0 2008年發行，其它熱門語言就更舊了）<br>
很多寫起來還是很有「老」程式語言的感覺</p>
<p>直接到官方的 GitHub issues 頁面<a href="https://github.com/golang/go/issues?q=is%3Aissue&#43;is%3Aopen&#43;sort%3Areactions-%2B1-desc">以按讚排序</a><br>
以現在的時間點（2024 年 04 月 16 日）來看就有幾個我遇過的障礙</p>
<ul>
<li>
<p>第二名：<a href="https://github.com/golang/go/issues/19814">proposal: spec: add typed enum support</a><br>
沒有 enum 可以用，只能用 <code>const</code> 來模擬</p>
<p>只寫 Golang 就算了，開發後端服務免不了要跟前端或其它服務溝通<br>
不論是 HTTP API 常用的 OpenAPI<br>
或是 gRPC API 常用的 Protocol Buffers 都有 enum 這個類別<br>
在 Golang 要跟這些資料格式轉換的時候就會有點麻煩</p>
</li>
<li>
<p>第五名：<a href="https://github.com/golang/go/issues/45624">proposal: expression to create pointer to simple types</a><br>
沒有辦法用簡單的語法直接建立一個指向新變數的指標</p>
<p>會常撞到這個問題的其中一個情境跟 Golang 的一個語言特性有關<br>
就是 struct 建立起來沒有賦值的話就會是「<a href="https://golang.org/ref/spec#The_zero_value">zero value</a>」<br>
int 會是 0、string 會是空字串、bool 會是 false，而不會是 nil 之類的<br>
也就是說沒有辦法分辨真的是 0/空字串/false 還是沒有賦值<br>
常用解法是把這些欄位的類別改成指標，然後判斷是否是 nil 來分辨是否有賦值</p>
<p>不過要塞欄位時就麻煩了<br>
就算只是要塞一個固定的值，還是要先建立一個變數，才能再把變數的指標塞進去</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-golang" data-lang="golang"><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyStruct</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fieldA</span><span class="w"> </span><span class="o">*</span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fieldB</span><span class="w"> </span><span class="o">*</span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">foo</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">20</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">bar</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">myStruct</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">MyStruct</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fieldA</span><span class="p">:</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">foo</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fieldB</span><span class="p">:</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">bar</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>不然就是要另寫一個函式來取出指標</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-golang" data-lang="golang"><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyStruct</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fieldA</span><span class="w"> </span><span class="o">*</span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fieldB</span><span class="w"> </span><span class="o">*</span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">IntPointer</span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="kt">int</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">i</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">myStruct</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">MyStruct</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fieldA</span><span class="p">:</span><span class="w"> </span><span class="nf">IntPointer</span><span class="p">(</span><span class="mi">20</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fieldB</span><span class="p">:</span><span class="w"> </span><span class="nf">IntPointer</span><span class="p">(</span><span class="mi">30</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>像 AWS 的 Golang SDK 就寫了<a href="https://github.com/aws/aws-sdk-go/blob/49079a/aws/convert_types.go#L5">好幾個函式</a>在做這件事</p>
</li>
</ul>
<h2 id="結語">結語</h2>
<p>其實還有不少小問題<br>
不過就先列這些比較大的障礙<br>
不知道再多接觸一段時間會是開始接受<br>
還是會有更多抱怨可以寫&hellip;</p>]]></content:encoded></item><item><title>本部落格轉移至 GitHub Pages</title><link>https://blog.lcy.one/2022/04/09/blog-migration-to-github-pages.html</link><pubDate>Sat, 09 Apr 2022 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2022/04/09/blog-migration-to-github-pages.html</guid><description>&lt;p&gt;就某方面滿搞笑的&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.lcy.one/2019/08/29/blog-migration-to-self-hosted-wordpress.html"&gt;上一篇兩年多年的文章&lt;/a&gt;在講怎麼搬到自架的主機上&lt;br&gt;
過一年多就又搬到 GitHub Pages&lt;br&gt;
而且又過了快一年才發這篇文 Orz&lt;/p&gt;</description><content:encoded><![CDATA[<p>就某方面滿搞笑的</p>
<p><a href="/2019/08/29/blog-migration-to-self-hosted-wordpress.html">上一篇兩年多年的文章</a>在講怎麼搬到自架的主機上<br>
過一年多就又搬到 GitHub Pages<br>
而且又過了快一年才發這篇文 Orz</p>
<h2 id="github-pages">GitHub Pages</h2>
<p><a href="https://pages.github.com/">GitHub Pages</a> 讓人可以把靜態網頁放在 GitHub 上<br>
由 GitHub 提供網域、空間和 TLS 憑證等服務</p>
<p>從自架 Wordpress 轉過來的好處就是省下了維護的成本<br>
畢竟現在網路世界很可怕，自架伺服器都要定期上去更新一些外掛和伺服器系統本身的一些套件<br>
TLS 憑證什麼的也要定期更新（雖然弄個 cron job 去自動更新也行）<br>
轉到 Pages 上就什麼都不用管了</p>
<p>而且靜態網頁的效能肯定比動態網頁快不少<br>
反正我本來就不需要像是留言板之類的功能</p>
<p>簡單來說就是更懶、更快、更安全</p>
<h2 id="jekyll">Jekyll</h2>
<p>雖然說是靜態網頁<br>
可是也沒有硬到真的整份 HTML 都自己手寫<br>
有很多種靜態網頁生成框架可以用，比較有名的像是 <a href="https://jekyllrb.com/">Jekyll</a>、<a href="https://gohugo.io/">Hugo</a>、<a href="https://hexo.io/">Hexo</a> 等<br>
用這些框架把網頁生出來再丟到 GitHub 上就可以了</p>
<p>而我這邊是使用 Jekyll<br>
主要原因只是因為 GitHub Pages 有內建支援 Jekyll<br>
只要把原始碼丟上去，GitHub 就可以直接產生出網頁了<br>
可以再省下自己生完再部署上去的動作<br>
<del>更懶</del></p>
<h2 id="從自架-wordpress-轉移">從自架 Wordpress 轉移</h2>
<p>雖然我 Wordpress 的文章也沒幾篇<br>
不過要一篇一篇轉，對我這種懶人來說還是會嫌麻煩<br>
所以我是用 Wordpress 上的 <a href="https://wordpress.org/plugins/jekyll-exporter/">Jekyll Exporter</a> 外掛<br>
幫我大致轉成 Jekyll 吃的格式之後，我再自己微調</p>
<p>具體 Jekyll 的設定什麼的，這裡就不寫了<br>
基本上就是照著<a href="https://jekyllrb.com/docs/">官方教學</a>跑就好了</p>
<p>比較特別的是因為新的 URL 格式不太一樣<br>
有另外透過 <a href="https://github.com/jekyll/jekyll-redirect-from">jekyll-redirect-from</a> 這個外掛把原本文章的 URL 轉到新的 URL</p>
<h2 id="自定義域名">自定義域名</h2>
<p>另外就是要把原本的域名拿來給 GitHub Pages 用<br>
把本來指到我自架機器 IP 的 DNS A 紀錄，改成用 CNAME 指到 GitHub 這邊提供的域名（XXXX.github.io）<br>
再去 Pages 的頁面設定一下就差不多了</p>
<p>我是還有再額外設定一下<br>
讓網路流量跟之前一樣透過 CloudFlare 來反向代理<br>
所以 TLS 憑證會看到是 CloudFlare 那邊來的</p>
<h2 id="結語">結語</h2>
<p>其實就像前一篇結語寫的<br>
這個部落格主要還是架好玩的<br>
反正之前自架 WordPress 的時候就有玩到一些自架的東西了<br>
現在改到 GitHub Pages 上之後就可以不用再額外花時間管了</p>]]></content:encoded></item><item><title>本部落格遷移歷程</title><link>https://blog.lcy.one/2019/08/29/blog-migration-to-self-hosted-wordpress.html</link><pubDate>Thu, 29 Aug 2019 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2019/08/29/blog-migration-to-self-hosted-wordpress.html</guid><description>&lt;p&gt;原本這個部落格是放在 &lt;a href="https://wordpress.com/"&gt;WordPress.com&lt;/a&gt; 上&lt;br&gt;
不過後來&lt;del&gt;閒閒沒事&lt;/del&gt;想說還是學著架 WordPress 在自己租的主機上看看&lt;br&gt;
於是就買個域名 然後試著遷過來了&lt;/p&gt;
&lt;p&gt;這篇不是教學&lt;br&gt;
細節不會多提 主要是分享架站的心路歷程&lt;/p&gt;</description><content:encoded><![CDATA[<p>原本這個部落格是放在 <a href="https://wordpress.com/">WordPress.com</a> 上<br>
不過後來<del>閒閒沒事</del>想說還是學著架 WordPress 在自己租的主機上看看<br>
於是就買個域名 然後試著遷過來了</p>
<p>這篇不是教學<br>
細節不會多提 主要是分享架站的心路歷程</p>
<h2 id="vps">VPS</h2>
<p>我原本就有在租 Vultr 的 VPS<br>
平常拿來放一些 Discord 的 Bot<br>
偶爾還可以拿來當日本的跳板<br>
其實會想搬過來也是覺得租了一台 VPS 好像都沒幹嘛也是有點浪費</p>
<h2 id="網域名稱">網域名稱</h2>
<p>再來就是需要一個域名<br>
原本我有時是直接使用免費的 <a href="https://nctu.me">NCTU Domain</a><br>
不過後來覺得自己買域名比較<del>好玩</del>穩定</p>
<p>考慮了網路上看到的評價以及自身的喜好之後<br>
再加上最現實的＄＄＄考量<br>
決定在 <a href="https://porkbun.com/">Porkbun</a> 買了這個 .one 的域名<br>
第一年 7.5 鎂，算是可以接受</p>
<h2 id="wordpress">WordPress</h2>
<p>這部分其實比我想像中的還要簡單方便<br>
基本上就是把 WordPress 載下來、依賴套件裝一裝、Nginx 設定一下<br>
然後從 WordPress.com 匯出，再匯進自架 WordPress<br>
基本上就遷完了</p>
<h2 id="tls">TLS</h2>
<p>都 2019 年了<br>
學架個網站卻沒弄 TLS 完全說不過去<br>
現在也有 <a href="https://letsencrypt.org">Let&rsquo;s Encrypt</a> 和 <a href="https://certbot.eff.org">Certbot</a> 這些超級方便懶人的東西<br>
再網路上找個教學 把 Nginx 跟著設定一下就完成了</p>
<h2 id="cloudflare">CloudFlare</h2>
<p>聞名 <a href="https://www.cloudflare.com">CloudFlare</a> 已久<br>
一直很想玩玩看這東西 現在終於真的要來碰這個<br>
結果其實也沒什麼特別的 就一步一步照著做就結束了XDD<br>
看到 CloudFlare 免費版提供這麼多功能<br>
真的是佛心來的</p>
<h2 id="後續調整">後續調整</h2>
<p>以上偏後台的東西都弄好後<br>
就又回來調整 WordPress 了</p>
<p>首先目標是要盡量解決掉 Google 的 <a href="https://developers.google.com/speed/pagespeed/insights/">PageSpeed Insight</a> 以及 SSL Labs 的 <a href="https://www.ssllabs.com/ssltest/index.html">SSL Server Test</a>  上偵測出的問題</p>
<p>於是先開始研究一些比較常見的 Plug-In<br>
視需求安裝、調整~~、踩雷~~<br>
同時再根據有偵測出的問題<br>
邊 Google 邊調整伺服器上的設定</p>
<p>之後才發現那些都簡單<br>
最複雜的問題是部落格主題XDD<br>
個人的設計感對不上自己的審美觀<br>
怎麼調都覺得不好看</p>
<p>最後直接採用了 WordPress 內建的 <a href="https://wordpress.org/themes/twentyseventeen/">Twenty Seventeen</a><br>
再根據自己的喜好做一些微調（除了模板提供可修改的部分，再微調一些 CSS）<br>
畢竟自架的好處就是可以視自己需求客製化</p>
<h2 id="結語">結語</h2>
<p>其實架這個部落格的初始目的也不是真的要經營<br>
<del>畢竟也沒人在看</del><br>
主要是想自學一些相關的技能知識<br>
在這前提下<br>
自架 WordPress 當然比使用 WordPress.com 更適合<br>
架起來的整體難度也比想像中簡單許多</p>
<p>至於架完之後的發文頻率&hellip;<br>
就再看看囉XD</p>]]></content:encoded></item><item><title>MLTD（ミリシタ）Android 免引繼複製帳號資料</title><link>https://blog.lcy.one/2019/01/15/mltd-share-across-android-devices-without-transfering.html</link><pubDate>Tue, 15 Jan 2019 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2019/01/15/mltd-share-across-android-devices-without-transfering.html</guid><description>&lt;p&gt;這篇是要介紹如何在不用登入萬代帳號進行引繼的狀況下&lt;br&gt;
將 MLTD（ミリシタ，アイドルマスター ミリオンライブ！ シアターデイズ）的帳號資料從原本的 Android 裝置複製到另一個 Android 裝置&lt;/p&gt;
&lt;p&gt;注意：本篇需要對操作 Android 有一定的熟悉度&lt;/p&gt;</description><content:encoded><![CDATA[<p>這篇是要介紹如何在不用登入萬代帳號進行引繼的狀況下<br>
將 MLTD（ミリシタ，アイドルマスター ミリオンライブ！ シアターデイズ）的帳號資料從原本的 Android 裝置複製到另一個 Android 裝置</p>
<p>注意：本篇需要對操作 Android 有一定的熟悉度</p>
<p>這種方法相對於一般直接引繼有以下優點：</p>
<ul>
<li><del>可以在多個裝置共存帳號</del>
<ul>
<li><del>因為是共用裝置 ID，所以不會讓舊的失效。</del></li>
<li>現在這個已經沒有必要了，現在直接引繼也可以共存的樣子。</li>
</ul>
</li>
<li>免登入萬代帳號
<ul>
<li>像是有些人如我，不是很喜歡在模擬器登入一些帳號。</li>
</ul>
</li>
<li>不用怕引繼轉移機種會把石頭清空
<ul>
<li>因為沒有引繼這個動作，照理來說應該不可能清石頭。</li>
<li>主要是擔心有些模擬器內建的瀏覽器會亂給 UserAgent，導致誤認成 iOS 會清石頭。</li>
</ul>
</li>
</ul>
<p>而缺點當然就是比較麻煩</p>
<hr>
<p>基本上整個流程的目標就是要把舊裝置中的</p>
<pre tabindex="0"><code>com.bandainamcoent.imas_millionlive_theaterdays.v2.playerprefs.xml
</code></pre><p>這個檔案複製到新的裝置上</p>
<hr>
<h2 id="新舊裝置都能拿到-root-權限">新舊裝置都能拿到 root 權限</h2>
<p>如果新舊裝置都能拿到 root 權限<br>
那就很簡單了</p>
<p>在新裝置裝好 MLTD 打開遊戲至少一次後<br>
直接把舊裝置的</p>
<pre tabindex="0"><code>/data/data/com.bandainamcoent.imas_millionlive_theaterdays/shared_prefs/com.bandainamcoent.imas_millionlive_theaterdays.v2.playerprefs.xml
</code></pre><p>直接複製到新裝置的同一個位置<br>
完成</p>
<hr>
<h2 id="新裝置拿不到-root-權限">新裝置拿不到 root 權限</h2>
<p>如果新裝置拿不到 root 權限<br>
那就用 adb backup + adb restore 解決</p>
<p>不過由於 MLTD 遊戲的檔案數量龐大<br>
非常花時間 而且很容易失敗<br>
可以考慮在舊裝置本身清完資料直接重新引繼<br>
在最乾淨的狀態下 adb backup + adb restore</p>
<p>或是用 android-backup-extractor 把備份檔拆開<br>
僅留下 <code>sp</code> 資料夾裡的 <code>com.bandainamcoent.imas_millionlive_theaterdays.v2.playerprefs.xml</code><br>
後再封回去<br>
不過這種方法我沒試過<br>
不確定可行性</p>
<hr>
<h2 id="只有新裝置都能拿到-root-權限">只有新裝置都能拿到 root 權限</h2>
<p>如果新裝置能拿到 root 權限<br>
但是舊裝置拿不到</p>
<p>那就先用 adb backup 把 <code>com.bandainamcoent.imas_millionlive_theaterdays</code> 這個 app 備份起來</p>
<p>再用 android-backup-extractor 把備份檔拆開<br>
可以在 <code>sp</code> 資料夾裡找到 <code>com.bandainamcoent.imas_millionlive_theaterdays.v2.playerprefs.xml</code></p>
<p>再來就可以直接把這檔案丟進新裝置的<br>
<code>/data/data/com.bandainamcoent.imas_millionlive_theaterdays/shared_prefs</code> 資料夾裡了（新裝置要開過遊戲至少一次）</p>
<hr>
<h2 id="參考資料">參考資料</h2>
<ul>
<li><a href="https://sourceforge.net/projects/adbextractor/">android-backup-extractor</a></li>
<li><a href="https://android.googlesource.com/platform/frameworks/base/&#43;/4a627c71ff53a4fca1f961f4b1dcc0461df18a06">Full local backup infrastructure – Git repositories on android</a></li>
</ul>]]></content:encoded></item><item><title>Android 8.0 Oreo - 停用彈出通知視窗</title><link>https://blog.lcy.one/2018/04/13/android-8-0-oreo-disable-popup-notofication.html</link><pubDate>Fri, 13 Apr 2018 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2018/04/13/android-8-0-oreo-disable-popup-notofication.html</guid><description>&lt;p&gt;承&lt;a href="https://blog.lcy.one/2018/04/13/android-no-preferred-sim-selected-for-sending-sms-messages.html"&gt;上一篇&lt;/a&gt;&lt;br&gt;
一買來 HTC U11 之後，立刻就把它升上了 Android 8.0 Oreo&lt;br&gt;
結果遇到一個困擾的問題－有些 App 不給關會擋住一部分畫面的彈出通知&lt;/p&gt;</description><content:encoded><![CDATA[<p>承<a href="/2018/04/13/android-no-preferred-sim-selected-for-sending-sms-messages.html">上一篇</a><br>
一買來 HTC U11 之後，立刻就把它升上了 Android 8.0 Oreo<br>
結果遇到一個困擾的問題－有些 App 不給關會擋住一部分畫面的彈出通知</p>
<p>上一台用的是 Android 6.0 Marshmallow<br>
那時的「彈出通知視窗」的英文是叫做「Peek Notifications」<br>
HTC Desire Eye 設定頁面有一個地方可以把這功能停用</p>
<p>Oreo 的「彈出通知視窗」的英文則是叫做「Heads-up Notifications」<br>
設定頁面好像沒有地方可以整體停用這個功能<br>
除非 App 本身有支援 Oreo 通知的 API<br>
才能調成能正常接收通知，卻不會彈出會擋住畫面的通知視窗<br>
而 Facebook 的 Messenger 不支援 &hellip;<br>
除了直接把 App 的通知停用之外<br>
系統內似乎沒有別的辦法可以阻止它跳出通知視窗</p>
<p>幸好在 Reddit 有查到利用 adb 的解法</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb shell settings put global heads_up_notifications_enabled <span class="m">0</span>
</span></span></code></pre></div><p>就能將整體的彈出視窗功能停用</p>
<hr>
<h2 id="參考資料">參考資料</h2>
<ul>
<li><a href="https://redd.it/74tdsn">Disable whatsapp peek notifications - oreo : GooglePixel</a></li>
</ul>]]></content:encoded></item><item><title>Android 訊息（簡訊 App）- 尚未選取傳送簡訊時慣用的SIM卡</title><link>https://blog.lcy.one/2018/04/13/android-no-preferred-sim-selected-for-sending-sms-messages.html</link><pubDate>Fri, 13 Apr 2018 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2018/04/13/android-no-preferred-sim-selected-for-sending-sms-messages.html</guid><description>&lt;p&gt;最近入手了 HTC U11&lt;br&gt;
因為個人比較習慣 Google 官方的簡訊 App （&lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.messaging"&gt;Android 訊息&lt;/a&gt;）&lt;br&gt;
就載了下來準備替換掉 HTC 內建的簡訊 App&lt;br&gt;
但是要將其設成預設簡訊程式時&lt;br&gt;
卻跳出「尚未選取傳送簡訊時慣用的SIM卡」的錯誤訊息&lt;/p&gt;</description><content:encoded><![CDATA[<p>最近入手了 HTC U11<br>
因為個人比較習慣 Google 官方的簡訊 App （<a href="https://play.google.com/store/apps/details?id=com.google.android.apps.messaging">Android 訊息</a>）<br>
就載了下來準備替換掉 HTC 內建的簡訊 App<br>
但是要將其設成預設簡訊程式時<br>
卻跳出「尚未選取傳送簡訊時慣用的SIM卡」的錯誤訊息</p>
<p>不知道別的品牌的 Android 手機是不是如此<br>
HTC U11 這一台並沒有能設定簡訊慣用 SIM 卡的位置<br>
以中文錯誤訊息當關鍵字下去搜尋查不到解法<br>
後來找到拿英文版的錯誤訊息當關鍵字找（<code>No preferred SIM selected for sending SMS messages</code>）<br>
總算在 xda 找到透過 adb 的解法</p>
<p>adb 的使用方法就不詳述了，網路上隨便找都有<br>
然後下</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb shell settings put global multi_sim_sms <span class="m">1</span>
</span></span></code></pre></div><p>指令中的「1」視手機雙 SIM 卡的情況修改<br>
就能將該 SIM 卡設定成簡訊慣用 SIM 卡<br>
也能成功將 Android 訊息設定成預設簡訊 App 了</p>
<hr>
<h2 id="參考資料">參考資料：</h2>
<ul>
<li><a href="https://twitter.com/swashta/status/953226414676901889">Boban Stojanović (@swashta) | Twitter</a></li>
<li><a href="https://forum.xda-developers.com/showpost.php?p=75218519&amp;postcount=18">Android Messages - No preferred SIM selected for sending SMS messages | XDA Developers Forums</a></li>
</ul>]]></content:encoded></item><item><title>Vim 對於 .conf 檔案的 syntax highlighting</title><link>https://blog.lcy.one/2018/04/13/vim-syntax-highlighting-for-conf.html</link><pubDate>Fri, 13 Apr 2018 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2018/04/13/vim-syntax-highlighting-for-conf.html</guid><description>&lt;p&gt;前一陣子在使用 FreeBSD 時&lt;br&gt;
發現開啟 rc.conf 時，vim 沒有將該檔案作為 conf 檔做 syntax highlighting&lt;br&gt;
但是開啟其他 .conf 檔案時就有&lt;/p&gt;</description><content:encoded><![CDATA[<p>前一陣子在使用 FreeBSD 時<br>
發現開啟 rc.conf 時，vim 沒有將該檔案作為 conf 檔做 syntax highlighting<br>
但是開啟其他 .conf 檔案時就有</p>
<p>好奇問了一下萬能的 Google 大神<br>
才知道 vim 對於 conf 檔的認定<br>
除了附檔名要是 .conf 之外<br>
還有<strong>檔案第一行必須要是 <code>#</code> 開頭的註解</strong></p>
<p>於是我就在 rc.conf 最前面多加了</p>
<pre tabindex="0"><code class="language-conf" data-lang="conf"># rc.conf
</code></pre><p>重開 vim 之後就有正常的 syntax highlighting 了</p>
<hr>
<h2 id="參考資料">參考資料</h2>
<ul>
<li><a href="http://freebsd.1045724.x6.nabble.com/syntax-highlighting-of-rc-conf-with-vim-tp3952377.html">freebsd-stable - syntax highlighting of rc.conf with vim</a></li>
</ul>]]></content:encoded></item><item><title>Git for Windows 與 MacType 神奇的衝突</title><link>https://blog.lcy.one/2017/07/13/git-for-windows-incompatible-with-mactype.html</link><pubDate>Thu, 13 Jul 2017 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2017/07/13/git-for-windows-incompatible-with-mactype.html</guid><description>&lt;p&gt;今天在 Windows 7 上用 Git Bash 的時候&lt;br&gt;
遇到了一些奇怪的問題&lt;br&gt;
主要是下 git rebase -i &amp;hellip; 的時候&lt;br&gt;
一直跳出&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is no tracking information for the current branch.&lt;br&gt;
Please specify which branch you want to rebase against.&lt;/p&gt;
&lt;/blockquote&gt;</description><content:encoded><![CDATA[<p>今天在 Windows 7 上用 Git Bash 的時候<br>
遇到了一些奇怪的問題<br>
主要是下 git rebase -i &hellip; 的時候<br>
一直跳出</p>
<blockquote>
<p>There is no tracking information for the current branch.<br>
Please specify which branch you want to rebase against.</p>
</blockquote>
<p>可是之前在 Windows 10 上用 Bash on Windows 下這指令的時候都沒問題<br>
Google 了一下才發現有人發過這個 issue<br>
解法竟然是&hellip;&hellip; 關掉 MacType<br>
<a href="https://github.com/git-for-windows/git/issues/710">when i git rebase -i error · Issue #710 · git-for-windows/git</a></p>
<blockquote>
<p>&hellip; I added <code>bash.exe</code> to MacType utility exclusion list, now all is good.</p>
</blockquote>
<p>相關討論和 issue 可以點進去看<br>
剛看到這解法還以為他來亂的<br>
結果我把 MacType 暫時停用後<br>
什麼問題都解決了&hellip;</p>]]></content:encoded></item><item><title>在 Firefox Developer Edition 使用原本的設定檔（profile）</title><link>https://blog.lcy.one/2017/07/06/use-original-profile-for-firefox-developer-edition.html</link><pubDate>Thu, 06 Jul 2017 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2017/07/06/use-original-profile-for-firefox-developer-edition.html</guid><description>&lt;p&gt;用了幾年的第三方編譯版 Firefox 已經一個多月沒更新了&lt;br&gt;
在用這個版本之前 一直都是用官方的 Aurora Channel&lt;br&gt;
現在更名為 Developer Edition （開發者版本） 並加入了一些新功能&lt;/p&gt;
&lt;p&gt;想說換回來用用看&lt;br&gt;
卻發現 Developer Edition 會使用獨立的一個設定檔（profile）（以.dev-edition-default結尾）&lt;br&gt;
而且還不能改掉&lt;/p&gt;</description><content:encoded><![CDATA[<p>用了幾年的第三方編譯版 Firefox 已經一個多月沒更新了<br>
在用這個版本之前 一直都是用官方的 Aurora Channel<br>
現在更名為 Developer Edition （開發者版本） 並加入了一些新功能</p>
<p>想說換回來用用看<br>
卻發現 Developer Edition 會使用獨立的一個設定檔（profile）（以.dev-edition-default結尾）<br>
而且還不能改掉</p>
<p>本來還以為只能在捷徑那邊加上「-p」參數去強制指定設定檔<br>
還好 Google 了一下後 在 Reddit 有找到別的解法：<br>
只要在</p>
<pre tabindex="0"><code>%APPDATA%\Mozilla\Firefox\
</code></pre><p>目錄下新增一個名為「ignore-dev-edition-profile」的檔案<br>
Firefox Developer Edition 就會忽略獨立設定檔<br>
轉而使用原本 Firefox 使用的設定檔</p>
<hr>
<h2 id="參考資料">參考資料</h2>
<ul>
<li><a href="https://www.reddit.com/r/firefox/comments/4uhkwq">How do I get Dev Edition to use my profile by default? : firefox</a></li>
</ul>]]></content:encoded></item><item><title>調整 Kali Linux 的滑鼠滾輪滾動方向</title><link>https://blog.lcy.one/2017/03/11/modify-mouse-scroll-direction-in-kali-linux.html</link><pubDate>Sat, 11 Mar 2017 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2017/03/11/modify-mouse-scroll-direction-in-kali-linux.html</guid><description>&lt;p&gt;最近在 VirtualBox 上安裝了 Kali Linux&lt;br&gt;
遇到的第一件困擾的事情就是滑鼠滾輪滾動的方向跟常用的方向相反&lt;br&gt;
預設是往上滾滾輪，會向下捲動畫面&lt;br&gt;
不是很習慣&lt;/p&gt;</description><content:encoded><![CDATA[<p>最近在 VirtualBox 上安裝了 Kali Linux<br>
遇到的第一件困擾的事情就是滑鼠滾輪滾動的方向跟常用的方向相反<br>
預設是往上滾滾輪，會向下捲動畫面<br>
不是很習慣</p>
<p>Google 了一下有找到調整方法<br>
在 Terminal 中執行以下兩條指令即可：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gsettings <span class="nb">set</span> org.gnome.desktop.peripherals.mouse natural-scroll <span class="nb">false</span>
</span></span><span class="line"><span class="cl">gsettings <span class="nb">set</span> org.gnome.desktop.peripherals.touchpad natural-scroll <span class="nb">false</span>
</span></span></code></pre></div><hr>
<h2 id="參考資料">參考資料</h2>
<ul>
<li><a href="http://unix.stackexchange.com/questions/307928/how-to-disable-natural-scrolling">gnome3 - How to <em>disable</em> natural scrolling? - Unix &amp; Linux Stack Exchange</a></li>
</ul>]]></content:encoded></item><item><title>切割 Git Repo、並更改其部分內容</title><link>https://blog.lcy.one/2017/03/04/split-and-modify-git-repos.html</link><pubDate>Sat, 04 Mar 2017 00:00:00 +0800</pubDate><guid>https://blog.lcy.one/2017/03/04/split-and-modify-git-repos.html</guid><description>&lt;p&gt;因為一些原因&lt;br&gt;
想把某個 Git Repo 中的資料夾另外分出來&lt;br&gt;
分出來之後又發現其中當初不該丟上去的東西&lt;/p&gt;</description><content:encoded><![CDATA[<p>因為一些原因<br>
想把某個 Git Repo 中的資料夾另外分出來<br>
分出來之後又發現其中當初不該丟上去的東西</p>
<p>我又對 git 不熟Orz<br>
就邊 Google 邊想辦法弄出來<br>
在這做個紀錄</p>
<hr>
<ol>
<li>先 clone 下來。<br>
<code>git clone [Repo位址]</code></li>
<li>切換目錄。<br>
<code>cd [目錄名稱]</code></li>
<li>rebase -i 到欲更改 commit 的 parent commit。<br>
<code>git rebase -i [欲更改commit的sha]^1</code></li>
<li>想改的改一改，想刪的刪一刪。<br>
詳情參照參考資料中的教學。</li>
<li>更新檔案變動。<br>
<code>git add -A</code></li>
<li>修改 commit。<br>
<code>git commit --amend</code></li>
<li>rebase 回去。<br>
<code>git rebase --continue</code></li>
<li>把要留的資料夾切出來。<br>
<code>git filter-branch --prune-empty --subdirectory-filter [資料夾名稱]</code></li>
<li>更改遠端 Repo 的位址。<br>
<code>git remote set-url origin [Repo位址]</code></li>
<li>Push，完成。<br>
<code>git push -u origin [BRANCH名]</code></li>
</ol>
<hr>
<h2 id="參考資料">參考資料</h2>
<ul>
<li><a href="https://docs.github.com/en/github/getting-started-with-github/splitting-a-subfolder-out-into-a-new-repository">Splitting a subfolder out into a new repository - GitHub Docs</a></li>
<li><a href="https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History">Git - Rewriting History</a></li>
<li><a href="https://backlogtool.com/git-guide/tw/stepup/stepup7_6.html">6. 使用 rebase -i 修改提交【教學3 改寫提交】 | 連猴子都能懂的Git入門指南 | 貝格樂（Backlog）</a></li>
</ul>]]></content:encoded></item></channel></rss>