<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.8.5">Jekyll</generator><link href="https://yukaii.tw/feed.xml" rel="self" type="application/atom+xml" /><link href="https://yukaii.tw/" rel="alternate" type="text/html" /><updated>2020-03-12T13:28:58+00:00</updated><id>https://yukaii.tw/feed.xml</id><title type="html">Daily Oops!</title><subtitle>Yukai's blog. Web tech, apps, photos, and notes.
</subtitle><entry><title type="html">我的駕照心得</title><link href="https://yukaii.tw/blog/2020/03/12/getting-manual-transmission-drivers-license/" rel="alternate" type="text/html" title="我的駕照心得" /><published>2020-03-12T21:28:00+00:00</published><updated>2020-03-12T21:28:00+00:00</updated><id>https://yukaii.tw/blog/2020/03/12/getting-manual-transmission-drivers-license</id><content type="html" xml:base="https://yukaii.tw/blog/2020/03/12/getting-manual-transmission-drivers-license/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;

&lt;p&gt;TL;DR 我順利通過手排車駕照考試了！&lt;/p&gt;

&lt;p&gt;從成年開始常常就會想是不是該考個駕照了。第一次出國時，看著朋友駕駛在加州的公路，幾度疲累卻又無人換手，就很懊惱自己怎麽還不會開車。過了幾個忙碌的暑假，終於等到今年初比較清閒，剛好朋友準備出國也需要駕照，於是相揪一起報名駕訓班。&lt;/p&gt;

&lt;p&gt;汽車駕照考試分成筆試和路考。筆試 85 分及格，路考 70 分及格；而路考又分成場內（號誌、直線換檔、上坡起步、S 彎、倒車入庫、路邊停車等）和道駕。真正「開車」的部分只有道駕，場內的部分單靠口訣記憶方向盤迴轉角度和時機，就能順利通關，儘管你可能會開的走走停停，被扣些無傷大雅的小分數，但確實不需要任何上路經驗就能拿到駕照。這也造成一票人雖然拿到了駕照，但卻零上路經驗的結果。&lt;/p&gt;

&lt;p&gt;從 2017 開始駕照才開始加考道路駕駛，雖然難度提高，但這項政策也確實擋下許多三寶，我朋友就開玩笑的和我說：「我是考完駕照才開始學車的」，可見一斑啊，喂！（不過該位朋友確實不是三寶，特此聲明）&lt;/p&gt;

&lt;p&gt;以下就來分享我的學車經驗吧！&lt;/p&gt;

&lt;h2 id=&quot;心態&quot;&gt;心態&lt;/h2&gt;

&lt;p&gt;我自己學車是比較「感覺派」的。感覺派是相對「公式派」而言，我自己的定義來說就是：「方向盤的操控和速度都能依照感覺自由掌握」，而非運用記憶點和方向盤迴轉的角度來完成。&lt;/p&gt;

&lt;p&gt;但我想澄清一點，「感覺派」和「開車訣竅」或是「判定點」並沒有衝突。開車訣竅指的像是方向盤迴正時機或是煞車控制等，可能不影響實際的行車結果，彎還是轉的過去，車子還是停的下來，但有了這些訣竅卻會讓行車更加舒適。判定點指的是運用車子部件與視線的延伸延伸線，去得知車體與物體相對距離的技巧，在轉彎或停車抓距離時十分有幫助。&lt;/p&gt;

&lt;p&gt;「感覺派」像是千錘百鍊後的肌肉記憶，任何一個熟稔的駕駛人都會擁有的能力，只不過偏執的我硬要在短短幾周裡面掌握，為此還是挨了教練的不少念：「明明就有簡單的方法，為何你一定要自創呢？」。反正好玩嘛 😋&lt;/p&gt;

&lt;h2 id=&quot;學習歷程&quot;&gt;學習歷程&lt;/h2&gt;

&lt;p&gt;前前後後學車時間也就三週多三天而已，報名時間剛好在武漢肺炎剛爆發時，著實讓我緊張的一下，怕駕訓班會不會停課或爆發感染，好在台灣還沒開始大爆發（不要亂立 flag），駕訓班的防疫概念也做的不錯，讓我可以順利結束課程 :)&lt;/p&gt;

&lt;h3 id=&quot;第一週場內練習&quot;&gt;第一週：場內練習&lt;/h3&gt;

&lt;p&gt;我上的是平日班，此時剛好報名人數不多，頭一個禮拜比較需要教練指導時，因為起得早，加上教練後續沒有課程安排，我時常一次練超過兩節的分量。於是場內的大部分項目，在前三天就通通結束了。雖然和 S 彎奮鬥比較久，在第一週我的三項成功率（S 彎、倒車入庫、路邊停車）達到了七成。&lt;/p&gt;

&lt;h3 id=&quot;第二週精熟場內&quot;&gt;第二週：精熟場內&lt;/h3&gt;

&lt;p&gt;第二週開始我持續的練習場內三項之力，加上新學會的上坡起步。說起來手排車的上坡起步也是挺玄的項目，簡單的步驟如下：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;輕放離合器至車身微震&lt;/li&gt;
  &lt;li&gt;輕踩油門&lt;/li&gt;
  &lt;li&gt;再放離合器感到車身有稍稍往前，若無重複 2 步驟及 3 步驟&lt;/li&gt;
  &lt;li&gt;放下手剎車，車身即向上爬坡前進&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;恩，說起來簡單。但我會說玄，是因為油門和離合器的踩放並不需要一定的比例，甚至失誤後（沒踩對）也有機會救回來，只要適時的補油和調整離合器。上坡起步學習到的不只是上坡，而是離合器和油門的動態控制，這項技術也能用在停止時手排車的快速起步。不過這都是我第三週後的理解了，還曾經卡在坡上五分鐘呢！&lt;del&gt;真是恥辱&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;在第二週之後，場內三項之力只要認真起來，基本上已經不會壓線失誤了，成功率大概在九成，甚至還能用怠速全速開秀過 S 彎，大約等同普通學員一次倒車入庫的時間，對於速度比較慢的學員，甚至還能做到兩次 S 彎呢。&lt;del&gt;還是讓我自吹自擂一下&lt;/del&gt;&lt;/p&gt;

&lt;h3 id=&quot;第三週道駕與筆試&quot;&gt;第三週：道駕與筆試&lt;/h3&gt;

&lt;p&gt;第三週開始，除了每天例行的場內練習外，我必須起個大早，由教練陪同進行道駕練習。因為學的是手排車，但道駕用的是自排，第一次上車時一時不知道怎麽打檔，還被坐在後座的學弟嗆（怒）。不過道駕用的自排車實在比手排教練車好開太多了，輕輕一踩就能剎住的剎車，還有軟軟的油門，方向盤又好轉，一上車就不想下來了 😆 我就這樣每天五點半起個大早，連天都還沒亮就騎著機車跑去駕訓班，練了好幾天。&lt;/p&gt;

&lt;p&gt;然後在考前的前一個週末，駕訓班安排了筆試的總複習，聽完課後就開始讀題庫。不過說起來我的運氣還真好，最後抽到的題目完全沒有罰鍰金額、罰則和數字計算，差不多就是裸考就能通過的程度 😅，不過你也不是天天在過年的，還是乖乖準備吧！&lt;/p&gt;

&lt;h3 id=&quot;考試當天&quot;&gt;考試當天&lt;/h3&gt;

&lt;p&gt;練了快一個月的車都是晴天，結果考試當天早上竟然下大雨😂，心一橫就直接搭計程車去駕訓班了，想說也不差這次坐車的錢，要是騎車又淋溼等下考試一定很不爽。&lt;/p&gt;

&lt;p&gt;輪到我準備上車時還是有點緊張，心裡一直想會不會等會腳一抖就熄火，還沒開始就先被扣分了。結果還好一切順利，最怕的道駕路邊停車也停在完美安全的距離。一完成路邊停車，剩下的就只是開回駕訓班了，我的腦袋裡一直反覆著卡特的 It’s over dunk 的 over 手勢，真的結束了，舒服！&lt;/p&gt;

&lt;h2 id=&quot;口訣滿街的三寶&quot;&gt;口訣：滿街的三寶&lt;/h2&gt;

&lt;p&gt;如果要我給還沒學車的朋友一個建議，竊以為下面這兩張圖最為適合：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/BgwliLI.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;自豪貌&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;既然是三寶所以才要來學車嘛，所以就找自己節奏慢慢學就好了。遇到比較愛碎碎唸的教練抱怨你進度慢，你也要有自知之明，因為你就三寶，所以只能慢慢練培養肌肉記憶。&lt;del&gt;教練的話就不用理他了&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ByvvUO7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;送給駕訓班的所有同學&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;你可以把他解讀成防禦性駕駛。路上三寶就是這麼多，你自己也可能會失誤，既然如此就不要那麼貼彎，路線選擇安全點，預測一下前面三寶的行動，保持安全最重要。&lt;/p&gt;

&lt;p&gt;吹了這麼多，拿到駕照到現在我倒是還沒上過一次路。&lt;del&gt;還是來繼續考 L2 駕照實在&lt;/del&gt;&lt;/p&gt;

&lt;h2 id=&quot;後遺症&quot;&gt;後遺症&lt;/h2&gt;

&lt;p&gt;原本我對路上開什麼車一直都是沒啥興趣的，連車子的廠牌也叫不出大半，結果考完駕照後瘋狂看了一系列關於手排車換檔上路的實務影片，還學了一堆英文單字（Double clutch 啦 Heel Toe 啦 Downshifting 啦），搞得忽然很想弄台便宜的二手車來上路！&lt;/p&gt;

&lt;p&gt;更慘的是，YouTube 推薦影片慢慢出現一堆試新車的影片，看到公司樓下停了台可愛的歐洲車還會馬上去查型號（Abarth 595 真是太可愛啦 😍）。&lt;/p&gt;

&lt;p&gt;考駕照真是一條不歸路啊……😂&lt;/p&gt;</content><author><name></name></author><summary type="html">前言</summary></entry><entry><title type="html">使用 Chrome NetLog 解析隱藏在 DevTools 中的 Header 資訊</title><link href="https://yukaii.tw/blog/2019/03/02/chrome-netlog-and-netlog-viewer-hidden-header-credentials/" rel="alternate" type="text/html" title="使用 Chrome NetLog 解析隱藏在 DevTools 中的 Header 資訊" /><published>2019-03-02T13:30:00+00:00</published><updated>2019-03-02T13:30:00+00:00</updated><id>https://yukaii.tw/blog/2019/03/02/chrome-netlog-and-netlog-viewer-hidden-header-credentials</id><content type="html" xml:base="https://yukaii.tw/blog/2019/03/02/chrome-netlog-and-netlog-viewer-hidden-header-credentials/">&lt;p&gt;在檢視 DevTools 網路頁的 Headers 資訊時，有時後會顯示下面這行警告訊息：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/P7WZcYY.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Provisional headers are shown&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;這就代表有些敏感資訊被 DevTools 隱藏。舉例來說，CloudFront 有一套 &lt;a href=&quot;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html&quot;&gt;基於 Signed Cookie 的驗證系統&lt;/a&gt;，某些需要登入後才能存取的資源，比如 &lt;strong&gt;電子書&lt;/strong&gt;、影音就需要用這種方式來防止外流。不過有做 DRM 還是比較好啦，畢竟沒 DRM 你的檔案還是跟裸奔一樣啊！😆&lt;/p&gt;

&lt;h2 id=&quot;該是-netlog-登場的時刻&quot;&gt;該是 NetLog 登場的時刻&lt;/h2&gt;

&lt;p&gt;NetLog 顧名思義，是一套 Chromium Project 內建的網路事件記錄系統 (Network Logging System)，因為我們需要拿取被 DevTools 隱藏的資訊，所以就要靠 NetLog 啦。有 Log 才能 Debug！&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;打開 &lt;a href=&quot;chrome://net-export/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chrome://net-export/&lt;/code&gt;&lt;/a&gt;，你應該會看到以下的介面
 &lt;img src=&quot;https://i.imgur.com/8qFazRw.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;記得選擇第二項 &lt;strong&gt;Include cookies and credentials&lt;/strong&gt;，這才是我們要的&lt;/li&gt;
  &lt;li&gt;點按鈕，選擇完 dump 位置後開始記錄網路事件。開始進行你要 Log 的操作，此時分頁開越少越好，輸出資料的雜訊不會那麼多比較好讀&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;用-netlog-viewer-來打開-dump-出的-log-檔&quot;&gt;用 NetLog Viewer 來打開 dump 出的 log 檔&lt;/h2&gt;

&lt;p&gt;那麼輸出的 JSON 檔要怎麼讀？Google 也幫你弄好了。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;打開 &lt;a href=&quot;https://netlog-viewer.appspot.com&quot;&gt;NetLog Viewer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;把剛剛輸出的 JSON 檔案，拖弋到視窗
 &lt;img src=&quot;https://i.imgur.com/oJj7teQ.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Bang!
 &lt;img src=&quot;https://i.imgur.com/0K3spmz.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;點開左側的 Event，搜尋框輸入你要找的東西就可以了
 &lt;img src=&quot;https://i.imgur.com/pPYkL1f.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;剩下來就不說啦，搜尋你要的 Request 或 Cookie 鍵值，拉出你要的資訊，就和使用 DevTools 一樣&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;嗯&quot;&gt;嗯&lt;/h2&gt;

&lt;p&gt;所以說，你要解析的敏感資訊是什麼呢？&lt;/p&gt;

&lt;p&gt;光喜自得！&lt;/p&gt;</content><author><name></name></author><summary type="html">在檢視 DevTools 網路頁的 Headers 資訊時，有時後會顯示下面這行警告訊息：</summary></entry><entry><title type="html">Chrome Extension - Kabegami New Page</title><link href="https://yukaii.tw/blog/2018/07/16/kabegami-new-page/" rel="alternate" type="text/html" title="Chrome Extension - Kabegami New Page" /><published>2018-07-16T12:30:00+00:00</published><updated>2018-07-16T12:30:00+00:00</updated><id>https://yukaii.tw/blog/2018/07/16/kabegami-new-page</id><content type="html" xml:base="https://yukaii.tw/blog/2018/07/16/kabegami-new-page/">&lt;h2 id=&quot;先看-demo&quot;&gt;先看 Demo&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/CW9l7iA.gif&quot; alt=&quot;Imgur&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;，這是一個讓瀏覽器新分頁&lt;strong&gt;每次隨機顯示桌布&lt;/strong&gt;的擴充功能。&lt;/p&gt;

&lt;p&gt;瀏覽器成為第二個桌面，我自幹這個功能也是相當合理的 =w=&lt;/p&gt;

&lt;h2 id=&quot;到哪下載&quot;&gt;到哪下載？&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/kabegami-new-page/fbbdincgjgdmbbkongmineooghpadbgk&quot;&gt;這裡&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;技術架構&quot;&gt;技術架構&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;好久沒玩的 Vue.js，做點小玩意兒剛剛好&lt;/li&gt;
  &lt;li&gt;JS 好朋友 TypeScript，沒這個真的不知怎麽寫前端了&lt;/li&gt;
  &lt;li&gt;Imgur API，流量無限我他媽還不傳爆！&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;值得一提的是這次用 TypeScript Generics 搭配 localforage 弄了一層簡單的 &lt;a href=&quot;https://github.com/Yukaii/kanahei-wallpapers/blob/master/src/app/lib/store.ts#L26&quot;&gt;ActiveModel-like API&lt;/a&gt;，莫名的成就感啊 😂&lt;/p&gt;

&lt;h2 id=&quot;show-me-the-code&quot;&gt;Show me the code&lt;/h2&gt;

&lt;p&gt;按照慣例一向開源開爆的，GitHub repo 在 &lt;a href=&quot;https://github.com/Yukaii/kanahei-wallpapers&quot;&gt;https://github.com/Yukaii/kanahei-wallpapers&lt;/a&gt;。為何名字裡有 kanahei？原因是一開始純粹想做他們家限定的桌布，沒想到回饋不錯只好一般化，讓大家可以上傳自己想用的桌布。之後可能會改名吧，再說。&lt;/p&gt;</content><author><name></name></author><summary type="html">先看 Demo</summary></entry><entry><title type="html">更改 Opera 的新分頁</title><link href="https://yukaii.tw/blog/2018/06/06/how-to-change-opera-new-start-page/" rel="alternate" type="text/html" title="更改 Opera 的新分頁" /><published>2018-06-06T01:57:00+00:00</published><updated>2018-06-06T01:57:00+00:00</updated><id>https://yukaii.tw/blog/2018/06/06/how-to-change-opera-new-start-page</id><content type="html" xml:base="https://yukaii.tw/blog/2018/06/06/how-to-change-opera-new-start-page/">&lt;p&gt;我從去年起開始使用 Opera，原因有二：基於 Chromium 以及內建的暗色主題。不過這不是本篇的主題，就讓我輕輕帶過吧 XD&lt;/p&gt;

&lt;p&gt;現在的 Opera 既然是基於 Chromium 改的，當然支援 Google Chrome 的瀏覽器擴充功能，只要安裝 Opera 官方出的 &lt;a href=&quot;https://addons.opera.com/zh-tw/extensions/details/install-chrome-extensions/&quot;&gt;Install Chrome Extensions&lt;/a&gt; 擴充套件，就能無縫直接在 Chrome Web Store 下載了，不過還是有些限制，比如 Chrome Apps 和主題就不支援，修改新分頁的擴充功能也沒辦法直接使用。&lt;/p&gt;

&lt;p&gt;接下來教你怎麽啟用 Opera 修改新分頁的擴充功能 😝&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;安裝完上面提到的 &lt;a href=&quot;https://addons.opera.com/zh-tw/extensions/details/install-chrome-extensions/&quot;&gt;Install Chrome Extensions&lt;/a&gt; 之後，到 &lt;a href=&quot;https://chrome.google.com/webstore/detail/new-tab-start-page-pro/mjfahldkpjhcnfbbmdhpjolcjpcfhcpj&quot;&gt;Chrome Web Store&lt;/a&gt; 頁面安裝 New Tab Start Page Pro&lt;/li&gt;
  &lt;li&gt;安裝修改新分頁的功能，以 &lt;a href=&quot;https://chrome.google.com/webstore/detail/unsplash-instant/pejkokffkapolfffcgbmdmhdelanoaih&quot;&gt;Unplash Instant&lt;/a&gt; 為例，一樣先到 Chrome Web Store 安裝&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;複製擴充功能的 ID，在擴充功能 Web Store 網址的最後面，以 Unsplash Instant 為例，就是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pejkokffkapolfffcgbmdmhdelanoaih&lt;/code&gt;，也可以從 Opera 的擴充功能頁面拿到&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/MCcnznn.png&quot; alt=&quot;ID&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;叫出 New Tab Start Page Pro 的設定頁，在 New Tab &amp;amp; Start Page URL 欄位填入：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chrome-extension://pejkokffkapolfffcgbmdmhdelanoaih/index.html&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;其它照截圖的選起來&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;https://i.imgur.com/07NcIOh.png&quot; alt=&quot;options&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;按 Save 存檔&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;效果如下圖，雖然開啟新分頁之後會閃一下，聊勝於無啦&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Ctvff8y.gif&quot; alt=&quot;gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;（完）&lt;/p&gt;</content><author><name></name></author><summary type="html">我從去年起開始使用 Opera，原因有二：基於 Chromium 以及內建的暗色主題。不過這不是本篇的主題，就讓我輕輕帶過吧 XD</summary></entry><entry><title type="html">用 Gmail 的 SMTP 來寄信，但你的郵件伺服器沒有 SMTP 功能</title><link href="https://yukaii.tw/blog/2018/04/13/use-gmail-smtp-without-your-own-smtp-server/" rel="alternate" type="text/html" title="用 Gmail 的 SMTP 來寄信，但你的郵件伺服器沒有 SMTP 功能" /><published>2018-04-13T00:00:00+00:00</published><updated>2018-04-13T00:00:00+00:00</updated><id>https://yukaii.tw/blog/2018/04/13/use-gmail-smtp-without-your-own-smtp-server</id><content type="html" xml:base="https://yukaii.tw/blog/2018/04/13/use-gmail-smtp-without-your-own-smtp-server/">&lt;h2 id=&quot;你到底再工啥小&quot;&gt;你到底再工啥小&lt;/h2&gt;

&lt;p&gt;在啦幹。解釋一下，敝單位由於歷史因素及安全考量，所以內部的郵件系統在外網時，只開放收信（IMAP）而沒有寄信（SMTP）功能。這摸不方便的狀況一定要來 workaround，免費 Gmail 就有 SMTP 寄信功能，我們就直接用吧。值得一提的是這方法是我成功之後才去 Google 驗證解法的，難得一波直覺流 &amp;lt;3&lt;/p&gt;

&lt;h2 id=&quot;設定步驟&quot;&gt;設定步驟&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;設定電子郵件客戶端的寄信伺服器為 Gmail 的 SMTP，伺服器填：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;smtp.gmail.com&lt;/code&gt;，帳號：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xxx@gmail.com&lt;/code&gt;，密碼為 gmail 密碼。若你有兩階段驗證，密碼就去&lt;a href=&quot;https://myaccount.google.com/apppasswords&quot;&gt;應用程式密碼&lt;/a&gt;產生&lt;/li&gt;
  &lt;li&gt;到 Gmail 的 &lt;strong&gt;帳戶和匯入&lt;/strong&gt; -&amp;gt; &lt;strong&gt;以這個地址寄送郵件&lt;/strong&gt; -&amp;gt; 點選 &lt;strong&gt;新增另一個電子郵件地址&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;把&lt;strong&gt;視為別名&lt;/strong&gt;給取消勾選、填入你要用來寄信的 mail&lt;/li&gt;
  &lt;li&gt;SMTP 伺服器欄位，填入 Gmail 的 SMTP（跟上面第一點填的一樣）&lt;/li&gt;
  &lt;li&gt;收信驗證 mail&lt;/li&gt;
  &lt;li&gt;搞定&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;最近 Gmail 準備要推出改版了，希望這部分的 UI 不要差太多。另外本篇就先不截圖了，非開發者比較需要 XD&lt;/p&gt;

&lt;p&gt;via &lt;a href=&quot;https://webapps.stackexchange.com/a/72975&quot;&gt;https://webapps.stackexchange.com/a/72975&lt;/a&gt;&lt;/p&gt;</content><author><name></name></author><summary type="html">你到底再工啥小</summary></entry><entry><title type="html">來推廣一下 Alfred 好了</title><link href="https://yukaii.tw/blog/2018/02/19/my-own-alfred-workflow-and-macos-sierra-theme/" rel="alternate" type="text/html" title="來推廣一下 Alfred 好了" /><published>2018-02-19T00:00:00+00:00</published><updated>2018-02-19T00:00:00+00:00</updated><id>https://yukaii.tw/blog/2018/02/19/my-own-alfred-workflow-and-macos-sierra-theme</id><content type="html" xml:base="https://yukaii.tw/blog/2018/02/19/my-own-alfred-workflow-and-macos-sierra-theme/">&lt;h2 id=&quot;日常刷存在感開始&quot;&gt;日常刷存在感開始&lt;/h2&gt;

&lt;p&gt;三個月沒有發新的文章。雖然斷斷續續累積不少內容在 Evernote 和 GitHub 票上，但就是懶的整理成文章發表。看看我，連新年新希望都懶的刷啦。若是非要給去年來個總結，大致就是「運氣真好，幹得不錯」吧（結果還是總結了嘛，總結還是比開支票輕鬆）&lt;/p&gt;

&lt;p&gt;今天要來推廣一下 macOS 下的神器 Alfred，其實我也用了快四年，只是去年才還債 Powerpack（？）&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.alfredapp.com/&quot;&gt;Alfred&lt;/a&gt; 除了能&lt;strong&gt;快速啟動/切換&lt;/strong&gt;應用程式外，還能編寫自己的 workflow 腳本，來達成匯率轉換、&lt;a href=&quot;https://github.com/zetavg/alfred-google-translate-workflow&quot;&gt;翻譯&lt;/a&gt;、即時顯示資訊等等。雖然理論上能透過 API 做到各種應用，但 UI 限制就擺在那，有些功能你硬要用 Alfred workflow 做就顯得彆鈕 😆。&lt;/p&gt;

&lt;p&gt;好，這樣就推廣完畢啦（逃）。接下來寫點我自己對 Alfred 做的修改和套件：&lt;/p&gt;

&lt;h2 id=&quot;自製的-macos-風格主題-macos-styled-alfred-theme&quot;&gt;自製的 macOS 風格主題 (macOS-styled alfred theme)&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/zg25hcK.png&quot; alt=&quot;mac-os-styled-alfred-theme&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.alfredapp.com/extras/theme/R20A5tyTVc/&quot;&gt;下載連結&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;特色&quot;&gt;特色&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;macOS 標準藍色，參見 &lt;a href=&quot;https://developer.apple.com/macos/human-interface-guidelines/visual-design/color/&quot;&gt;Apple Human Interface Guidelines 的色彩部分&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;del&gt;深度微調的背景糢糊和黑色&lt;/del&gt; 其實就是肉眼觀測法&lt;/li&gt;
  &lt;li&gt;還不錯的 scrollbar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;廢話一堆，受限於 Alfred 的 API，主題能調整的一些些，反正不要太突兀，和系統風格差不多就好。&lt;del&gt;像我就只會抄 Spotlight&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;BTW，Alfred 分享網址出來的預覽圖實在有點醜啊，應該很久沒更新了吧 XD&lt;/p&gt;

&lt;h2 id=&quot;自己來寫-powerpack&quot;&gt;自己來寫 Powerpack&lt;/h2&gt;

&lt;p&gt;使用 JS Hero &lt;a href=&quot;https://github.com/sindresorhus&quot;&gt;sindresorhus&lt;/a&gt; 大大的 &lt;a href=&quot;https://github.com/sindresorhus/alfy&quot;&gt;alfy&lt;/a&gt; 套件，就可以輕鬆的用 Node.js 來寫 Alfred workflow，各種 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm&lt;/code&gt; 套件隨你用，還可以利用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm&lt;/code&gt; 來發佈、安裝 workflow。&lt;/p&gt;

&lt;p&gt;像我就做了內部分機表速查的小工具，誰打電話來找麻煩，要接還是不接，一按就知道！❤️ （被揍）&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/9YzPPwQ.png&quot; alt=&quot;alfred-contacts&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Skitch 馬賽克馬的好糾結&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;awesome-alfred&quot;&gt;Awesome alfred&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/derimagia/awesome-alfred-workflows&quot;&gt;Awesome&lt;/a&gt; 系列都這麼多年，什麼不會就讀一讀吧 XD&lt;/p&gt;</content><author><name></name></author><summary type="html">日常刷存在感開始</summary></entry><entry><title type="html">用 ssh tunnel 連線到 router 背後的機器，並建立 SOCKS5 proxy 存取內網資源</title><link href="https://yukaii.tw/blog/2017/10/07/ssh-reverse-tunnel-behind-the-router-with-socks5-proxy/" rel="alternate" type="text/html" title="用 ssh tunnel 連線到 router 背後的機器，並建立 SOCKS5 proxy 存取內網資源" /><published>2017-10-07T00:00:00+00:00</published><updated>2017-10-07T00:00:00+00:00</updated><id>https://yukaii.tw/blog/2017/10/07/ssh-reverse-tunnel-behind-the-router-with-socks5-proxy</id><content type="html" xml:base="https://yukaii.tw/blog/2017/10/07/ssh-reverse-tunnel-behind-the-router-with-socks5-proxy/">&lt;h2 id=&quot;這役男實在是&quot;&gt;這役男實在是…&lt;/h2&gt;

&lt;p&gt;記一下最近遇到的問題。&lt;/p&gt;

&lt;p&gt;目前小弟正在公家單位服役。凡公家機關，內部架個外包的管理系統也是很合理的，不過因為是內部系統，所以只能透過區網來存取。對於我這個用自己機器的人來說就不太方便啦，連線的 Wifi Router 又不能和內網相通。&lt;/p&gt;

&lt;p&gt;剛好單位有台閒置的虛擬機，也可以存取內網，Google 了幾個方案之後發現 ssh tunnel 的影響最小：不用裝些有的沒的，也不用更改網路環境，加上我已經有了台 Linode 上的遠端開發機常駐，就來試試吧 =w=&lt;/p&gt;

&lt;p&gt;以下是環境的簡易說明圖。「那臺機器」就是閒置的內網虛擬機，「開發機器」是常駐 Linode 的遠端開發機，「Client 機」是任一台可以連線到開發機的裝置，可能是 Macbook Air、iPad，或是路邊撿來裝上 putty 的 Windows（逃）&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;                          +
                          |
                          |
                   ssh with reverse port
+---------------+  forwarding            +---------------+
|               +------------------------&amp;gt;               |
|   那臺機器     &amp;lt;------------------------+    開發機器    &amp;lt;-----+ mosh + tmux
|               |   ssh to localhost via |               |     |   掛上去
|   (ubuntu)    |   forwarded port       |   (Linode)    |     |
+---------------+         |              +---------------+     |
                          |                                    +-------------+
                          |                                    |             |
                          |                                    |             |
                          |                                    |  Client 機  |
                          |                                    |             |
                          |                                    |             |
                          +                                    +-------------+

                一堆 router 和防火牆等等

&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;ssh-remote-port-forwarding&quot;&gt;ssh remote port forwarding&lt;/h2&gt;

&lt;p&gt;先在 Ubuntu 上跑 ssh 指令連到遠端開發機，再加上 Remote port forwarding 參數：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# run on machine behind router&lt;/span&gt;
ssh &lt;span class=&quot;nt&quot;&gt;-NfR&lt;/span&gt; 11111:localhost:22 REMOTE_SERVER_IP
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;可以看到 ssh 有三個參數，分別為：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-N&lt;/code&gt;: 單純連線，不送指令&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-f&lt;/code&gt;: 放到背景執行&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-R&lt;/code&gt;: Remote port forwarding，遠端埠重導&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上面指令的作用是，建立 ssh tunnel，讓遠端機器的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;11111&lt;/code&gt; port 連回本機的 port 22 (localhost:22)。&lt;/p&gt;

&lt;p&gt;所以接下來在遠端機跑：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# run on remote machine&lt;/span&gt;
ssh localhost &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 11111
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;就可以 ssh 回 router 背後的機器啦。&lt;/p&gt;

&lt;h2 id=&quot;socks5-proxy&quot;&gt;SOCKS5 Proxy&lt;/h2&gt;

&lt;p&gt;接下來我們修改一點指令，加上 dynamic port forwarding 參數 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-D&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# run on remote machine&lt;/span&gt;
ssh &lt;span class=&quot;nt&quot;&gt;-ND&lt;/span&gt; 0.0.0.0:8080 localhost &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 11111
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;另一個參數 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-N&lt;/code&gt; 讓指令純建立 tunnel，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.0.0.0&lt;/code&gt; 讓所有 IP 都能連到這臺機器，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8080&lt;/code&gt; 是綁定的 port。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-p&lt;/code&gt; 指令連接埠，也就是方才 forward 過來的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;11111&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;這樣 SOCKS5 Proxy 就算跑起來了，最後來設定 Client 端。我另外開了一個 Chrome 的 Profile，裝上 &lt;a href=&quot;https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif&quot;&gt;Proxy SwitchyOmega&lt;/a&gt; 插件，方便隔離：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/kOjwrdw.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Remote IP 就是遠端開發機的 IP。Bypass List 要檢查一下，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.x.x&lt;/code&gt; 也要 forward，記得從 List 刪掉。&lt;/p&gt;

&lt;p&gt;然後就可以在外網存取 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.X.X&lt;/code&gt; 的區網資源啦！太舒適啦！&lt;/p&gt;

&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jordancrawford.kiwi/home-server-without-portforward/&quot;&gt;Accessing home services from anywhere, without port forwarding!&lt;/a&gt; - 用 tinc 做 VPN，感覺更佳舒適&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://superuser.com/questions/595989/ssh-through-a-router-without-port-forwarding&quot;&gt;ssh through a router without port forwarding&lt;/a&gt; - SuperUser 日常爬文&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><summary type="html">這役男實在是…</summary></entry><entry><title type="html">郵政 VISA 盜刷處理心得</title><link href="https://yukaii.tw/blog/2017/10/02/my-experience-with-chunghwa-post-visa-credit-card-fraud/" rel="alternate" type="text/html" title="郵政 VISA 盜刷處理心得" /><published>2017-10-02T00:00:00+00:00</published><updated>2017-10-02T00:00:00+00:00</updated><id>https://yukaii.tw/blog/2017/10/02/my-experience-with-chunghwa-post-visa-credit-card-fraud</id><content type="html" xml:base="https://yukaii.tw/blog/2017/10/02/my-experience-with-chunghwa-post-visa-credit-card-fraud/">&lt;h2 id=&quot;似乎月更已成慣例&quot;&gt;似乎月更已成慣例&lt;/h2&gt;

&lt;p&gt;一個多月前，我剛結束成功嶺的新訓，來到高雄開始為期一週的專訓。才享受自由的空氣沒多久，第一天下午就收到一筆金額 4XXXX 的簡訊，騙鬼咧我明明就乖乖坐在這裡啊！&lt;/p&gt;

&lt;p&gt;接下來我就慢慢走過：&lt;del&gt;&lt;a href=&quot;https://zh.m.wikipedia.org/zh-hant/库伯勒-罗丝模型&quot;&gt;否認、憤怒、
討價還價、沮喪、接受&lt;/a&gt;的過程&lt;/del&gt;。才不是咧，當然是趕快打卡片後面的號碼求救啊！我和郵局確認該筆
交易的消費資訊（商家、消費國等），這真的不是我花的吼。&lt;/p&gt;

&lt;p&gt;確定之後就辦理卡片掛失，雖然卡片不是真的不見，但這樣就不會再有交易了。可是這張卡就沒用啦 XD，再換新卡之前只能臨櫃提款。&lt;/p&gt;

&lt;h2 id=&quot;跑行政流程&quot;&gt;跑行政流程&lt;/h2&gt;

&lt;p&gt;因為專訓期間我也不能亂跑（其實還是可以，不過剛從陰間出來的都比較膽小 w），所以就拖到了禮拜六才弄。&lt;/p&gt;

&lt;p&gt;我帶著四神器：卡片、存摺、開戶印章、身分證，填了兩張表單：「持卡人聲明書」和「疑義帳款複查申請」，聲明真的不是媽媽的姊姊的叔叔的爸爸的弟弟把我的卡借去刷了。櫃檯小姐表示郵局會把這筆交易提交 VISA 審查，確認之後就會撥款回來。&lt;/p&gt;

&lt;h2 id=&quot;然後我就拿回錢啦&quot;&gt;然後我就拿回錢啦&lt;/h2&gt;

&lt;p&gt;就在昨天，郵局的承辦小姐通知我的錢已經回來了，爽啦！雖然前前後後跑了郵局三次（加換卡），但比當初說的兩個月還快啊，&lt;del&gt;又可以大刷特刷敗家囉！&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;這次也不知道是哪個網站洩漏卡號，之後要享受網路刷卡的便利前還是要做好準備，學學強者我朋友的作法：開另一個戶專門用來刷卡，只匯足夠的錢進去就好 :p&lt;/p&gt;</content><author><name></name></author><summary type="html">似乎月更已成慣例</summary></entry><entry><title type="html">用 PowerShell 批次轉換 docx 到 pdf</title><link href="https://yukaii.tw/blog/2017/08/29/batch-convert-word-docx-to-pdf/" rel="alternate" type="text/html" title="用 PowerShell 批次轉換 docx 到 pdf" /><published>2017-08-29T00:00:00+00:00</published><updated>2017-08-29T00:00:00+00:00</updated><id>https://yukaii.tw/blog/2017/08/29/batch-convert-word-docx-to-pdf</id><content type="html" xml:base="https://yukaii.tw/blog/2017/08/29/batch-convert-word-docx-to-pdf/">&lt;h2 id=&quot;近況&quot;&gt;近況&lt;/h2&gt;

&lt;p&gt;內容與標題不符。&lt;/p&gt;

&lt;p&gt;我從今年的八月&lt;a href=&quot;https://alive.yukaii.tw/&quot;&gt;開始登入&lt;/a&gt;替代役 online。替代役自由多了，回想起成功嶺的那兩周，不僅餐餐吃不飽，還因為腸胃炎而再次掉了兩公斤多 Zzz，實在有夠悲劇。&lt;/p&gt;

&lt;p&gt;可能因為這麼悲慘的運氣補償機制吧(喂)，我來到了國訓中心開始了一年的役期，也多了些「閒暇時間」可以利用，無論如何都是非常幸運了 QAQ&lt;/p&gt;

&lt;p&gt;進入正題吧&lt;/p&gt;

&lt;h2 id=&quot;批次轉換-docx-成-pdf&quot;&gt;批次轉換 docx 成 pdf&lt;/h2&gt;

&lt;p&gt;需求很簡單，也有現成軟體可以達成，不過身為一個開發者，連文書也要做的潮才行。以往一直沒什麼機會在 Windows 下進行自動化(多半是當時還太菜)，有了這個機會當然要好好利用。&lt;/p&gt;

&lt;p&gt;雖然沒寫過 PowerShell，不過 Google 第一項結果在 &lt;a href=&quot;https://stackoverflow.com/a/16537996&quot;&gt;StackOverFlow&lt;/a&gt; 就有了，輕鬆愉快。&lt;/p&gt;

&lt;h3 id=&quot;啟用腳本執行權限&quot;&gt;啟用腳本執行權限&lt;/h3&gt;

&lt;p&gt;首先設定讓 powershell 可以執行腳本，以系統管理員身分執行 PowerShell 並跑起以下指令：&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;Set-ExecutionPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;RemoteSigned&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;寫-powershell-腳本&quot;&gt;寫 PowerShell 腳本&lt;/h3&gt;

&lt;p&gt;然後把以下腳本存成副檔名為 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ps1&lt;/code&gt;，比如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;word-to-pdf.ps1&lt;/code&gt;。其中 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$documents_path&lt;/code&gt; 改成目標資料夾路徑。&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# From https://stackoverflow.com/a/16537996&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$documents_path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'C:\Users\user\Documents\blahblahblah'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$word_app&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;New-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ComObject&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Word.Application&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# This filter will find .doc as well as .docx documents&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Get-ChildItem&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$documents_path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Filter&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;doc&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Recurse&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ForEach-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$document&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$word_app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Documents&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;FullName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pdf_filename&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DirectoryName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;BaseName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;pdf&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$document&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.SaveAs([ref] &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pdf_filename&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, [ref] 17)
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$document&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.Close()
}

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$word_app&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.Quit()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;注意的是在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-ChildItem&lt;/code&gt; 方法我加上了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Recurse&lt;/code&gt; 遞迴參數，讓所有子目錄底下的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docx&lt;/code&gt; 都能被轉換到。&lt;/p&gt;

&lt;p&gt;點擊兩下執行，所有 pdf 就會慢慢產生在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docx&lt;/code&gt; 檔的旁邊啦，瞬間開始耍廢！(喂)&lt;/p&gt;

&lt;p&gt;之後若有更多的 PowerShell 輔助使用腳本，我都會放在 &lt;a href=&quot;https://github.com/Yukaii/powershell-study&quot;&gt;powershell-study&lt;/a&gt; 這個 repo，歡迎自行取用 :p&lt;/p&gt;

&lt;p&gt;(完)&lt;/p&gt;</content><author><name></name></author><summary type="html">近況</summary></entry><entry><title type="html">用 Travis CI 自動部署 Jekyll 部落格到 GitHub Pages</title><link href="https://yukaii.tw/blog/2017/08/01/auto-deploy-jekyll-blog-with-travis-ci-official-gh-pages-plugin/" rel="alternate" type="text/html" title="用 Travis CI 自動部署 Jekyll 部落格到 GitHub Pages" /><published>2017-08-01T00:00:00+00:00</published><updated>2017-08-01T00:00:00+00:00</updated><id>https://yukaii.tw/blog/2017/08/01/auto-deploy-jekyll-blog-with-travis-ci-official-gh-pages-plugin</id><content type="html" xml:base="https://yukaii.tw/blog/2017/08/01/auto-deploy-jekyll-blog-with-travis-ci-official-gh-pages-plugin/">&lt;p&gt;弄完 &lt;a href=&quot;https://github.com/Yukaii/ics-scheduler&quot;&gt;ics-scheduler&lt;/a&gt; 專案後沒多久就開了 &lt;a href=&quot;https://github.com/Yukaii/Blog/issues/2&quot;&gt;Travis Auto Build 的 issue&lt;/a&gt; 放置 Play。可惜我實在太懶，而現階段的部屬流程也很簡單： 建構、提交再推送。建構跑 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll build&lt;/code&gt; 指令，包成 bash script 更是秒秒鐘；提交完，fish 又有基於歷史的指令自動補全，推送的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git subtree&lt;/code&gt; 指令打到一半，後面的自動補完出來按個 enter 就好了。&lt;/p&gt;

&lt;p&gt;自動化永遠不嫌多，把建構出的結果一起加到進版控系統追蹤也不夠優雅的，每次新增一篇文章 diff 又一大堆。正巧今天早上收信的時候，看到以前關注的 GitHub 議題：「&lt;a href=&quot;https://github.com/github/pages-gem/issues/189#issuecomment-319070628&quot;&gt;將 jekyll-assets 整合到 github pages 官方 gem&lt;/a&gt;」有更新，留言提到 &lt;a href=&quot;https://docs.travis-ci.com/user/deployment/pages&quot;&gt;Travis 現在也有 GitHub Pages 自動部屬的預設配置&lt;/a&gt;了。機不可失，官方有支援，設定就簡單。來設定自動部屬吧 XD&lt;/p&gt;

&lt;h2 id=&quot;設置&quot;&gt;設置&lt;/h2&gt;

&lt;p&gt;交互參照 &lt;a href=&quot;https://docs.travis-ci.com/user/deployment/pages&quot;&gt;Travis CI 的文件&lt;/a&gt;及 &lt;a href=&quot;https://jekyllrb.com/docs/continuous-integration/travis-ci/&quot;&gt;Jekyll 的文件&lt;/a&gt;，最後的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.travis.yml&lt;/code&gt; 長這樣：&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ruby&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;rvm&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;2.3.3&lt;/span&gt;
 
&lt;span class=&quot;na&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./bin/cibuild&lt;/span&gt;
 
&lt;span class=&quot;na&quot;&gt;before_script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
 &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;chmod +x ./bin/cibuild&lt;/span&gt;
 
&lt;span class=&quot;na&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;pages&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;skip_cleanup&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;github_token&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$GITHUB_TOKEN&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Yukaii/yukaii.github.io&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;local_dir&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;_site&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;target_branch&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;master&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;master&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;分三段來看。&lt;/p&gt;

&lt;h3 id=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;language: ruby&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;因為用的是 Jekyll，所以該有的 ruby 環境也要設定。Travis clone repo 下來之後便會自動 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; 裝完套件。&lt;/p&gt;

&lt;h3 id=&quot;script--before_script&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script&lt;/code&gt; &amp;amp; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;before_script&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;這部份就是建制網站，cibuild 這個腳本長這樣：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
 
&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt;
 
&lt;span class=&quot;nv&quot;&gt;JEKYLL_ENV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;production bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;就是 jekyll build 指令啦。&lt;/p&gt;

&lt;h3 id=&quot;deploy&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deploy&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;最後 deploy 的部分，因為我部屬到 GitHub Pages 的 使用者頁面(User Site, &lt;strong&gt;username&lt;/strong&gt;.github.io)，所以 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;repo&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;target_branch&lt;/code&gt; 要額外設定。其它就照著 &lt;a href=&quot;https://docs.travis-ci.com/user/deployment/pages&quot;&gt;Travis 文件&lt;/a&gt;預設填就好了。&lt;/p&gt;

&lt;p&gt;Jekyll 建制完的檔案預設會在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site&lt;/code&gt; 目錄底下，所以 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;local_dir&lt;/code&gt; 也要設為 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;no-such-file-or-directory--rb_sysopen-錯誤&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;No such file or directory @ rb_sysopen&lt;/code&gt; 錯誤&lt;/h2&gt;

&lt;p&gt;在 Travis CI 上面跑 Jekyll 就會炸掉 XDD 就照著 &lt;a href=&quot;https://github.com/jekyll/jekyll/issues/2938&quot;&gt;jekyll/jekyll#2938&lt;/a&gt;，在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exclude&lt;/code&gt; 加入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vendor&lt;/code&gt; 解掉。&lt;/p&gt;

&lt;h2 id=&quot;成果&quot;&gt;成果&lt;/h2&gt;

&lt;p&gt;以後只要用線上的 Markdown 編輯器寫完文章（比如 &lt;a href=&quot;https://hackmd.io&quot;&gt;HackMD&lt;/a&gt; ），再貼到 GitHub 線上 commit，部落格就能自動更新啦。也可以用 &lt;a href=&quot;http://prose.io&quot;&gt;prose.io&lt;/a&gt; 這類的線上 GitHub 內容管理工具，編輯提交一手包，還有草稿可以用 :p&lt;/p&gt;

&lt;p&gt;Travis 建構的缺點是 CI 服務裝完套件還是得花個幾分鐘，沒有以往那麼迅速。寫個文章而已嘛，還是可以忍受的，geek 到心理愉悅最重要（？）&lt;/p&gt;

&lt;p&gt;（完）&lt;/p&gt;</content><author><name></name></author><summary type="html">弄完 ics-scheduler 專案後沒多久就開了 Travis Auto Build 的 issue 放置 Play。可惜我實在太懶，而現階段的部屬流程也很簡單： 建構、提交再推送。建構跑 jekyll build 指令，包成 bash script 更是秒秒鐘；提交完，fish 又有基於歷史的指令自動補全，推送的 git subtree 指令打到一半，後面的自動補完出來按個 enter 就好了。</summary></entry></feed>