<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[MOLi Blog]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://blog.moli.rocks/</link><image><url>https://blog.moli.rocks/favicon.png</url><title>MOLi Blog</title><link>https://blog.moli.rocks/</link></image><generator>Ghost 3.26</generator><lastBuildDate>Thu, 16 Apr 2026 02:00:30 GMT</lastBuildDate><atom:link href="https://blog.moli.rocks/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[2019 新鮮人前端工程師面試全紀錄]]></title><description><![CDATA[2019 碩士應屆新鮮人的前端面試全記錄 (QNAP, 雷技, Yahoo, Synology, 17 Media, 趨勢…)]]></description><link>https://blog.moli.rocks/2019/02/04/y20190205y/</link><guid isPermaLink="false">5c5726cc78d0bf093e485ab3</guid><category><![CDATA[Web]]></category><category><![CDATA[frontend]]></category><category><![CDATA[interview]]></category><dc:creator><![CDATA[YY]]></dc:creator><pubDate>Mon, 04 Feb 2019 16:59:35 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2019/02/IMG_0681.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.moli.rocks/content/images/2019/02/IMG_0681.jpg" alt="2019 新鮮人前端工程師面試全紀錄"><p>/</p>
<p>一段關於剛被我大國軍摧殘完的找工作辛酸血淚史，找的是我的第一份全職工作，從 2018 年 6 月參加了 Yourator 辦的快速面試，然後口試、畢業、入伍、退伍再花 30 天面試了 11 個職缺後拿到滿意的 offer 準備過年。</p>
<p>由於面試期間受惠於 ptt 及各式部落格面試心得文，因此決定也來寫一篇順便做個紀錄。</p>
<hr>
<ul>
<li><a href="#background">背景</a></li>
<li><a href="#factor">職缺選擇</a></li>
<li><a href="#expectation">期望薪資</a></li>
<li><a href="#list">面試清單</a></li>
<li><a href="#preparation">面試準備</a></li>
<li><a href="#question">面試問題彙整</a></li>
<li><a href="#summary">結論</a></li>
</ul>
<hr>
<h2 id="background">背景</h2>
<p>國立中(後)段大學資管學碩畢，從大二下開始接觸網頁，一不小心走偏愛上前端，然後一寫就是四年。期間有在小公司實習四年做全端、國泰金控 CIP 暑期實習、校內工讀體驗血汗工程師，平常沒事的話就會找一些 side project 來做，所以算是有一些作品。</p>
<p>除了前端的部分也摸過一些後端、資料庫、Linux、區塊鏈、CMS、React Native，<s>不過都不熟</s>，導致面試中很常被問到我是投前端還是全端的職缺。</p>
<hr>
<h2 id="factor">職缺選擇</h2>
<p>因為興趣以及自己目前最熟的部分是前端，所以履歷全部都是投前端工程師的職缺，再透過職務說明過濾掉技術落後、工作內容無聊、寫明用非 React 的職缺。</p>
<p><strong>選團隊 &gt; 選公司</strong><br>
所投遞的履歷包含了大小公司、新創，甚至是多種產業類別，主要因素是在工作選擇上以團隊作為最主要的考量，作為評斷的條件像是團隊人數架構、開發項目、專案運作、技術使用等，希望團隊中有許多強者可以交流且樂於學習、導入新技術，再來考慮公司福利與薪資的部分。</p>
<p>當然，我也只是個新鮮人，不知道選錯公司或產業別會不會發生什麼事。</p>
<p><strong>當兵會改變一個人</strong><br>
在入伍前我只打算找新創，因為新創給人的感覺就是活潑、自由、技術都很潮，通常薪水也都比較敢給。</p>
<p>但在軍中每天被長官洗腦</p>
<blockquote>
<p>你各位想想看十年後你的公司還在嗎？<br>
有哪間公司會提供早餐午餐外散宿還見紅就休？<br>
結婚有補助嗎？<br>
生小孩有補助嗎？<br>
看醫生有補助嗎？<br>
我每年特休xxx天還有xxx天慰勞假</p>
</blockquote>
<p>於是開始研究公司福利通常會有哪些，然後找一些穩定成長的中小公司或大公司中帶有新創味道的職缺。</p>
<hr>
<h2 id="expectation">期望薪資</h2>
<p>身邊不少朋友應屆就是年薪百萬的人生勝利組，但弱弱如我不敢奢求太多，目標年薪設定在 800 ~ 900k，月薪的話則是期望在 50 ~ 65k，再依照面試表現以及薪資結構開價。</p>
<p>(記得在還沒畢業的時候覺得有點實習經驗然後有一些作品月薪拿個 70k 合情合理吧。</p>
<hr>
<h2 id="list">面試清單</h2>
<p>總共投了 25 個職缺，14 個有得到面試機會，其中 2 個為 Yourator 快速面試；1 個 hunter 提供；5 個主動邀約，所以自行投遞履歷的面試率為 6/17。</p>
<p>註：以下所提及之薪水 N 為我新訓時期某個做了十多年的班長當時月薪 (k)。</p>
<p>2021.04 更新:<br>
2 年過去了，也換了份工作，在此揭露已過時的上述薪資 N 為 48k</p>
<p><strong>畢業前的快速面試</strong></p>
<ol>
<li><a href="#1pro360">PRO360 達人網</a></li>
<li><a href="#accupass2">活動通</a></li>
</ol>
<p><strong>退伍後的面試 (有拿到 offer)</strong></p>
<ol start="3">
<li><a href="#3qnap">QNAP</a></li>
<li><a href="#logic4">雷技</a></li>
<li><a href="#5yahoo">Yahoo</a></li>
<li><a href="#6synology">Synology</a></li>
</ol>
<p><strong>退伍後的面試 (沒拿到 offer)</strong></p>
<ol start="7">
<li><a href="#delta7">台達電 (台達研究院)</a></li>
<li><a href="#817media">17 Media</a></li>
<li><a href="#storm9">風傳媒</a></li>
<li><a href="#trendmicro10">趨勢 x2</a></li>
<li><a href="#ljit11">利頡</a></li>
<li><a href="#bridgewell12">宇匯</a></li>
<li><a href="#advantech13">研華</a></li>
</ol>
<h3 id="1pro360">1. PRO360 達人網</h3>
<p><strong>Yourator 快速面試</strong></p>
<p>在 Yourator 快速面試活動中獲得面試機會，是當天兩場面試的第一場，也是人生的第一場，怕。</p>
<p>是間新創公司，服務內容就不贅述，面試過程大概 15 分鐘，面對的是一位 lead，過程中滿輕鬆的，主要就是自我介紹、講解自己的專案 (面試官説事前有先玩過我的作品，覺得用心)，然後問一些 React 相關的問題以及個人專案用 React 的架構設計如何實作，最後就是提問時間。</p>
<p>由於是快速面試所以沒有被問到太多問題，而最後我也有主動提及還有四個月的兵役需要，所以猜是因此沒有下文。</p>
<p>因為是第一次面試為求慎重所以穿了正裝到場，結果發現整個場子只有 3 位左右的面試者著正裝，於是之後面試穿著都走休閒路線XD</p>
<p>結果：無聲卡</p>
<h3 id="accupass2">2. 活動通</h3>
<p><strong>Yourator 快速面試</strong></p>
<p>一樣是在 Yourator 快速面試活動中獲得的面試機會。</p>
<p><strong>快速面試</strong><br>
在快速面試的場地，時間也大約是 15 分鐘，面試官是一位 PM 與一位 HR，照樣是一套自我介紹、實習經歷、個人專案介紹的起手式。</p>
<p>因為時間因素也沒被問到太多問題，大概都是些基本的 js、React、React 跟 Vue 的差異，其中印象最深刻的問題是「做過最瘋狂的事是什麼」。</p>
<p><strong>on-site interview</strong><br>
本來不抱持著什麼希望然後就接到的 HR 打來的電話跟我約 on-site 面試。</p>
<p>到現場後 HR 先來了份像是性向測驗的 google 表單，然後再填一張個人資料表包含期望薪資，接著開始面試。</p>
<p>在面試的前/中有一份紙筆測驗，但我忘記是哪個時間點了XD<br>
筆試是一張紙共 5 題左右，考的題目滿簡單的，像是寫出 for 迴圈裡 setTimeout 去印出 index 的結果以及做字元轉換 (<code>AABBACDC</code> =&gt; <code>WWXXWYZY</code> 的概念)。</p>
<p>面試官是一位 PM、一位前端工程師、一位後端 (好像是) 遠端參與，問題包含 SEO、多國語系處理經驗、GA 使用經驗、過往工作的團隊合作經驗 &amp; 角色分配 &amp; 專案運作方式、技術學習的經驗與方法以及針對實習專案提出問題等。</p>
<p>在整個面試過程中覺得相當有機會拿到 offer，但還是因為兵役問題 HR 表示再聯繫。</p>
<p><strong>phone interview</strong><br>
我很聽話的有「再聯繫」，於是退伍的前一個月 HR 來信告知仍有前端的職缺，詢問我的意願與期望薪資，在我回覆後 HR 表示要再請顧問與我 concall。</p>
<p>面試官是活動通的顧問並任職於 Appier 的資深前端工程師，主要是協助活動通的技術問題與 code review 的部分。</p>
<p>面試過程大約一小時，一樣是先自我介紹然後開始問問題，包含：</p>
<ul>
<li>如何在有限制大小的元素內用 scrollbar 來顯示內容</li>
<li>如何隱藏 scrollbar</li>
<li>解釋 flex</li>
<li>flex-grow, flex-shrink, flex-basis</li>
<li>css grid</li>
<li>mongoDB 使用經驗、為何選擇 mongoDB or NoSQL</li>
<li>NoSQL 與 RDBMS 比較</li>
<li>React 生命週期 &amp; 16.3 生命週期改變的原因</li>
<li>React hooks</li>
<li>React 優缺點</li>
<li>ES6 語法相關問題</li>
<li>array map &amp; reduce</li>
<li>closure</li>
<li>curry</li>
</ul>
<p>結束後又跟 HR 來信討論了一兩個禮拜，然而我開的薪資無法被接受，又 HR 表示可以給到 junior 的頂，但都沒有給出明確數字，最終無法達到共識故婉拒。</p>
<p>結果：婉拒</p>
<h3 id="3qnap">3. QNAP</h3>
<p><strong>104 投遞</strong></p>
<p>當時在投 QNAP 的時候看到職缺列表總共有 14 個前端職缺差點傻住，認真的從中挑了 2 個工作內容跟技術比較符合期待的投遞，然後獲得其中一個的面試邀約，地點在汐止的總部。</p>
<p>是一場費時的面試，總共花了四個多小時才結束，包含筆試、技術團隊面試、主管面試、白板題、人資，其中有不少時間是花費在等待下一關的面試官到來。</p>
<p>紙筆測驗限時一個半小時 (應該是，有點忘了)，有性向測驗、智力測驗 (我覺得滿難的，可能我智商過低QQ) 和一份超級簡單的 js css 考題，寫完後就到櫃檯交卷然後等待下一階段的面試官到來。</p>
<p>技術面試的部分來了三位看起來跟我年紀差不多的工程師，兩位前端一位後端，面試官人非常好，一直很怕在提問的時候為難了面試者，也是很用心的有先玩過我的作品、看過 code。首先先是面試官們介紹這個部門主要在做什麼以及這個職缺會需要負責什麼部分，接著自我介紹後就開始問一些像 React 生命週期、<code>this.setState()</code> 跟 <code>this.state.a = 'something'</code> 的差異、簡易的 css 排版、水平/垂直置中、styled-components 利弊、Redux 概念、過往專案的問題，在問答過程中若沒有答的很完美面試官也會順便做補充。</p>
<p>再來換部門主管進來介紹 &amp; 小聊一分鐘，然後就被帶到一間有白板的會議室等待，而後進來了一位我也不知道是誰反正就是負責來考白板題的面試官，題目是 <a href="https://leetcode.com/problems/valid-parentheses/">leetcode 第 20 題</a>。由於沒有白板題經驗，所以沒跟面試官有什麼互動就開始動筆了，完成後面試官表示「好像沒什麼問題」然後拍張照就走了。</p>
<p>最後就是跟 HR 聊天然後收工回家。</p>
<p>結果：面試後 2 ~ 3 天 offer get，(N + 2) * 17 (HR 表示 17 是表現普普通通的人能拿到的數字)</p>
<h3 id="logic4">4. 雷技</h3>
<p><strong>104 投遞</strong></p>
<p>位在南軟的接案公司，同時也有開發自己的產品。</p>
<p>收到面試邀約的同時得知要先寫作業，用 Angular 做出一個跟 <a href="https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_todo">這個</a> 一模一樣的頁面，在此時才知道這邊可能是以 Angular 做主要開發工具，但我還是接受了這個挑戰邊嗑官方文件邊刻 TODO List。</p>
<p>到了現場先由 HR 帶去會議室做紙筆測驗，題目主要是考 ES6 特性如：</p>
<ul>
<li>var, let, const</li>
<li>spread operator</li>
<li>arrow function 跟 this</li>
<li>hoist, TDZ</li>
</ul>
<p>其他還有像是在 Promise 內外呼叫 console.log() 判斷印出的先後順序，另外有 4~5 提的加分題都是 RxJS，不過我技能樹還沒點到那邊所以都留白。再來還有兩題英文測驗，主要是能夠解讀客戶所寄來的英文 email，再依題目指示以英文撰寫回信內容。</p>
<p>接著則是跟一位工程師與一位主管進行面談，過程中不需要自我介紹，直接從 TODO List 的作業開始討論起，關於架構或是寫法有疑慮的地方，以及如果要透過 TODO List 的概念延伸成記帳系統要怎麼實作，又若要加入 undo、redo 功能會怎麼實作。其他問題則像是 Redux 概念、過往專案及實習經驗、最有成就感的專案、對這份工作的期望，再換面試官介紹團隊與開發項目。</p>
<p>技術面試完後換總經理 (沒聽錯的話) 來聊天，人非常的親切，這個階段主要在整個公司的架構、營運、發展以及談薪資，整個過程都有說有笑，還看著我在 104 上填的對低期望薪資開完笑的說前端是不是都很敢開薪水，但還是説試用期後可以達到這樣的水準，最後表示會在兩天內給予回覆。</p>
<p>整個過程大概花兩個小時，HR、面試官、總經理人都很好，面試體驗相當不錯，也是一家算敢給的公司，唯一缺點就是辦公室感覺略小有點擁擠，若是不排斥接案且有興趣往全端發展的話可以來投投看。</p>
<p>結果：面試隔天 offer get，(N + 4) * 13 + 績效 + 專案獎金，試用期後 N + 7</p>
<h3 id="5yahoo">5. Yahoo</h3>
<p><strong>主動邀約</strong></p>
<p>還沒退伍的時候就有看到 Yahoo 的職缺，並且對於福利的部分相當心動，但因為覺得自己準備還不夠、面試經驗還太少而且尚未完成英文履歷所以就還沒投遞。結果很幸運的在後來收到了面試邀約的信，此次職缺是電商 team，面試包含 phone interview 及 on-site interview。</p>
<p><strong>phone interview</strong><br>
大約一小時的時間，一開始先簡短自我介紹，然後面試官會給一個 CodeSandbox 的連結，裡面有兩個用 react 做出來的頁面。第一個頁面是列出了數個題目，需要口頭回答或是直接改 code 修改頁面中的元素，而 css 的部分都是使用 styled-components，題目主要是一些 css、事件觸發、前端安全相關的。</p>
<p>第二個頁面是一個樣式不完整的商品卡片，就是一個 container 中會有商品名稱、照片、資訊、價格、按鈕，需要修改 css 以及加入 click 事件與修改 state 等。</p>
<p>coding 的過程都可以自由 google 或是跟面試官討論，氣氛滿輕鬆的，最後則是跟面試官小聊以及提問時間，然後我說我等 on-site 的時候再一起問，面試官回了「哦～這麼有把握會過就對了」，我才意識到好像有這麼一回事XD，不過如果問了一堆結果沒過好像也沒什麼用。</p>
<p><strong>on-site interview</strong><br>
在面試前就有先提醒會花掉整個下午的時間，過程包含了 HR、技術、主管三個階段，並且需要自備筆電因為需要 demo 及 coding。</p>
<p>一開始先由 HR 帶我大略參觀一下有吃不完的食物和飲料的地方，然後被帶到會議室做基本的訪談，只能說 HR 超親切然後一直要我不要緊張，過程就像在聊天討論一些過往經歷、公司福利、薪資結構等等。</p>
<p>下個階段進來了四位工程師，其中一位是 phone interview 的面試官，而接下來的面試流程也都是由這位面試官作主導，直接不囉唆開始分享螢幕畫面 demo 自己的作品，之後就針對這些作品做提問。在處理完作品後就由面試官輪流出題，包含口頭回答以及實作程式，主要在考對 JS、React、styled-components 的熟悉度，另外也有幾題演算法、前端安全相關的題目。</p>
<p>最後一階段是由 phone interview 的面試官與另兩位主管進行面試，整個過程比較像是在聊天然後了解我的過往經歷以及部門概述，中間也穿插了一些問題像 Restful api、HTTP status code、React hooks、JSON v.s. XML 等。</p>
<p>此次面試花了四個多小時，但過程很輕鬆沒什麼壓力，反而是都帶著愉悅的心情，所以就沒有覺得面得很累或燒腦。</p>
<p>結果：面試後 2 天 offer get，(N + 21) * 13 + 績效 + RSU</p>
<h3 id="6synology">6. Synology</h3>
<p><strong>104 主動邀約</strong></p>
<p>在拿到 QNAP 的 offer 後就收到 Synology 的面試邀約，<s>這是巧合嗎？我不這麼認為</s>。</p>
<p>因為號稱是白板題大魔王，面試前特別緊張，也去惡補了些資料結構、演算法、時間複雜度的題目，希望不要被電得太慘。</p>
<p>公司位在板橋亞東醫院旁的台北遠東通訊園區，面試共五個階段，一開始會先被帶到小會議室填寫基本資料與筆試，內容以 css 為主，再加上一些簡單的 HTML、JS 題以及多國語系、過去工作經驗的題目，到後來才知道這是設計部門難怪這麼重 css。第二階段就由 HR 進行訪談，但關於薪資的部分是直接跟最後一關的部門主管談，不過 HR 的說法害我一直以為下一關就是主管，結果進來的都不像主管，搞得我好亂R。</p>
<p>第三階段的面試官是一位工程師，帶著一本筆記本開始逐一提問，但面試官的手抖得像他才是面試者(?!)，問題也是圍繞在 css、多國語系處理，都是一問一答，不太有問題延伸或反問的狀況。</p>
<p>第四階段是由一位前端與一位後端負責，先是自我介紹再換面試官介紹部門及職缺接著換我提問，過程中面試官沒有多問一些作品、工作經歷、技術的問題。然後就是期待已久的白板題，不過只有考一題 sort，再來就由面試官問一些實際應用會遇到的問題，像是在手機上要用什麼方式呈現很多欄位的表格、實作多國語系時候可能不同語言的文字長度會差很多則頁面要怎麼設計、如何實作如網路銀行頁面的「300 秒後登出」並能同步其他分頁。</p>
<p>最後一關終於等到了部門主管，主要就是在談薪資的部分，主管看了我在一開始的表單上填了期望月薪 N + 5 就開始介紹薪資結構然後說明這邊月薪都是比較低的，接著開了個 N - 3 的數字給我並表示完全可以達到我的期望年薪，所以我也就欣然接受了。不過主管也表明這邊是設計部門有許多追求完美的設計師，在頁面排版上會被叼得很精，以及在開發過程中可能會有很多「等待」或是與設計師大量往來的狀況，另外是主管好像也是走設計的，從對話中感覺分不太清前端跟後端呢QQ</p>
<p>最後的最後又給了份作業，附有 spec 跟一堆圖片，要做頁面的排版。</p>
<p>面試時間大約三小時，面試強度不像爬文所看到的那樣可怕，可能因為是設計部門的關係，另外面試官也透露在這幾乎不加班。</p>
<p>結果：面試當場口頭 offer，(N - 3) * 20 (部門主管説年薪這個數字沒什麼問題，算了一下至少 20)，雖然月薪很低，但可預期的年薪應該是有拿到的 offer 中最高的。</p>
<p>不過績效的部分拆在隔年四季發放，分成 40%、20%、20%、20%。</p>
<h3 id="delta7">7. 台達電 (台達研究院)</h3>
<p><strong>104 投遞</strong></p>
<p>透過 104 投履歷後兩天左右就接到面試邀約，地點在內科法拉利對面。面試一開始由 HR 帶到小會議室填基本資料跟期望薪資，然後聊一些人格特質、過去經歷的部分，接著就換技術面試。</p>
<p>面試官是兩位前端，看起來都很年輕，一樣先是自我介紹然後開始輪流問問題，主要是問 React 相關如生命週期等、列舉 ES6 有哪些新功能(語法)、討論過去實習的開發經驗。兩位面試官也很用心的有先玩過我的作品、看過 code，就順便討論作品的架構、細節，然後要我 demo 一個有做 RWD 的作品。</p>
<p>總共花了約一個小時，整個過程都聊的很和諧，並告知若有通過會有第二次面試。</p>
<p>結果：無聲卡</p>
<h3 id="817media">8. 17 Media</h3>
<p><strong>f2etw 投遞</strong></p>
<p>很早就有在 f2etw 上看到 17 的職缺，但覺得自己實力不夠所以遲遲沒有投，可是 104 丟了一堆都還沒有反應只好硬著頭皮先投個 17 了，結果當天就得到面試邀約的回覆。</p>
<p>在面試前 HR 會先寄人事資料表來填寫再於當場簽名，接著就由前端主管來進行面試。總共花了近 5 個半小時包含一份免費的便當當午餐，在技術的面試部分都只有前端主管一人負責。</p>
<p>一開始面試官會先詳述此職缺的背景、內容等並告知面試流程且便當已經訂好了，接著換我自我介紹然後就進行 live coding，會是由面試官提供一台 macbook 做使用，在 30 分鐘內解完題目，且重點是程式的可讀性。這次的題目是輸入一 number 輸出三位一逗號的 string (<code>123456</code> =&gt; <code>'123,456'</code>)，解完後就如同其他心得文中看到的一樣面試官會細心的一起討論解法、邏輯、演算法、可讀性，會針對有疑慮的地方再進行改善。</p>
<p>接著則是 code review，這邊面試官打開一支 JS 給我要我找出裡面需要改善的地方，大致是：</p>
<ul>
<li>變數命名</li>
<li>全域變數</li>
<li><code>if (a = 1) {}</code></li>
<li>function 回傳格式不可預期</li>
<li><code>if else if</code> 語法</li>
<li>多餘判斷式</li>
<li>架構設計</li>
</ul>
<p>這邊可以是邊看 code 邊回答或是先看完再回答，面試官一樣會一起討論每個回答的理由，或是可能有其他種更好的做法。</p>
<p>午餐的部分在辦公室的公共空間跟前端團隊一起用餐，順便聊一些比較輕鬆的問題。個人覺得有免費午餐跟飲料機是很誘人的福利R。</p>
<p>下午場則繼續技術問答，主要是問對於 this、closure、prototype chain、scope (var, let, const) 的了解程度以及效能問題，再穿插著一些非技術問題像是自我人格特質描述、期望的工作環境、工作目標、特別排斥的工作狀況，為了讓面試者能更了解 17 的環境是否與期待相符。</p>
<p>最後就換 HR 一連串的福利介紹、背景 &amp; 人格調查、提供期望薪資的部分，並表示會在兩個禮拜內給予回覆。</p>
<p>結果：面試後 1.5 週收到感謝信</p>
<p>在收到感謝信的隔天 17 就發生了大規模的人事異動，而此職缺的狀態暫停招募(而非已招到人)。然而面試過才發現原來 17 規模這麼大，非常大的開放式辦公室，電梯門口還有人高馬大的保全，工程團隊就 80 逾人，其中光前端就 21 人，但這已是人事異動前的數據了。</p>
<h3 id="storm9">9. 風傳媒</h3>
<p><strong>hunter 提供</strong></p>
<p>在內科洲子街，由 hunter 安排的面試機會，整個面試過程都是跟一位工程師及 CTO 互動，一樣是先自我介紹然後問問題，大致如下</p>
<ul>
<li>論文內容、架構</li>
<li>近期對前端的趨勢觀察</li>
<li>近期所學的技術</li>
<li>何謂 PWA</li>
<li>是否知道 polymer</li>
<li>為何使用 React 開發專案</li>
<li>實習經驗、專案</li>
<li>何謂 CORS</li>
<li>何謂 XSS</li>
<li>何謂 CSRF</li>
<li>何謂 Restful API</li>
<li>何謂 Redux</li>
<li>何謂 GraphQL</li>
<li>何謂 JSONP</li>
<li>HTML element id &amp; class 差異</li>
<li>以 id or class 選取 element 的效能差異</li>
</ul>
<p>不過對這邊而言前端開發的需求只是去少量的維護官網，然後會希望能跨足 React Native 以及後端開發，也表示可以漸進學習慢慢增加非前端的項目，但我仍然是以「前端工程師」的角度談薪資，所以我想應該不會有人會開這種薪水聘一個半殘的全端。事後 hunter 也表示若有通過面試通常會告知有作業或二面的部分。</p>
<p>結果：無聲卡</p>
<h3 id="trendmicro10">10. 趨勢</h3>
<p><strong>104 主動邀約</strong></p>
<p>其實本來是透過 104 投遞 A 單位的前端缺可是遲遲沒有下文，結果某天收到 HR 來信邀約面試後端職缺，但全職後端我實在無法勝任，於是回覆婉拒並詢問是否有相關前端職缺，然後就收到 B 單位的前端面試邀約了。</p>
<p>前端職缺面試前不用做 codility 測驗但需要寫一個作業如 <a href="https://imgur.com/3BgXtRl">此</a>，簡單來說就是要依照所提供的 spec 做出一個 datepicker component，然後附上文件，且要支援 IE11，另外若有處理 RWD 或不使用 create-react-app 這類工具則有加分。</p>
<p>到了現場後被 HR 帶去小會議室做紙筆測驗，然後再此時被告知待會有 B 及 C 兩個單位的面試。筆試的部分滿簡單的，考的是 js、css 的基本概念以及 ES6 的特性。</p>
<p>第一個 team 的面試官是一位主管一位前端，而第二個 team 是 TIC (luwak)，面試官是一位主管與兩位前端，TIC 的這場面試應該是我所有面試經驗中最硬然後被電最慘的一場，兩個 team 的問題統整大致如下：</p>
<ul>
<li>如何不用 <code>!important</code> 覆寫原有樣式</li>
<li>論文內容</li>
<li>在過去專案中遇到最大的困難，如何解決</li>
<li>Redux</li>
<li>React 優缺點</li>
<li>React 生命週期</li>
<li>過往專案從 jQuery 重構成 React 有什麼好處</li>
<li>說服面試官從 Angular 7 轉跳到 React</li>
<li>本來要問 Promise 但面試官說我應該不會所以沒問 (?!</li>
<li>在過往團隊中遇到不合理的需求要怎麼解決，詳述當時狀況</li>
<li>何謂 firebase，了解得多深 (因為我有提到專案有用到 firebase)</li>
<li>前端安全性問題，XSS 之類的</li>
</ul>
<p>最後就是 HR 來講解福利、薪資結構然後問期望薪資跟比較喜歡哪個團隊，整個面試過程大概花了兩個半小時。</p>
<p>結果：面試後 1.5 週收到感謝信</p>
<h3 id="ljit11">11. 利頡</h3>
<p><strong>104 主動邀約</strong></p>
<p>直接講在前頭，這間的面試體驗是所有經驗中最差的，但很推薦來面試針對自己在比較原理層面的知識做健檢。至於原因則是面試內容很死，像在期中考考名詞解釋一樣，而其中比較活得題目卻像在幫他們寫作業，因為是他們正面對到的客戶需求。</p>
<p>這是一間做接案的新創，其實本來有打算主動投遞，就在我把它記錄到我的已投遞清單後就忘了按下應徵按鈕，結果一陣子後收到邀約通知害我愣了一下。</p>
<p>面試只有一關，由前端主管 + 後端主管 + PM + 一位從頭到尾都沒有出聲的工程師進行面試，PM 負責面試流程與薪資福利的部分以及一些通常是 HR 在問的問題，問題的部分都是由前端主管與後端主管提出。一開始一樣自我介紹，而當我在介紹個人專案的部分就被打斷並說待會會實際 Dome 讓我很期待，但到最後還是沒有給時間 Demo。</p>
<p>首先前端主管問說有沒有過去實習、工讀的專案可以 Demo，接著就開始問些名詞解釋，如：</p>
<ul>
<li>this</li>
<li>closure</li>
<li>hoist</li>
<li>event loop</li>
<li>bind, call, apply</li>
<li>scope (var, let, const)</li>
<li>stack, 舉出以 stack 實作的案例</li>
<li>queue, 舉出以 queue 實作的案例</li>
<li>Map, Set</li>
<li>Restful api</li>
<li>cookie, session</li>
<li>時間複雜度</li>
<li>Design pattern</li>
<li>HTTP stateless</li>
<li>前端如何縮短呼叫 API 所花費的時間</li>
</ul>
<p>中間穿插了一題紙筆測驗，要將原本的 code 重構並增加通用性，且限時五分鐘。系統需求是計算機功能 (僅處理 operand operator operand 的算式)，而題目的 code 是透過 switch case 去判斷 operator，但日後客戶會提供上百種非正規的 operator，依此條件重構。</p>
<p>另外一題則是考 pass by reference 的概念，題目大致像這樣</p>
<pre><code class="language-javascript">let a = { a: 1 };
let b = 1;
let c = { a: 1 };
let d = { a: 1 };
function change(a, b, c, d) {
    a.a = 2;
    b = 3;
    var c = { a: 100 };
    d = { a: 999 };
}

change(a, b, c, d);
console.log(a);
console.log(b);
console.log(c);
console.log(d);
</code></pre>
<p>過程中面試官也都很友善，對於回答不出來的問題大多也會給予解釋或線索，可以回家再好好研究。</p>
<p>結果：面試後 2 週收到感謝信</p>
<h3 id="bridgewell12">12. 宇匯</h3>
<p><strong>主動投遞 + 內推</strong></p>
<p>由朋友推薦然後自行投遞履歷給用人主管，在一開始就遇到了認知落差，主管要我看過 104 的職缺內容且認定我會看到其中「完成 <a href="https://github.com/bridgewell/Jobs/blob/master/frontend/hw0.md">hw0</a> 並回傳」而開始寫作業，但我以為那是求職者透過 104 投遞履歷的流程所以就略過了，直到過了一個禮拜還沒有回音我才意識到了什麼。</p>
<p>這裡的面試流程相當的特別，首先繳交 hw0 後主管們覺得有哪裡回答得不好或有改空間會被要求再回答一次，接著就被加到一個面試用的 slack channel，而之後的流程包含了線上 coding 測驗、作業、現場面試與程式實作、與 CEO 聊天。</p>
<p>線上 coding 測驗的部分是透過 slack 分享畫面的方式進行，總共三題，分別是考</p>
<ul>
<li>讓同個 function new 兩個 instance 並有相同的 reference</li>
<li>使用 native javascript 操作 DOM</li>
<li>給一個數字陣列與一數字 k，找出陣列中有幾對數字相差為 k</li>
</ul>
<p>另外只能使用 ES5，且會要求時間複雜度，過程中氣氛非常的自在，遇到問題可自由 google 或與面試官討論。</p>
<p>然後...就沒有然後了，因為已拿到滿意的 offer。不過滿推這間的，面試的感覺很舒服，起薪也算不錯高 (55k+)，另外據說是沒在加班的而且似乎充滿了強者，至少在裡面的朋友都很強 &lt;(_ _)&gt; 。</p>
<p>不過缺點是面試流程拖的很長，有興趣的話可以早點丟履歷。</p>
<p>結果：中離</p>
<h3 id="advantech13">13. 研華</h3>
<p><strong>104 投遞</strong></p>
<p>投了近一個月才收到面試通知，不過面試前就收到滿意的 offer 惹。</p>
<hr>
<h2 id="preparation">面試準備</h2>
<p><strong>你各位有空就把單戰拿出來背啊，還發呆啊</strong><br>
我在退伍後的第五天開啟了面試的旅程，為了早點找到工作上工領錢所以不像有些人會在退伍後先玩或先準備個一個月再開始找工作，因此我只剩在軍中的時間同時要吸收新知和努力讓腦袋不要退化。</p>
<p>可是雖小如我，新訓時沒得用手機，二階段時一週只一次使用手機的時間，所以不可能靠一些現代的方式來複習&amp;準備面試，但從新訓結束後每天醒著的時間大概有 1/4 ~ 1/2 的時間在發呆，剩餘的時間都在做跟昨天一樣的事，想想再這樣下去不行，於是造就了平時沒有讀書習慣的我居然讀完了四本書 (歐萊禮 JS、網頁、css、UIUX 相關的書 &amp; clean code)。</p>
<p>放假的話就是吸收一些新知、努力跟上陽間的趨勢，然後很重要的是找東西來寫，不論是 leetcode 或改改自己的專案，維持手感。</p>
<p><strong>Leetcode</strong><br>
不一定要刷，但如果你手邊沒有正在進行的專案，可以刷刷 leetcode 來維持手感，就算都只刷 easy 的也好。</p>
<p><strong>考古</strong><br>
面試心得文、考古題必須爬過，除了面試題目很容易命中，也可以先大略了解面試流程，讓自己對整場面試更有把握、信心，然後順便蒐集題目當準備的內容。</p>
<p><strong>不慌不忙</strong><br>
我習慣在面試前一小時到離面試地點最近的超商休息、悠閒吃早餐午餐然後順一下待會要講到的內容與題目的準備，並在面試前十分鐘抵達現場。</p>
<p><strong>主動出擊</strong><br>
自己習慣是把所有學經歷、擅長技術、實習經驗及專案、個人專案介紹全部在自我介紹的階段全部講完，就算面試官只是叫你「簡短」的介紹自己或是說只給你五分鐘，帶著自信的眼神與口條把專長與優勢展示出來，以免面試官沒有問到可以展現自己能力的部分。</p>
<p><strong>不要講沒把握的東西</strong><br>
在面試中主動提及的任何內容都必須是有深刻理解的，如擅長技術、使用過的工具、開發過的專案等。</p>
<p><strong>累積題目</strong><br>
把每場面試所遇到的題目都記錄下來成為下一場面試的準備內容。</p>
<hr>
<h2 id="question">面試問題彙整</h2>
<h3 id>非技術類</h3>
<ul>
<li>你上來台北面試那要住哪裡</li>
<li>團隊開發經驗</li>
<li>過往開發上遇到不合理的需求如何處理</li>
<li>過往專案的團隊人數、分別是什麼角色、自己是擔任什麼角色</li>
<li>有沒有與設計師合作的經驗</li>
<li>選擇工作的條件與排序</li>
<li>對這份工作有什麼期望或規劃</li>
<li>最有成就感的專案</li>
<li>開發上遇過的困難，如何解決</li>
<li>過往如何學習一個新技術</li>
<li>形容一下你自己</li>
<li>別人都是怎麼形容你的</li>
<li>自己的優缺點</li>
<li>過往開發專案時團隊如何運作與分工</li>
<li>最近學了什麼技術</li>
</ul>
<h3 id>技術類</h3>
<p><strong>JS</strong></p>
<ul>
<li>ES6 feature</li>
<li>this</li>
<li>closure</li>
<li>hoist</li>
<li>event loop</li>
<li>Promise</li>
<li>performance</li>
</ul>
<p><strong>CSS</strong></p>
<ul>
<li>box model</li>
<li>selector priority</li>
<li>float</li>
<li>flex</li>
<li>css grid</li>
<li>media query</li>
<li>inline, block, inline-block</li>
</ul>
<p><strong>Web</strong></p>
<ul>
<li>event bubbling</li>
<li>SEO</li>
<li>browser rendering</li>
<li>RWD</li>
<li>CORS, XSS, CSRF</li>
<li>cookie, session</li>
<li>restful</li>
<li>HTTP status code</li>
</ul>
<p><strong>React</strong></p>
<ul>
<li>Pros &amp; Cons</li>
<li>compare with Vue / Angular / jQuery</li>
<li>lifecycle</li>
<li>Redux</li>
<li>styled-components</li>
</ul>
<hr>
<h2 id="summary">結論</h2>
<p>在一個月面試了十幾個職缺說多不多，但心滿累的。面試時間安排上都是以面一休一為原則，這樣有比較多時間可以休息並充分準備下一場的面試，也避免一天安排兩場結果第一場延誤到第二場時間的狀況。</p>
<p><strong>運氣重於實力</strong><br>
就像有興趣但還沒投履歷的公司突然找上門，或是可能在某場面試的表現意外的優異然後就拿到 offer 之類的，請把握好每次面試的機會並做足準備，且不要對面試結果得失心太重。</p>
<p><strong>感謝發感謝信給你的公司</strong><br>
沒有昨天的感謝信，沒有今天的 offer。<br>
基本上前期的面試都算是在累積題目跟經驗，拿到感謝信是常有的事，就算有拿到 offer 但不夠完美的都可以考慮放掉，而當你把自己後路都斷了也會更認真看待及準備後續的面試。</p>
<p><strong>不要投沒興趣的職缺</strong><br>
有些人會建議多投履歷增加面試經驗，但我覺得光奔波面試有興趣的職缺就夠累了，如果還不小心拿到 offer 然後腦波弱就尷尬了，所以請把心思放在準備下一場你有興趣的職缺面試。</p>
<p><strong>碩論做什麼好像不一定很重要</strong><br>
印象中只有兩三場左右的面試有問到關於論文的部分，而且重點也主要在 React Native 上 (我的碩論是以 RN 實作)，不過可能也是因為我幾乎沒有主動提及論文的部分，就如同上面提到的「不要講沒把握的東西」。</p>
<hr>
<p>最後感謝你的觀看，希望有幫助到對前端職缺有興趣的你。<br>
(本文同步發表於 <a href="https://medium.com/@z3388638/2019-%E6%96%B0%E9%AE%AE%E4%BA%BA%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%B8%AB%E9%9D%A2%E8%A9%A6%E5%85%A8%E7%B4%80%E9%8C%84-c559b5cdf91c">Medium</a>)</p>
<hr>
<p>其他前端文章</p>
<ul>
<li><a href="https://2yc.medium.com/b183b099636a">JavaScript: Clipboard API | 不用監聽鍵盤事件，還能複製非文字項目</a></li>
<li><a href="https://z3388638.medium.com/d177a38467dd">JavaScript: Proxy 與 localStorage</a></li>
<li><a href="https://z3388638.medium.com/4d8312991954">z-index 與 stacking context</a></li>
<li><a href="http://z3388638.medium.com/9453bb5405b3">[筆記] JavaScript: document.referrer</a></li>
<li><a href="http://z3388638.medium.com/c9574c8a93e5">[筆記] JavaScript History API</a></li>
<li><a href="https://z3388638.medium.com/7b3374a8dd7e">2020 失敗的前端工程師面試全記錄</a></li>
<li><a href="https://z3388638.medium.com/a35fd838f1ae">筆記一下 CSS collapsing margins 重疊問題</a></li>
<li><a href="https://medium.com/@z3388638/c324d305ac15">Svelte 初探筆記 (上)</a></li>
<li><a href="https://medium.com/@z3388638/648e160aab6a">用 CakeResume 寫履歷的新姿勢</a></li>
<li><a href="http://medium.com/@z3388638/b3089e13ed8f">Carousel 輪播、CSS grid 與 CSS scroll-snap | 用 React 造輪子</a></li>
<li><a href="https://medium.com/@z3388638/cccd770aa1a0">webpack 打包的 node modules 版本不正確?!</a></li>
<li><a href="http://medium.com/@z3388638/74e292e5545b">Userscript：用 React 升級你的 Dcard，喜歡圖片蓋樓文的有福了</a></li>
<li><a href="https://medium.com/@z3388638/%E5%A6%82%E4%BD%95%E9%87%9D%E5%B0%8D-contenteditable-%E5%85%83%E7%B4%A0%E5%81%9A%E7%B0%A1%E6%98%93-get-set-value-%E4%BB%A5-react-%E7%82%BA%E4%BE%8B-bbdf4d89c143">如何針對 contenteditable 元素做簡易 get/set value，以 React 為例</a></li>
<li><a href="https://medium.com/@z3388638/react-hooks-%E6%96%B0%E6%89%8B%E7%AD%86%E8%A8%98-8c9f1cccd142">React Hooks 新手筆記：</a></li>
<li><a href="https://medium.com/@z3388638/userscript-%E7%A2%97%E9%83%BD%E6%95%B2%E7%A0%B4%E4%BA%86%E9%82%84%E6%B2%92%E6%9C%89%E6%96%B0%E5%8A%9F%E8%83%BD-%E9%82%A3%E5%B0%B1%E8%87%AA%E5%B7%B1%E5%81%9A%E5%90%A7-c45a82a2e4eb">Userscript：碗都敲破了還沒有新功能，那就自己做吧！</a></li>
<li><a href="https://medium.com/p/recaptcha-v2-invisible-%E4%B8%8D%E7%94%A8%E5%86%8D%E6%8A%8A-%E6%88%91%E4%B8%8D%E6%98%AF%E6%A9%9F%E5%99%A8%E4%BA%BA-%E5%88%97%E5%85%A5%E9%A0%81%E9%9D%A2%E8%A8%AD%E8%A8%88%E8%80%83%E9%87%8F-2b83dbce03cb">reCAPTCHA v2 Invisible，不用再把「我不是機器人」列入頁面設計考量</a></li>
<li><a href="https://medium.com/@z3388638/%E4%BD%BF%E7%94%A8-json-ld-%E8%99%95%E7%90%86-seo-%E4%B8%A6%E8%AE%93-google-%E9%87%9D%E5%B0%8D%E4%B8%8D%E5%90%8C%E5%BD%A2%E5%BC%8F%E7%B6%B2%E7%AB%99%E5%81%9A%E7%8D%A8%E7%89%B9%E7%9A%84%E6%90%9C%E5%B0%8B%E7%B5%90%E6%9E%9C%E5%91%88%E7%8F%BE-9c74783c017a">使用 JSON-LD 處理 SEO，並讓 Google 針對不同形式網站做獨特的搜尋結果呈現</a></li>
<li><a href="https://medium.com/@z3388638/%E7%AD%86%E8%A8%98-%E4%BD%BF%E7%94%A8-css-grid-%E4%BE%86%E5%81%9A-rwd-%E6%8E%92%E7%89%88-9da109ba562a">[筆記] 使用 CSS Grid 來做 RWD 排版</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[如何將 GitHub Pages 套上個人網域及 Cloudflare SSL]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id>前言</h2>
<p>其實在一天以前，我沒買過網域，沒設定過 SSL，更別說深入了解什麼是 DNS (現在也還是不了解呢)。但反正我成功買了網域套在 GitHub Pages 上並使用 Cloudflare 讓他有綠綠的鎖，所以就順便紀錄、分享一下吧。</p>
<p>是說一切的起因都來自學長的一張 Gandi <code>.tw</code> 網域一年免費優惠序號。</p>
<h2 id>事前準備</h2>
<ol>
<li>建立 GitHub Pages</li>
<li>購買網域 (這邊以 Gandi 為例)</li>
<li>註冊 Cloudflare 帳號</li>
</ol>
<h2 id="githubpagecustomdomain">建立 GitHub Page 並設定 Custom domain</h2>
<p>簡單來說，首先你需要有一個任意名稱的 repo，或以 <code>{{yourAccount}}.github.io</code> 為名的 repo，然後進入 repo 頁面上方 Settings</p>]]></description><link>https://blog.moli.rocks/2018/07/11/how-to-set-custom-domain-and-cloudflare-ssl-to-github-pages/</link><guid isPermaLink="false">5b454f7c466c8e094f247b7c</guid><dc:creator><![CDATA[YY]]></dc:creator><pubDate>Wed, 11 Jul 2018 05:19:42 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2018/07/-----2018-07-11---2.12.56.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>前言</h2>
<img src="https://blog.moli.rocks/content/images/2018/07/-----2018-07-11---2.12.56.png" alt="如何將 GitHub Pages 套上個人網域及 Cloudflare SSL"><p>其實在一天以前，我沒買過網域，沒設定過 SSL，更別說深入了解什麼是 DNS (現在也還是不了解呢)。但反正我成功買了網域套在 GitHub Pages 上並使用 Cloudflare 讓他有綠綠的鎖，所以就順便紀錄、分享一下吧。</p>
<p>是說一切的起因都來自學長的一張 Gandi <code>.tw</code> 網域一年免費優惠序號。</p>
<h2 id>事前準備</h2>
<ol>
<li>建立 GitHub Pages</li>
<li>購買網域 (這邊以 Gandi 為例)</li>
<li>註冊 Cloudflare 帳號</li>
</ol>
<h2 id="githubpagecustomdomain">建立 GitHub Page 並設定 Custom domain</h2>
<p>簡單來說，首先你需要有一個任意名稱的 repo，或以 <code>{{yourAccount}}.github.io</code> 為名的 repo，然後進入 repo 頁面上方 Settings 並找到 GitHub Pages 區塊，在此可設定要將哪個 branch 設定為 GitHub Pages。</p>
<p>或者你可以直接在 repo 中加入 <code>gp-pages</code> branch，即會被預設為 GitHub Pages 的內容來源。</p>
<p>(詳細操作請參考: <a href="https://pages.github.com/">https://pages.github.com/</a>)</p>
<p>設定好後便可以在原本的 GitHub Pages 區塊找到 Custom domain 欄位，並填入你所購買的網域，如下圖：</p>
<p><img src="https://i.imgur.com/Kcuk48b.png" alt="如何將 GitHub Pages 套上個人網域及 Cloudflare SSL"></p>
<p>當你按下 Save 時，在你所選定的 branch 下會自動多出一個以你設定之域名為內容的 CNAME 檔案，好讓 GitHub 知道當你連上你的 GitHub Pages 時要導向哪裡。</p>
<p><img src="https://i.imgur.com/O4jK4Tc.png" alt="如何將 GitHub Pages 套上個人網域及 Cloudflare SSL"></p>
<h2 id>採買</h2>
<p>開始採購網域，然後就先放著。</p>
<h2 id="cloudflare">註冊 Cloudflare</h2>
<p>首先先有帳號，<br>
然後找到 Add site 並填入你所購買之域名，</p>
<p><img src="https://i.imgur.com/vnWAitX.png" alt="如何將 GitHub Pages 套上個人網域及 Cloudflare SSL"></p>
<p>接著在過程中你會需要選擇方案，選免費的即可，<br>
然後他會提供給你兩組 Cloudflare Nameservers，不小心錯過了沒關係，<br>
可以從管理頁面上方 DNS &gt; Cloudflare Nameservers 找回</p>
<p><img src="https://i.imgur.com/diFKhs8.png" alt="如何將 GitHub Pages 套上個人網域及 Cloudflare SSL"></p>
<p>再來你需要回到網域供應商將 nameservers 設定為 Cloudflare 所提供的兩組。</p>
<h2 id="gandinameservers">設定 Gandi nameservers</h2>
<p>管理介面 &gt; 域名 &gt; {{你的域名}} &gt; 名稱伺服器<br>
填入 Cloudflare 提供之 nameservers，如下圖：</p>
<p><img src="https://i.imgur.com/wdhFBP2.png" alt="如何將 GitHub Pages 套上個人網域及 Cloudflare SSL"></p>
<h2 id="cloudflaredns">設定 Cloudflare DNS</h2>
<p>接著回到 Cloudflare 管理介面 &gt; DNS，<br>
在這邊你會看到 Cloudflare 幫你抓來的域名供應商預設 DNS 設定，<br>
首先先刪除 Type 為 <code>A</code> 的設定，<br>
再加入 4 筆 Type 為 <code>A</code>、Name 為 <code>@</code>、IP 分別為 <code>185.199.108.153</code> <code>185.199.109.153</code> <code>185.199.110.153</code> <code>185.199.111.153</code> 的設定，如下圖：</p>
<p><img src="https://i.imgur.com/u07EEbu.png" alt="如何將 GitHub Pages 套上個人網域及 Cloudflare SSL"></p>
<p>然後就靜待 DNS 生效。</p>
<h2 id="cloudflaressl">設定 Cloudflare SSL</h2>
<p>進入 Cloudflare 管理介面上方 Crypto &gt; SSL，<br>
右邊下拉式選單選擇 Full。</p>
<p><img src="https://i.imgur.com/8cA4XSE.png" alt="如何將 GitHub Pages 套上個人網域及 Cloudflare SSL"></p>
<p>接著就，等待，基本上算大功告成了。</p>
<h3 id>參考資料</h3>
<ul>
<li><a href="https://help.github.com/articles/setting-up-an-apex-domain/">https://help.github.com/articles/setting-up-an-apex-domain/</a></li>
<li><a href="https://blog.cloudflare.com/secure-and-fast-github-pages-with-cloudflare/">https://blog.cloudflare.com/secure-and-fast-github-pages-with-cloudflare/</a></li>
<li><a href="https://blog.dmoon.tw/github-pages-custom-domain/index.html">https://blog.dmoon.tw/github-pages-custom-domain/index.html</a></li>
<li><a href="https://blog.chairco.me/posts/2017/06/Github.io%20Pages%20redirect%20to%20domain%20name%20and%20add%20HTTPS.html">https://blog.chairco.me/posts/2017/06/Github.io Pages redirect to domain name and add HTTPS.html</a></li>
<li><a href="https://blog.yang-hong-xin.com/github-pages-custom-domain-on-https-use-cloudflare/">https://blog.yang-hong-xin.com/github-pages-custom-domain-on-https-use-cloudflare/</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GitHub Student Developer Pack 申請]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id>前言</h2>
<p>GitHub 身爲全球最大男性交友平臺，你可能會在上面放許多大大小小專案讓其他人認識你，這些都是公開在整個網路上的，而有時候僱主並不希望程式碼公開，或是自己的一些<del>邪惡計劃怕被查水錶</del>，則可以將 Repository 設定爲 Private，不過這時候 GitHub 就要跟你收 $$ 了，如果你還是學生的話，別怕，快啓用 Student Developer Pack，無限個 Privete Repository 任你開。此外，也有許多合作廠商提供給學生免費的開發工具授權，通通透過 Student Developer Pack 一次搞定！ P.S. 個人私心喜歡 <a href="https://www.gitkraken.com/">GitKraken</a> 這個跨平臺的 Git GUI 工具。</p>
<h2 id>開始申請囉</h2>
<p>首先到 <a href="https://education.github.com/pack">這邊</a> 點擊 Get your pack，到填寫資料頁面</p>
<p><img src="https://blog.moli.rocks/content/images/2018/04/Screenshot-from-2018-04-08-22-10-00-1.png" alt="Screenshot-from-2018-04-08-22-10-00-1"></p>
<p>這邊請選擇你的學校信箱</p>]]></description><link>https://blog.moli.rocks/2018/04/08/github-student-developer-pack/</link><guid isPermaLink="false">5aca1cde1ff5e1247d0baa41</guid><dc:creator><![CDATA[JackKuo]]></dc:creator><pubDate>Sun, 08 Apr 2018 14:43:54 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2018/04/716f2ee6-e64b-11e5-9561-e10394c5b336-1200x630.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>前言</h2>
<img src="https://blog.moli.rocks/content/images/2018/04/716f2ee6-e64b-11e5-9561-e10394c5b336-1200x630.jpg" alt="GitHub Student Developer Pack 申請"><p>GitHub 身爲全球最大男性交友平臺，你可能會在上面放許多大大小小專案讓其他人認識你，這些都是公開在整個網路上的，而有時候僱主並不希望程式碼公開，或是自己的一些<del>邪惡計劃怕被查水錶</del>，則可以將 Repository 設定爲 Private，不過這時候 GitHub 就要跟你收 $$ 了，如果你還是學生的話，別怕，快啓用 Student Developer Pack，無限個 Privete Repository 任你開。此外，也有許多合作廠商提供給學生免費的開發工具授權，通通透過 Student Developer Pack 一次搞定！ P.S. 個人私心喜歡 <a href="https://www.gitkraken.com/">GitKraken</a> 這個跨平臺的 Git GUI 工具。</p>
<h2 id>開始申請囉</h2>
<p>首先到 <a href="https://education.github.com/pack">這邊</a> 點擊 Get your pack，到填寫資料頁面</p>
<p><img src="https://blog.moli.rocks/content/images/2018/04/Screenshot-from-2018-04-08-22-10-00-1.png" alt="GitHub Student Developer Pack 申請"></p>
<p>這邊請選擇你的學校信箱 <strong><aside class="warning">結尾要是 @ncnu.edu.tw ！！</aside></strong></p>
<p>不能是 @mail1.ncnu.edu.tw 這樣會核准失敗，如果沒有的話去新增一個吧～<br>
沒意外的話，驗證信會被學校的 NOPAM 檔垃圾信軟體過濾掉，請到 <a href="http://catcher2.ncnu.edu.tw/cgi-bin/mgwmdir/openwebmail.pl?logindomain=ncnu.edu.tw">這邊</a> 登入去找找你遺失的信件<br>
帳號爲 <strong>s學號，密碼則是你的密碼</strong></p>
<p>搞定後 Student Developer Pack 頁面其他資料就照實填寫，plan 簡短填一下說想要試用看看 GiuHub 或是學習專案開發之類的都行，記得用英文寫。這邊給個英文校名方便你複製貼上 <code>National Chi Nan University</code></p>
<h2 id>大功告成</h2>
<p>幾小時內你應該會收到信告知你有沒有通過審核，想當初我申請了四次後才知道是信箱問題一直無法通過 ORZ</p>
<p>現在，你可以盡情開 Private Repository 啦～ (<em>￣▽￣)/‧☆</em>&quot;`'<em>-.,_,.-</em>'`&quot;*-.,_☆</p>
<p>題外話，學生也可以去申請 JetBrains 公司的學生方案，如此 PhpStorm, PyCharm 等軟體也可以免費使用，我自己在 Mac 及 Ubuntu 上面都有裝，所以應該不限一臺機器而已。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[KKStream SQA Intern 心得分享]]></title><description><![CDATA[在 KKStream 實習了半年左右，分享一下半年下來的心得及想法，回想當初真的是很意外的緣分。這篇不會有太多的技術成分，主要是分享一下半年來學到的**網頁自動化測試**及心得，可能文章會有點長，我寫完自己也很感動⋯⋯]]></description><link>https://blog.moli.rocks/2018/02/12/kkstream-sqa-intern-experience-sharing/</link><guid isPermaLink="false">5a805e70ce8f9c473e909983</guid><category><![CDATA[Experience Sharing]]></category><category><![CDATA[Web]]></category><category><![CDATA[Testing Automation]]></category><category><![CDATA[server-side]]></category><dc:creator><![CDATA[蘇彥昀 (Yan-Yun SU)]]></dc:creator><pubDate>Mon, 12 Feb 2018 16:23:00 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2018/02/2d3f5cbb-f497-4f8a-8a80-0447ab92e79b-1470211873522.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.moli.rocks/content/images/2018/02/2d3f5cbb-f497-4f8a-8a80-0447ab92e79b-1470211873522.png" alt="KKStream SQA Intern 心得分享"><p>在 KKStream 實習了半年左右（2017/07~2018/02），分享一下半年下來的心得及想法，回想當初真的是很意外的緣分。</p>
<p>這篇不會有太多的技術成分，主要是分享一下半年來學到的<strong>網頁自動化測試</strong>及心得，可能文章會有點長，我寫完自己也很感動⋯⋯</p>
<p>文章內使用 <code>Ruby code</code> 代表用 Ruby 寫的舊自動化測試系統， <code>Webdriver.io</code> 代表用webdriver.io 開發的新自動化測試系統。</p>
<h2 id>實習過程記錄</h2>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_OhlmxyjeUb1NxERc9zzQKA.png" alt="KKStream SQA Intern 心得分享"></p>
<p>簡而言之我在這半年的實習中做了兩件事情，一件是維護前一位實習生 Frank 寫的自動化測試（Ruby + Selenium），包含四種瀏覽器（Chrome、Firefox、Safari、IE）；第二件是建置新的自動化測試 （Webdriver.io），目前涵蓋到兩種瀏覽器（Chrome、Firefox），以下將分成 <strong>「維護 Ruby code 架構」</strong> 、 <strong>「建置 webdriver.io 架構」</strong> 這兩個部分來論述。</p>
<h2 id="rubycode">維護 Ruby code 架構</h2>
<p>剛開始，先練習照著寫好的測試計畫書來做測試練習，主要測試的環境為 Web、Android、iOS 三大平台，但實際上我們的產品還有在 <a href="https://buzzorange.com/techorange/2012/12/03/as-a-developer-qll-is-ready-for-tv-app/">WebTV</a>、<a href="https://www.android.com/intl/zh-TW_tw/tv/">Android TV</a>、tvOS 等等平台運作。等到比較熟悉產品的內容及運作方式之後就開始接觸了神秘的<strong>自動化測試</strong>，這也是我第一次接觸到 <a href="https://zh.wikipedia.org/zh-tw/Ruby">Ruby</a> 語言與 <a href="https://github.com/SeleniumHQ/selenium/wiki/Grid2">Selenium Grid</a> 這個工具，還好 Ruby 跟 Python 撰寫起來很類似，不是太難上手，也因為不太有時間讓我慢慢去學 Ruby，所以學習的方式是看到程式碼有什麼不懂，就去網路上翻資料。</p>
<h3 id="pageobjectpattern">網頁架構：Page Object Pattern</h3>
<p>網頁系統的架構，我們採用的設計方式是 <a href="https://kkboxsqa.wordpress.com/2014/04/28/page-objects-design-pattern-in-automation-testing/">Page Object Pattern</a>。</p>
<blockquote>
<p>Page Object Pattern:</p>
<p>Within your web app’s UI there are areas that your tests interact with. A Page Object simply models these as objects within the test code. This reduces the amount of duplicated code and means that if the UI changes, the fix need only be applied in one place.</p>
</blockquote>
<p>採這個設計的好處，可以讓我們<strong>減少重複的程式碼</strong>及<strong>更好維護、簡潔</strong>。</p>
<p>以 Videopass 網站的這個頁面（ <a href="https://www.videopass.jp/unlimited">www.videopass.jp/unlimited</a> ）為例：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_Vk5_NdN8xGhZq7LGSuzrPA.png" alt="KKStream SQA Intern 心得分享"></p>
<p>我們將每頁可共用的區塊拆成各自獨立的元件，實作成 Ruby 的 module，如此就不用重複維護同樣的程式碼；至於 module 跟 class 的差異就請參考<a href="https://railsbook.tw/chapters/08-ruby-basic-4.html">這篇</a>。以下舉例使用 Page Object Pattern 時，可以共用的 module：</p>
<ul>
<li>header</li>
</ul>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_hbP6-0ddB29RmlHMp9sfpA.png" alt="KKStream SQA Intern 心得分享"></p>
<ul>
<li>item_group</li>
</ul>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_cVVWOjfkRpYWdDHRAQwHRg.png" alt="KKStream SQA Intern 心得分享"></p>
<ul>
<li>bottom</li>
</ul>
<p><img src="https://blog.moli.rocks/content/images/2018/02/--.PNG" alt="KKStream SQA Intern 心得分享"></p>
<p>這幾個部分在別的頁面也可以使用到，因此把他們抽出來實作，再來把每一頁的 Page Object 實作出來。</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_Ux3BRDOLdbMbyVgsKh1r7g.png" alt="KKStream SQA Intern 心得分享"></p>
<h3 id="seleniumgrid">自動化測試：Selenium Grid</h3>
<p>Selenium Grid 是一個 Hub-Node 的架構，我們對 Hub 下指令，Hub 會基於我們的指令對要求的 Node 進行測試，運用 Selenium Grid 可以讓我們對<strong>遠端 Browser 下指令執行、平行化測試、集中化管理、跨平台</strong>等優點。（這邊不多作介紹，預知更詳細可以到<a href="https://github.com/SeleniumHQ/selenium/wiki/Grid2">Selenium Grid wiki</a>上查看）</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_uNu-ZIqWSI16oOwe_.png" alt="KKStream SQA Intern 心得分享"></p>
<p>之前的實習生 Frank 有建置一個 Selenium Grid 的測試環境（如下圖），假設要測的是 Firefox 瀏覽器，透過 Jenkins 去對 Hub（架在 iMac 上）下達執行測試的指令，Hub 會再對連接上的 Node2（Windowns 10）下 request，在 Node2 上啟動 Firefox 做測試，我們就可以看到 Firefox 自動開啟並執行測試。</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/3.PNG" alt="KKStream SQA Intern 心得分享"></p>
<p>Jenkins 上各種瀏覽器的自動測試 jobs 狀態：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_755ASWxjVM6JKIVX8TxXZA.png" alt="KKStream SQA Intern 心得分享"></p>
<p>但因為 iMac 上同時也有其他裝置（iPhone、iPad）的自動化測試在運行，為了減輕 iMac 上的壓力，我們便把 Jenkins、Hub 改接到另一台 Windowns 10 機器上面：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/2.PNG" alt="KKStream SQA Intern 心得分享"></p>
<p>這一切看似很美好，但可能是對 Windows 信仰不足，遇到了編碼問題：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_q1JmxeHzayWr7hV7PAn_eg.png" alt="KKStream SQA Intern 心得分享"></p>
<p>在網路上找了各式各樣的解法還是沒辦法解決，於是決定再次改版：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1.PNG" alt="KKStream SQA Intern 心得分享"></p>
<p>到這邊，我們整個網站自動化測試的系統可以穩定地運作，不會再有太多人使用而導致測試被干擾的狀況，也沒有編碼的問題。</p>
<h2 id="webdriverio">建置 Webdriver.io 架構</h2>
<p>在講我建置的 Webdriver.io 架構之前，先簡單介紹一下 <a href="http://webdriver.io/">Webdriver.io</a></p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_6dK2fZt7CFidQb0oyIZROw.png" alt="KKStream SQA Intern 心得分享"></p>
<p>它是一個 End to end 的Testing Framework，由Node.JS開發，而且是以<strong>同步</strong>的方式來去執行我們的測試程式，也支援了多樣的hooks來更方便地讓我們寫測試程式，可以用來跑手機、網站的測試，像我們這邊測網站的話，它會透過 Selenium 的 RESTful API 來做溝通。</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_4NKT3Lo_IZn6RGj6XYQzyw.png" alt="KKStream SQA Intern 心得分享"></p>
<h3 id>特性</h3>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_iYShFzy_jOk00EOp_.png" alt="KKStream SQA Intern 心得分享"></p>
<p>Extendable:<br>
我們可以輕易的擴充指令，像是我們想要增加一個指令就能拿到 url 及 title，我們可以運用  <code>browser.addCommand('getUrlAndTitle')</code> 方法來去新增（參考 addCommand.js），下面使用 <code>browser.getUrlAndTitle()</code> 就能一次拿到 url 及 title（參考 example.js）。</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_U-v6Z6Msx3Dq5tjE_.png" alt="KKStream SQA Intern 心得分享"></p>
<p>Compatible:<br>
整合了大部分的 TDD 及 BDD 測試框架，像是本篇我們用到的 cucumber 以及常見的 mocha、Jsamine。</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_ZESk5LJWwxTOYbMrQX0Whw.png" alt="KKStream SQA Intern 心得分享"></p>
<p>Feature-Rich:</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_lCsFwC2BI3CC9PqIZ3ib8A.png" alt="KKStream SQA Intern 心得分享"></p>
<p>支援多種 Cloud Services：<br>
（指的是可以不用自己購買硬體的設備，直接透過網路來操作運用雲端服務提供的測試設備）</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_QKVenbkY1cgxJKcUhh7l9A.png" alt="KKStream SQA Intern 心得分享"></p>
<p>支援多種 Reporters（不同的測試結果格式）：<br>
<img src="https://blog.moli.rocks/content/images/2018/02/1_-at6yj8kHsdTR0-gLH7PcQ.png" alt="KKStream SQA Intern 心得分享"></p>
<h3 id>測試請求的流程</h3>
<p>這邊舉個流程的例子，假設我們要透過 webdriver.io 去開啟 <code>http://example.org</code> 這個網址，寫一段 code <code>browser.url('http://example.org')</code> 並執行，webdriver.io 會透過Selenium 的 RESTful API 發送請求， Selenium server 接到後會在對應的 node 開啟瀏覽器並連到 <code>http://example.org</code> 這個網址，接著再將結果回傳到 webdriver.io。<br>
<img src="https://blog.moli.rocks/content/images/2018/02/1_ZPvj4zmbRX27tazw__6Oew.png" alt="KKStream SQA Intern 心得分享"></p>
<h3 id="webdriveriocucumber">建置 webdriver.io + cucumber 架構</h3>
<p>Webdriver.io 在這邊告一個段落，以下是我建置的 webdriver.io + cucumber 架構：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_4ZJcwYU0cRjlWKMybLt7ww.png" alt="KKStream SQA Intern 心得分享"></p>
<p>先看到 features 的這個資料夾， 裡面總共 13 個 features：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_g92_oYLaT3EhyzfQ_.png" alt="KKStream SQA Intern 心得分享"></p>
<p>而 step-definitions 裡面有 4 個 steps</p>
<blockquote>
<h2 id="featureintroduction">Feature Introduction</h2>
<p>Every <code>.feature</code> file conventionally consists of a single feature. A line starting with the keyword Feature followed by free indented text starts a feature. A feature usually contains a list of scenarios. You can write whatever you want up until the first scenario, which starts with the word Scenario (or localized equivalent; Gherkin is localized for dozens of languages) on a new line. You can use tagging to group features and scenarios together independent of your file and directory structure.<br>
Every scenario consists of a list of steps, which must start with one of the keywords Given, When, Then, But or And. Cucumber treats them all the same, but you shouldn’t. Here is an example:</p>
<h2 id="stepdefinitions">Step definitions</h2>
<p>For each step Cucumber will look for a matching step definition. Each step definition consists of a keyword, a string or regular expression, and a block.<br>
This step definition uses a regular expression with one match group — (\d+). (It matches any sequence of digits). Therefore, it matches the first line of the scenario. The value of each matched group gets yielded to the block as a string. You must take care to have the same number of regular expression groups and block arguments. Since block arguments are always strings, you have to do any type conversions inside the block, or use Step Argument Transforms.<br>
When Cucumber prints the results of the running features it will underline all step arguments so that it’s easier to see what part of a step was actually recognised as an argument. It will also print the path and line of the matching step definition. This makes it easy to go from a feature file to any step definition.</p>
</blockquote>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_h2PBejRzeHDi2vdNRAWdxA.png" alt="KKStream SQA Intern 心得分享"></p>
<p>簡單來說，Feature 為模仿使用者操作的我們網站功能的流程，而 Steps 為描述一個步驟。</p>
<p>再來看到 pages 資料夾，裡面是我們 Page Object Pattern 與 module 的程式碼：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_ORJuIhZcpyXfF2h7Hj3JTQ.png" alt="KKStream SQA Intern 心得分享"></p>
<p>這邊用網站中的其中一頁來舉例：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_OrIYlLz7G0rA4O5ruvyWlw.png" alt="KKStream SQA Intern 心得分享"></p>
<p>對應的架構是：</p>
<p><img src="https://cdn-images-1.medium.com/max/800/1*i63HYmYTiVTVnB9tdQwtwg.png" alt="KKStream SQA Intern 心得分享"></p>
<p>對應的程式碼就是：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_Pa0bLWmZ1UNNAMonNgTIzQ.png" alt="KKStream SQA Intern 心得分享"></p>
<p>再來介紹最後一個比較重要的資料夾， <code>lib/web_element_table</code> ，裡面放著網頁上面 DOM 物件的 xpath，用來取得該 DOM 物件。<br>
<img src="https://blog.moli.rocks/content/images/2018/02/1_7mN8eA527TyVpnKgf5ntQg.png" alt="KKStream SQA Intern 心得分享"></p>
<p>以上就是建置 webdriver.io 整體大架構的設計，忙了我一個多月 XD。</p>
<p>實際 run 一次測試：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/_-prod.gif" alt="KKStream SQA Intern 心得分享"></p>
<p>最後來秀一下我建置的成果：</p>
<p>完成了 Chrome、Firefox 的自動測試 job：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_2Li0TgZ_ikNsuu_Z_.png" alt="KKStream SQA Intern 心得分享"></p>
<p>讓測試執行的更穩定、更有效率：</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/1_Y5CV8zOTJhoQ5Htk41BR5w.png" alt="KKStream SQA Intern 心得分享"></p>
<h2 id>最後的雷</h2>
<p>再來的最後兩個月就是在穩定、維護舊跟新的這兩個系統，然而這幾個月下來也有採到一些雷，最後再做這一個分享：</p>
<h3 id="driver">瀏覽器 driver</h3>
<p>每一家瀏覽器 driver 實作的操作不太一樣，基本上都會發摟 W3C Webdriver 所制定的標準走，但是這就造成有一些 webdriver.io 的 API 無法在特定的瀏覽器上運行，像是我們想要用滑鼠拖拉物件，使用 webdriverio 的 API： <code>browser.dragAndDrop()</code> 在 Chrome 上就可以順利拖拉，在 Firefox 、 Safari 上就會說 <code>moveTo()</code> 這個功能無法執行。為了要讓每一個瀏覽器都可以順利跑我們測試，沒有實作的功能我們只能用 <code>browser.execute()</code> 裡面塞入前端網頁可以跑的 JavaScript Code 去讓它執行。</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_mE5eAVBoySuXRMBJ_.png" alt="KKStream SQA Intern 心得分享"></p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_XyedcSYw7qiatioD_.png" alt="KKStream SQA Intern 心得分享"></p>
<h3 id>認證</h3>
<p>再來一個是我們測試的網站有使用 HTTP Authentication，但是在輸入帳號密碼這一步在 Safari 上無法透過 Selenium 去執行，所以 Safari 有好一段時間無法被測試⋯⋯最後的解法是跟 RD、PO 溝通，把 HTTP Authentication 拿掉，改成用 IP 白名單的方式，去測試我們的網站。</p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_HLgMCjQrbccjCW4b_.png" alt="KKStream SQA Intern 心得分享"></p>
<p><img src="https://blog.moli.rocks/content/images/2018/02/0_0TFASCsN2XYktmp9_.png" alt="KKStream SQA Intern 心得分享"></p>
<h2 id>後記</h2>
<p>如果想要這個實習機會的話可以看看 KKStream 的<a href="https://www.kkstream.com.tw/">官網</a>，或是 KKBOX 的 104 頁面，另外我也有分享一些面試心得在<a href="https://medium.com/@yysu/kkbox-sqa-intern-%E9%9D%A2%E8%A9%A6%E5%88%86%E4%BA%AB-427eba5148be">這裡</a>。</p>
<p>最後我想要謝謝在這半年來照顧我 QA team 的大家，其中要特別感謝 Jersey、Louis、Paul 三位大大，沒有你們就不會有這半年來美好的回憶，謝謝！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[製作 Live USB 升級或重灌 macOS]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id>前言</h2>
<p>許多人再升級或是重灌 macOS 的時候，都會花費許多的時間等候從網路上邊下載 image 檔案，一邊安裝，而往往也因為學術網路關係而耽擱了許多時間。</p>
<p>本文將會介紹分享如何製作 macOS Live USB 及透過分享 image 檔案方式來進行安裝或更新系統。</p>
<h2 id>下載作業系統</h2>
<p>不論是製作 Live USB 或是分享 image 方式，第一件事都得先下載好<strong>作業系統</strong>（附圖部分是已經先下載好的），如果是在學術網路環境之下，建議使用 VPN 可省下不少下載時間。<br>
<img src="https://blog.moli.rocks/content/images/2017/09/Screenshot-2017-09-28-22.05.57.png" alt="下載作業系統檔案"></p>
<h2 id>找出該檔案位置</h2>
<p>在 macOS 有一內建 <code>Storage Management.app</code>，透過應用程式（Applications）內找到，或使用 Spotlight 開啟。</p>
<p>左側欄中點選 <code>Applications</code> 後找到 <code>Install macOS High Sierra.</code></p>]]></description><link>https://blog.moli.rocks/2017/09/28/making-macos-live-usb/</link><guid isPermaLink="false">59cd0061648b9d653769730f</guid><category><![CDATA[macOS]]></category><dc:creator><![CDATA[Jerry Wang]]></dc:creator><pubDate>Thu, 28 Sep 2017 16:04:10 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2017/09/image_large_2x.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>前言</h2>
<img src="https://blog.moli.rocks/content/images/2017/09/image_large_2x.jpg" alt="製作 Live USB 升級或重灌 macOS"><p>許多人再升級或是重灌 macOS 的時候，都會花費許多的時間等候從網路上邊下載 image 檔案，一邊安裝，而往往也因為學術網路關係而耽擱了許多時間。</p>
<p>本文將會介紹分享如何製作 macOS Live USB 及透過分享 image 檔案方式來進行安裝或更新系統。</p>
<h2 id>下載作業系統</h2>
<p>不論是製作 Live USB 或是分享 image 方式，第一件事都得先下載好<strong>作業系統</strong>（附圖部分是已經先下載好的），如果是在學術網路環境之下，建議使用 VPN 可省下不少下載時間。<br>
<img src="https://blog.moli.rocks/content/images/2017/09/Screenshot-2017-09-28-22.05.57.png" alt="製作 Live USB 升級或重灌 macOS"></p>
<h2 id>找出該檔案位置</h2>
<p>在 macOS 有一內建 <code>Storage Management.app</code>，透過應用程式（Applications）內找到，或使用 Spotlight 開啟。</p>
<p>左側欄中點選 <code>Applications</code> 後找到 <code>Install macOS High Sierra.app</code> 檔案，並點選放大鏡的圖示會自動幫你開啟該資料夾位置。</p>
<p><img src="https://blog.moli.rocks/content/images/2017/09/Screenshot-2017-09-28-22.15.40.png" alt="製作 Live USB 升級或重灌 macOS"></p>
<h2 id>確認隨身碟位置</h2>
<p>開啟終端機（terminal）輸入 <code>diskutil list</code>，此指令可以列出目前系統上所有掛載的硬碟清單。</p>
<p>本例子為 <code>/dev/disk3</code>，在 NAME 欄位中可以找到這支隨身碟名字為 <code>NO NAME</code>。</p>
<p><img src="https://blog.moli.rocks/content/images/2017/09/Screenshot-2017-09-28-22.26.38.png" alt="製作 Live USB 升級或重灌 macOS"></p>
<h2 id="liveusb">製作 Live USB</h2>
<p>終端機輸入以下指令，請記得更換 USB 位置：<br>
<code>sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/[YOUR_DISK_NAME] --applicationpath /Applications/Install\ macOS\ High\ Sierra.app</code></p>
<p>本範例為：<code>sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/NO\ NAME --applicationpath /Applications/Install\ macOS\ High\ Sierra.app</code></p>
<p>按下 Y 確認後，會開始製作 Live USB～<br>
<img src="https://blog.moli.rocks/content/images/2017/09/Screenshot-2017-09-28-22.41.49.png" alt="製作 Live USB 升級或重灌 macOS"></p>
<p>等候約 5～10 分鐘後，製作完畢！</p>
<p><img src="https://blog.moli.rocks/content/images/2017/09/Screenshot-2017-09-28-22.47.10.png" alt="製作 Live USB 升級或重灌 macOS"></p>
<h2 id>另一方法，複製檔案</h2>
<p>可以回到<strong>找出該檔案位置</strong>步驟，可將 <code>Install macOS High Sierra.app</code> 透過 AirDrop 或丟到 NAS 等分享方式。將該檔案複製到該對應路徑，也可以點開後安裝喔～</p>
<p><mark>記得在本機更新前複製檔案，倘若是直接點選安裝，安裝後程式會自動刪除喔</mark></p>
<h2 id="ios">更新 iOS 也行</h2>
<p>首先分享者必須透過 iTunes 下載 iPhone 更新檔。一樣回到<strong>找出該檔案位置</strong>步驟，左側欄點擊 <code>iOS Files</code>，剩下就是複製對應路徑和透過 iTunes 安裝的動作了。</p>
<p>舉個例子：<code>/Users/focaaby/Library/iTunes/iPhone\ Software\ Updates/iPhone_4.0_64bit_11.0_15A372_Restore.ipsw</code></p>
<p><img src="https://blog.moli.rocks/content/images/2017/09/Screenshot-2017-09-28-22.56.46.png" alt="製作 Live USB 升級或重灌 macOS"></p>
<h2 id>參考來源</h2>
<ol>
<li><a href="https://support.apple.com/zh-tw/HT201372">官網：為 macOS 製作可開機安裝程式<br>
</a></li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Python general crawler writeup]]></title><description><![CDATA[這篇文章是紀錄我第一個爬蟲任務的 writeup。在之前我只能說自己對爬蟲有點概念，但開始做這個比較 general crawling 的任務之後，對於學習爬蟲的過程有了一點脈絡。這次被要求的爬蟲內容為取得上千個網站中的所有圖片、影片與文件，但為了減少我們儲存資料的容量，我們設計成圖片與影片只抓取其來源，而文件因功能需求抓取完整檔案。]]></description><link>https://blog.moli.rocks/2017/09/14/python-crawler-implementation/</link><guid isPermaLink="false">597afa1a43dc0337f4e84a61</guid><category><![CDATA[Python]]></category><category><![CDATA[crawler]]></category><category><![CDATA[writeup]]></category><dc:creator><![CDATA[Chen-Ming Yang]]></dc:creator><pubDate>Thu, 14 Sep 2017 08:25:17 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2017/08/joshua-earle-64814.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>前言</h2>
<img src="https://blog.moli.rocks/content/images/2017/08/joshua-earle-64814.jpg" alt="Python general crawler writeup"><p>這篇文章是紀錄我第一個爬蟲任務的 writeup。在之前我只能說自己對爬蟲有點概念，但開始做這個比較 general crawling 的任務之後，對於學習爬蟲的過程有了一點脈絡。這次被要求的爬蟲內容為<strong>取得上千個網站中的所有圖片、影片與文件</strong>，但為了減少我們儲存資料的容量，我們設計成圖片與影片只抓取其來源，而文件因功能需求抓取完整檔案。</p>
<h2 id>從網頁到網站</h2>
<p>Python 新手剛學習爬蟲時，網路上一堆教學都會教你如何透過最基本的 <code>requests</code> 與 <code>BeautifulSoup4</code> 爬取網頁。基本的流程是透過 <code>requests</code> 送 HTTP 請求到目標網站主機，取得頁面的 HTML 檔案後再透過 <code>BeautifulSoup4</code> 分析之，經由這兩個簡單步驟，我們基本上可以拿到我們想要的資料。</p>
<p>從單一網頁爬蟲到網站爬蟲，通常只是簡單的判斷 following link，也就是透過 <code>BeautifulSoup4</code> 分析出 <code>&lt;a href=&quot;...&quot;&gt;</code> 之後再重新對 <code>href</code> 中的新 URL 送 HTTP 請求，看起來很簡單，但卻有幾個問題必須特別注意，以下說明之。</p>
<h3 id="domain">Domain 的判斷</h3>
<p>通常在對 <code>href</code> 屬性的值送請求之前，我們都會透過 <code>urllib.parse.urljoin</code> 等方式將相對路徑轉成絕對路徑，接著再對絕對路徑送出請求。但在送出之前，如果沒有考慮到 domain 問題，很有可能會把大半個網路的內容全部都抓回來，尤其像這種爬多個網站的任務，其沒有非常明確的爬蟲目標，如果某個網站在你沒有注意到的地方把一些大型網站的網址附上，如 <code>google.com</code>、<code>facebook.com</code>、<code>youtube.com</code>⋯⋯等。</p>
<p>要判斷這種完全不同的網域，我們可以簡單的透過 <code>urllib.parse.urlparse</code> 將 URL 的格式 parse 出來，透過 <a href="https://github.com/python/cpython/blob/3.6/Lib/urllib/parse.py#L359-L373">source code</a> 你可以觀察到他解析出來的格式是 <code> &lt;scheme&gt;://&lt;netloc&gt;/&lt;path&gt;;&lt;params&gt;?&lt;query&gt;#&lt;fragment&gt;</code>，透過其中的 <code>netloc</code> 就可以知道是否為相同的網域。</p>
<p>但是上面這種判斷方式會將子網域的網站排除在外，舉例來說，學校的網站與各系所的網站（如：台大首頁的網址是 <code>www.ntu.edu.tw</code>，台大中文系的網址是 <code>www.cl.ntu.edu.tw</code>）透過 <code>urlparse.parse.urlparse</code> 的 <code>netloc</code> 你會判斷 <code>&quot;www.ntu.ed.tw&quot; != &quot;www.cl.ntd.edu.tw&quot;</code>。</p>
<p>如果子網域的網站也在你的爬蟲目標內，我們可以透過另外一個 <code>tldextract</code> 來當 urlparser。<code>tldextract</code> 會維護一份頂級域名的字典，所以可以透過 <code>tldextract.extract</code> 將 URL 拆解並回傳 <code>ExtractResult</code> 物件（<a href="https://github.com/john-kurkowski/tldextract/blob/master/tldextract/tldextract.py#L104">source code</a>），可以透過存取 <code>ExtractResult</code> 物件取得拆解後的 URL 片段，包含 subdomain、domain 與 suffix，基本上可以視為 <code>neloc = subdomain.domain.suffix</code>。</p>
<h3 id="html5structurevsnonhtml5structure">HTML5 structure v.s. non-HTML5 structure</h3>
<p>原本以為圖片只要分析 <code>&lt;img&gt;</code> 元素，影片只要分析 <code>&lt;video&gt;</code> 元素，文件只要分析 <code>&lt;object&gt;</code> 元素，但是後來才發現這一切都太異想天開，網路中還是有大部分的網站，使用的是以前 IE 時代的寫法，所以要判斷的元素變得非常的多。</p>
<p>對此，我們決定採用正向原則，也就是我們有定義的元素才爬，下面列出我後來實際上有爬的：</p>
<ul>
<li><code>&lt;img src=&quot;...&quot;&gt;</code></li>
<li><code>&lt;video src=&quot;...&quot;&gt;</code></li>
<li><code>&lt;object data=&quot;...&quot;&gt;</code></li>
<li><code>&lt;picture srcset=&quot;...&quot;&gt;</code></li>
<li><code>&lt;source src=&quot;...&quot;&gt;</code></li>
<li><code>&lt;source src=&quot;...&quot;&gt;</code></li>
</ul>
<p>然後有判斷 following link 的元素為：</p>
<ul>
<li><code>&lt;embed src=&quot;...&quot;&gt;</code></li>
<li><code>&lt;iframe src=&quot;...&quot;&gt;</code></li>
<li><code>&lt;frame src=&quot;...&quot;&gt;</code></li>
<li><code>&lt;a htef=&quot;...&quot;&gt;</code></li>
</ul>
<h3 id="href">過濾 href</h3>
<p>透過分析元素取得的資料來源，有可能是 internal file，也有可能是 external file。影音如果是 YouTube 之類的影音串流平台，雖然 domain 不同，但其實也只需要獲取資料來源就好；至於 internal file，其路徑有可能是相對路徑或是絕對路徑，建議透過 <code>urllib.parse.urljoin</code> 統一轉成 URL 再做處理。</p>
<p>另外，處理 <code>&lt;a href=&quot;...&quot;&gt;</code> 時，資料來源有可能會包含錨點 <code>#</code> 或是 JavaScript code，要記得排除這些 pattern。</p>
<h2 id>動態網頁</h2>
<p>動態網頁，換句話說，就是經過程式碼改變網頁內容的網頁，但是透過 <code>requests</code> 送出請求所拿回來的 HTML 會是靜態網頁，也就是打開瀏覽器透過 <strong>「檢視網頁原始碼」</strong> 看到的內容，但我們通常希望 「What the user sees, what the crawler sees.」，也就是希望爬蟲拿到的內容是透過瀏覽器的 <strong>「開發者工具」</strong> 看到的內容，為了這個目的，目前被廣為使用的工具是 <a href="http://www.seleniumhq.org/">Selenium</a>。</p>
<p><code>Selenium</code> 其實是用來做網頁自動化測試的工具，可以模擬使用者操作瀏覽器的行為；額外安裝 driver 就可以操作我們一般在使用的瀏覽器，可以透過程式操作 Chrome 或是 Firefox 等瀏覽器檢視網頁操作是否正確。也因為它可以模擬瀏覽器行為，所以他也就有能力拿到 JavaScript render 之後的 HTML（通常稱之為 HTML Snapshot）。</p>
<p>因為 <code>Selenium</code> 是透過程式操作瀏覽器行為，所以比起靜態爬蟲速度會比較慢. 雖然有另外一個 driver <a href="http://phantomjs.org/">PhantomJS</a> 是沒有圖形化介面的，速度上來說會比 Chrome、Firefox 等 driver 還要快，但這邊可以的話，還是先嘗試攔截 AJAX 直接爬蟲會更快。</p>
<h2 id>加速爬蟲</h2>
<p>回頭檢視爬蟲需求，我們的目標是上千個網站，一個一個慢慢爬的時間成本太高，且往後如果要做定期更新的話，根本不是一個實際可用的程式，以下會從各個層面來討論爬蟲效率。</p>
<h3 id="htmlparser">HTML parser</h3>
<p><code>BeautifulSoup</code> 以前也是因為速度太慢所以被捨棄，目前速度最快的 HTML parser 是 <code>lxml</code>，而 <code>BeautifulSoup4</code> 出來之後可以選擇背後實作的 parser，這邊建議選擇 <code>lxml</code>。</p>
<h3 id="requeststimeout">requests timeout</h3>
<p>雖然說減少 request timeout 的時間長度也可以變相加速，但個人不太建議這麼做，單純縮短timeout 的時間，也就代表你送請求的頻率變高，如此目標網站的 loading 會上升，一來有可能癱瘓對方，二來有可能一下子就被認為是 crawler 然後被 ban。</p>
<h3 id="asyncormultithreading">async or multithreading</h3>
<p>雖然 Python 因為 GIL 的關係所以 multithreading 的實作效果不怎麼好，但還是比不做更好。但因為送請求這種任務，大多時候是在網路等待中空轉，所以比起 multithreading 其實使用 async 更好。</p>
<h3 id>更新流程</h3>
<p>考慮到往後，我們希望手上的資料盡可能的是最新資料，所以程式會放入 <code>crontab</code> 中做定期爬蟲的排程，這個時候針對下載檔案這件事情，我們應該先判斷該文件是否有更新。</p>
<p>參考 <a href="https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=zh-tw">Google Web Developer 文章</a>，比起考慮 response header 中的 <code>Last-modified</code>，不如考慮 <code>ETag</code> 更適合，又因為我們在下載之前需要的，僅僅只是檢查文件是否有更改，所以比起送 HTTP GET/POST，送 HEAD 其實就夠了，相較之下可以減少更多頻寬。</p>
<p>p.s. 這邊其實我覺得這種作法並不是很好，如果有大大覺得有更好的作法，再麻煩聯絡我，像是再這種任務底下實作 notify 架構。</p>
<h3 id="toolkitvsproject">toolkit v.s. project</h3>
<p>如果只是一次性的爬蟲，上面那些考慮完基本上就差不多了，但是討論到更新流程時，這是一個要持續使用的程式，workflow 必須定義的更明確，而且還有一個沒被討論到的問題：<strong>「要透過甚麼方式防止 IP 被網站 banned？」</strong></p>
<p>IP 被 banned 這件事情其實有很多種處理方法：</p>
<ul>
<li>動態改變 User-Agents</li>
<li>不要使用 cookies</li>
<li>download delay</li>
<li><a href="http://www.googleguide.com/cached_pages.html">Google cache</a></li>
<li>VPN、Proxy、tor</li>
<li>分散式爬蟲</li>
</ul>
<p>不過，我後來把上面那些東西全部放棄，然後引入 <a href="https://scrapy.org/">Scrapy</a>。</p>
<p><code>Scrapy</code> 是一個爬蟲框架，workflow 也非常完善，送 request 跟 download 的部份以 Async 實作，因此爬蟲流程的速度還可以再稍微加快一點，只是我們剛剛上面提的東西可能都要換另外一種實作方式。</p>
<p><img src="https://blog.moli.rocks/content/images/2017/03/scrapy_architecture_02.png" alt="Python general crawler writeup"></p>
<p>我們導入框架之後主要的任務是寫一個 <code>spider</code>，他的工作內容就是爬蟲，基本上只要把送 request 跟 parse HTML 的邏輯搬過來以 class 的方式實作就可以，而我們原本要紀錄與下載檔案的部份，則是到 item pipeline 處理，其他功能的替換如下：</p>
<ul>
<li>動態渲染網頁：<code>Selenium</code> → <code>scrapy-splash</code></li>
<li>HTTP cache &amp; Etag validation：設定 downloader 採用 RFC2626 policy</li>
</ul>
<p>除此之外，downloader 這邊我們可以根據需求再增加其他 middleware，像是上面提到的更改 user agent、建立 IP pool 來防止 IP 被 banned，還有檢查同樣的 URL 是否已經送過 request。</p>
<p>不過 multiprocessing 的解法呢？</p>
<p><a href="http://stackoverflow.com/questions/31087268/multiprocessing-of-scrapy-spiders-in-parallel-processes">StackOverflow</a> 上面有人解釋，<code>Scrapy</code> 本身是建立在 <code>Twisted</code> 這個 Event-driven networking engine 的基礎之上，他本身就有處理 Async 的方式，如果在 <code>Scrapy</code> 中使用 multiprocessing 可能會有無法預知的錯誤，比較好的作法是參考 <a href="https://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script">Run Scrapy with Scrapy</a> 的方式額外寫一支 script，把剛剛寫的 <code>Scrapy</code> spider 引入再實作。</p>
<p>雖然可以透過撰寫 <code>Twisted</code> 使用 <code>spawnprocess</code> 達到 multiprocessing 的功用，不過若是專案中沒有需要處理 spider 以外的操作，scrapy 也提供了 <code>scrapy.crawler.CrawlerProcess</code> 這個 API 讓開發者可以更方便使用。</p>
<h2 id>後記</h2>
<p>這其實是我第一次接觸的爬蟲專案，也算是因此一次性的接觸了很多工具，上面這些也只是討論一些很基本擋 bot 的方法，而且後面紀錄 record 之後我也沒有紀錄直接存入資料庫的方式。</p>
<p>但也算是對於整個瀏覽器的操作跟網路送 request 的流程有更進一步的認識，整個從頭到尾大概花了我一個月 pick up + implementation，但是是很有趣而且門檻不會太高的一次實作。</p>
<ul>
<li>然後這邊有後來開課的<a href="https://docs.google.com/presentation/d/1lyhhTPYVzhNxfYoWuFzfXjOQoML54Qv1lfWHSMHtvNw/edit#slide=id.p4">投影片</a>與 <a href="https://www.slideshare.net/tw_dsconf/python-78691041">slideshare</a>，可能會不定期更新，歡迎各位大大指教。</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[考研心酸血淚史]]></title><description><![CDATA[這篇來分享我考資管研究所的心路歷程，你將會看到我的個人背景、心路歷程、唸書規劃、各科準備方式、心得⋯⋯等。]]></description><link>https://blog.moli.rocks/2017/08/17/journey-of-becoming-a-graduate-student/</link><guid isPermaLink="false">598342bcb036f0181c109b33</guid><category><![CDATA[Graduate]]></category><dc:creator><![CDATA[蘇彥昀 (Yan-Yun SU)]]></dc:creator><pubDate>Thu, 17 Aug 2017 14:34:00 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2017/08/photo-1420641637488-df930ea6ec80.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.moli.rocks/content/images/2017/08/photo-1420641637488-df930ea6ec80.jpeg" alt="考研心酸血淚史"><p><small>Cover photo by <a href="https://unsplash.com/@davidmarcu">David Marcu</a> / <a href="https://unsplash.com">Unsplash</a></small></p>
<h2 id>台/政/交/成/山 資管所．資結組考試心得</h2>
<p>這篇來分享我考資管研究所的心路歷程，你將會看到我的個人背景、心路歷程、唸書規劃、各科準備方式、心得⋯⋯等。</p>
<h2 id>背景介紹</h2>
<p>國立暨南國際大學資管系，大學四年平均系排名 11/54，大一、大二成績很爛大約都在二十幾名，大三開始知道自己要的是什麼，於是努力充實自己和成績。自己對於 MIS 沒什麼興趣但也不排斥，喜歡 coding 多一點，自己也會做一些小程式方便我的生活，平常都有在關注資訊的新科技，不管是技術面還是管理面的。</p>
<p>大學實期有過實習的經驗、考過多益 770、參與過滿多資訊活動、有接過實驗室研究計畫但後來太忙主動放棄。</p>
<h2 id>目標</h2>
<p>原本的目標是能夠中山或是中央資管我就滿足了，因為我當初準備的很混，太多事情要忙，後來越準備越覺得政大不是夢 XD（我的第一志願）</p>
<h2 id>報考結果</h2>
<ul>
<li>台大資管 一階段錄取  二階面試沒上</li>
<li>政大資管 計概：39 資結：65 英文：75 資料審查：85.2 口試 84.8  總分 68.48 正四</li>
<li>政大數位 計概：98 資結：70 資料審查：82.8 口試：91.2 正一</li>
<li>交大資管 計概：47 資結：42 英文：56  書審成績：84.4 正取</li>
<li>成大會資 計概：90 資結：74 英文：47 正取二</li>
<li>中山資管 正取</li>
<li>中正資管 備取一（考這間我完全沒心情寫，因為中山放榜了）</li>
<li>北大資管 備取四（理由同上）</li>
</ul>
<p><img src="https://blog.moli.rocks/content/images/2017/08/20631775_1449118435176577_1028352617_n.jpg" alt="考研心酸血淚史"></p>
<h2 id>各科準備方式</h2>
<h3 id>計概</h3>
<p>正課：劉逸的面授班，老師講的東西都很基礎，會讓你很好懂，但缺點就是步調有點慢，建議可以額外再多看點計概更深入的內容，也要隨時注意新的科技新聞，都有可能會考在計概中。</p>
<p>題庫班：劉逸的面授班，基本上下面提到的科目都會上到（網路、資料庫、程式語言、作業系統），但是不要期望你在題庫班能夠上到像正課一樣豐富的東西，因為是「題庫班」顧名思義老師會著重在重要題目的講解，所以題庫班之前建議先把該科複習完成，再來上題庫班會更有感覺。</p>
<h3 id>網路</h3>
<p>網路這科基本的 TCP/IP、OSI 模型要很熟，每層至少要記兩個以上的 protocol，基本的 port 也須要記起來，再來是資安也是很熱門的重點（中央、政大資管組都愛考）必須要會。再來網路很多很深的東西，建議看學校準備（中央、交大）。</p>
<h3 id>資料庫</h3>
<p>資料庫正規化、ERD、交易控制這三大重點必須要會，再來可以看一下 SQL、NoSQL 的差異，而要考交大的有一些 SQL 題較難也建議至少都能夠有寫過甚至實際打 SQL 指令 run 看看，有很多線上可以跑 SQL 的網址，我是用 SQL fiddle，不過用起來跑有點久就是了。</p>
<h3 id>程式語言</h3>
<p>這科應該算是我最有把握的科目，把物件導向四大特性（抽象、封裝、繼承、多型）要熟記，建議就是平常多寫程式能夠訓練自己的邏輯能力，有一些有考過的程式我有把它放在我的 GitHub repo ( <a href="https://github.com/YYSU/Ds-algo">https://github.com/YYSU/Ds-algo</a> ）建議大家先自己打過一遍再看看我的寫法（不見得是最好的，但可以參考看看，只是現在目錄還有點亂，我有持續再整理XD），強烈建議要考政大科技組的同學今年可以看看 Python 這個程式語言哈哈哈。</p>
<h3 id>作業系統</h3>
<p>這科近幾年的趨勢好像都是考選擇題居多，還是能熟記就熟記吧。</p>
<h3 id>資結</h3>
<p>正課：TKB的洪逸，這科我也不用多說了，網路上夠多心得狂推洪逸，記得一定要帶夠多的紙去上課，上完課記得複習，照著老師的進度走能夠很有效地讀完資結。建議資結組準備的資結只要是洪逸老師上課有教的都要會，畢竟資結這科大家差異不大，而且不要覺得冷門不會考，像今年政大資結就出了個30分 Splay tree，考場上看到嚇都嚇死了，還好還有點印象，ＭＩＳ組的我就不太清楚了，可能要看看別人的心得分享。</p>
<p>題庫班：TKB 的洪逸，一樣跟著老師的進度走，能做多少本就做多少本吧（總共7本題庫），做完你會很有成就感。</p>
<h3 id>英文</h3>
<p>英文我是買別的補習班（高Ｘ）出的歷年研所試題來寫，不過我沒寫多少就要考試了，建議要養成閱讀英文的習慣，平時可多看看英文雜誌、每天背幾個單字，畢竟英文不是短時間能衝起來的。</p>
<p><img src="https://blog.moli.rocks/content/images/2017/08/20623901_1449118455176575_1718250032_n.jpg" alt="考研心酸血淚史"></p>
<h2 id>讀書規劃</h2>
<p>我們班有同學在大二下接近暑假時，就開始補習了。我在大三上才去報名補習班。因為知道自己未來有需要繼續就讀研究所，去補習班上課都很認真。可是回家我還有接一些 case 要忙，所以那段期間我都沒再複習（強烈建議一定要複習，至少上完課兩天內），然後永遠不要嫌自己太晚開始準備啊！只要有照著自己的規劃走永遠不嫌晚。</p>
<h3 id="78">7～8 月暑假</h3>
<p>我自己沒有好好把握這段時間，因為我的事情太多，也有在幫老師做研究計劃忙不過來（後來有跟老師說先暫停，不然我要讀書要補習要專題太崩潰了），也不建議這時候去實習或是上班，因為你要能夠把目標想好，到底這時候實習重要還是能考上研究所重要，在這邊要先感謝 ken90242 這位 ptt 的版友，那時候我也有同樣的困擾，套一句他回覆我的話「你現在每增加一個變數，就是在增加你投資的失敗率」，不過要是你時間規劃安排的妥當我也不反對。</p>
<p><strong>強烈建議</strong><br>
這段時間很重要，也是你唸書要把握的時間，因為這時候比較有時間能夠完整的念，而且補習班主要的正課都集中這時候開始，建議這段期間能夠把講義唸過兩遍以上。</p>
<h3 id="11">11 月中旬前</h3>
<p>這時候正課都應該結束、題庫班開始了，專題這時候應該也告一個段落了。這時候就是不停的複習正課教的，題庫班要注意跟上進度做完題目，考古題這時後可以開始寫了，建議從久遠的題目寫到新的題目，這樣你能夠比較了解整體出題的趨勢及方向。這段期間開始我早上 10 點到圖書館至少讀到晚上 9 點。最重要的不是時間久，而是你有沒有專心念到東西。</p>
<h3 id="2">2 月考試前</h3>
<p>要考的學校一定要至少做完 5 年的考古題，你會比較清楚每間學校偏愛哪些題目。在這次的準備中，政大科技組前兩年都有考到程式，但是今年完全換了一個方向；交大資管我有準備新的金融趨勢名詞解釋（fintech, block chain...）與機器學習相關的題目，但是也完全沒考（乙組好像有考到 block chain)。</p>
<p><img src="https://blog.moli.rocks/content/images/2017/08/20631487_1449118495176571_1213205340_n.jpg" alt="考研心酸血淚史"></p>
<h2 id>心得</h2>
<p>首先先謝謝幫助過我的 ptt 版友們 bluewindscott、booray，提供給我面試的建議，也讓我能在這邊分享下去。還有一起考資管所的戰友，很累也很充實，考前也到處奔波。再來謝謝我的家人，讓我考研所無後顧之憂，最後謝謝考前跟我加油的朋友們。</p>
<p>給學弟妹一些報考上的建議，就是不要報太多間學校。我報了 7 間 8 個科系，考到後來超級疲憊，而且有些學校上了也不會去讀，不知道自己那時候在衝動什麼，建議報幾間你想讀的 +1～2 間備胎即可。</p>
<p>啊啊啊啊我這篇心得文打得很亂想到什麼就寫什麼，有任何問題想問的，歡迎在下面留言問我，請注意禮貌，如果有任何可以幫到你的地方，我都會儘量回答。</p>
<h2 id>口試分享</h2>
<h3 id>台大口試</h3>
<p>有四關</p>
<ol>
<li>
<p>生涯關<br>
一分鐘自我介紹、問以後要做什麼研究、從研究計畫問問題。</p>
</li>
<li>
<p>技術關 系主任<br>
如何找 inorder successor（台大今年計概題目），又額外問了台大資管跟暨南資管課程有什麼不一樣。</p>
</li>
<li>
<p>不知道屬於何者關<br>
五張紙任意抽一張，我是抽到 <code>What is database schema? What does it use for?</code><br>
然後回答之後，教授還會繼續問你為什麼？再回答再問為什麼⋯⋯無限迴圈。<br>
最後問到你不知道為什麼就時間到了。</p>
</li>
<li>
<p>統計關<br>
這關我是被問 z-value 相關的，但我不會，有待其他高手補充。</p>
</li>
</ol>
<h3 id>政大資管口試</h3>
<p>先由教授指定每個人唸一段英文句子，做翻譯，會問你其中一個單字是什麼意思。再來兩個教授會針對研究計畫問問題，我是想做理財機器人相關平台建置，被問到資產配置及投資組合有什麼不一樣，有一位教授問到如何做到精準。再來一位教授是問程式題，是用 Scala 撰寫，不過教授有先講解，問你程式意義，以搶答方式進行。最後一位教授是問 MIS，是問跨界結合對於臺灣中小企業有什麼挑戰。</p>
<h3 id>政大數位</h3>
<p>先作 5 分鐘的 Slide 報告，包含自我介紹、作品、研究計畫。接著有 10 分鐘的提問，會針對你簡報的內容來做提問，像我研究計畫想做 AR 相關的行動裝置程式，就被問到什麼類型、有什麼商業價值。再來有老師會查你的榜單，你要想好你的報考動機是什麼，為什麼來念等等。</p>
<h2 id>補充</h2>
<p>Ｑ：有人問我為什麼不考資工所？<br>
Ａ：因為資工要多考現代或離散、計算機組織，我不想增加我唸書的負擔，所以選擇我熟悉的資管所考，畢竟我對 MIS 也不排斥。</p>
<p>Ｑ：最後你去了哪一間？<br>
Ａ：我去了政大。</p>
<p>Ｑ：怎麼選研究所?<br>
Ａ：這個問題也困擾了我許久，個人建議還：先想想自己讀研究所的動機是什麼？是真的想要再多學點東西，還是想要增加自己得到面試的機會，亦或是盲目地跟隨別人讀研究所？確認好自己想要的是什麼，你才有動力去拚、去讀。可以先從有興趣的研究領域來去找學校或老師，例如交大資訊很強，就可以去旁聽資工系的課，若剛好想要加強寫程式的能力，那麼交大就很適合你；或是像中山資管的電子商務很厲害，而這又是你的有興趣，那就適合；或是你知道某大學某某老師是一個研究領域的佼佼者，那也可以考慮進入該大學，找某某老師擔任指導教授。總而言之，知道自己想要的是什麼，最重要。</p>
<p>Ｑ：要不要讀研究所？<br>
Ａ：這個問題你問我，我回答什麼都不對，只好分析有念研究所跟沒唸研究所的優劣給你。以下是本人的觀點僅供參考：首先有念研究所，在履歷上是一定有加分的，得到面試的機會也相對的比學士的機會多，起薪也會有差別（根據職業類別不同而有差異）。試想一般公司企業在求職潮時，收到一堆履歷之後要怎麼做篩選？學歷較高的先篩出來，再來頂大的學校再塞一些出來，再來非頂大的學校⋯⋯以此類推，講到這邊，應該也知道碩士學歷在職場上的優勢了。當然念研究所也不是件輕鬆的事情，除了需要閱讀 paper、接實驗室的研究、協助教授處理雜務，還不能放棄研究所的課程。研究所需要修滿一定的學分、寫出論文才能畢業，在這兩年的期間，大學畢業的同學可能已經升到一定的職位，你也落後了別人兩年的工作經驗。所以我說回答什麼都不對，重點真的是你想要什麼。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Ghost 加入 Syntax highlight]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id>前言</h1>
<p>聽說 Ghost 已經 1.2 了，預設主題 <a href="https://github.com/TryGhost/Casper">Casper</a> 就滿厲害的了，不僅有 RWD 還有進度條顯示閱讀進度，當初還想<s>自己寫一個主題呢</s>。</p>
<p>不過依照過往經驗，原預設主題沒有 code syntax highlight，就得自己手動加入了～<br>
在本文章採用 <a href="http://prismjs.com/">Prism.js</a>（by Lea Verou）的 library 引入使用。</p>
<h1 id="prismjs">Prism.js</h1>
<p>由 CSS 女神 <a href="https://twitter.com/leaverou">Lea Verou</a> 製作的 highlighting library，可以自由客製化選擇主題以及常使用的程式語言 syntax。</p>
<h2 id>首頁</h2>
<p>首頁右邊有 Default, Dark, Funky, Okaida, Twilight, Coy,</p>]]></description><link>https://blog.moli.rocks/2017/08/01/syntax-highlighting-in-ghost/</link><guid isPermaLink="false">59808caaf838725af8a28aa8</guid><category><![CDATA[ghost]]></category><dc:creator><![CDATA[Jerry Wang]]></dc:creator><pubDate>Tue, 01 Aug 2017 17:48:50 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2017/08/Screenshot-2017-08-02-01.52.21.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id>前言</h1>
<img src="https://blog.moli.rocks/content/images/2017/08/Screenshot-2017-08-02-01.52.21.png" alt="Ghost 加入 Syntax highlight"><p>聽說 Ghost 已經 1.2 了，預設主題 <a href="https://github.com/TryGhost/Casper">Casper</a> 就滿厲害的了，不僅有 RWD 還有進度條顯示閱讀進度，當初還想<s>自己寫一個主題呢</s>。</p>
<p>不過依照過往經驗，原預設主題沒有 code syntax highlight，就得自己手動加入了～<br>
在本文章採用 <a href="http://prismjs.com/">Prism.js</a>（by Lea Verou）的 library 引入使用。</p>
<h1 id="prismjs">Prism.js</h1>
<p>由 CSS 女神 <a href="https://twitter.com/leaverou">Lea Verou</a> 製作的 highlighting library，可以自由客製化選擇主題以及常使用的程式語言 syntax。</p>
<h2 id>首頁</h2>
<p>首頁右邊有 Default, Dark, Funky, Okaida, Twilight, Coy, Solarized light 等常見的八種主題選擇。<br>
<img src="https://blog.moli.rocks/content/images/2017/08/home-page.png" alt="Ghost 加入 Syntax highlight"></p>
<p>點擊後則可以在下方範例即時預覽<br>
<img src="https://blog.moli.rocks/content/images/2017/08/home-page-2.png" alt="Ghost 加入 Syntax highlight"></p>
<h2 id>客製化</h2>
<p>選擇剛剛於首頁測試的主題<br>
<img src="https://blog.moli.rocks/content/images/2017/08/theme-core.png" alt="Ghost 加入 Syntax highlight"></p>
<p>在這邊句選自己較常使用的語言，最近叫非常火紅的 Dockerfile, React JSX , Typescript 等語法也都有支援。<br>
<img src="https://blog.moli.rocks/content/images/2017/08/theme-core-2.png" alt="Ghost 加入 Syntax highlight"></p>
<p>附屬外掛，例如：否顯示 line number、line highlight 功能，根據你的需求選擇加入即可<br>
<img src="https://blog.moli.rocks/content/images/2017/08/theme-plugin.png" alt="Ghost 加入 Syntax highlight"></p>
<h1 id="ghost">加入 Ghost</h1>
<ol>
<li>下載 <code>prism.css</code> 及 <code>prism.js</code></li>
<li>分別放入個別目錄 <code>assets/css/</code> 及 <code>assets/js</code></li>
<li>修改 <code>defult.hbs</code>，加入 stylesheet link</li>
</ol>
<pre><code class="language-markup">{{!-- Styles'n'Scripts --}}
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;{{asset &quot;built/screen.css&quot;}}&quot; /&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;{{asset &quot;css/prism.css&quot;}}&quot; /&gt;
</code></pre>
<ol start="4">
<li>在同一個檔案下方，加入</li>
</ol>
<pre><code class="language-markup">   {{!-- The #block helper will pull in data from the #contentFor other template files. In this case, there's some JavaScript which we only want to use in post.hbs, but it needs to be included down here, after jQuery has already loaded. --}}
    {{{block &quot;scripts&quot;}}}
    &lt;script src=&quot;{{asset &quot;js/prism.js&quot;}}&quot;&gt;&lt;/script&gt;
</code></pre>
<ol start="5">
<li>在將修改好的 theme 壓縮成 zip 並上傳至 Ghost 即可。</li>
</ol>
<p>就可以在 Ghost 使用 code syntax highlight 拉～～</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在 Ubuntu 16.04 存取暨南大學的 CC Server]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>在暨南大學只要是教職員生，都會有一個 <strong>CCServer</strong> 帳號，若你的系統不是 Windows，或常常需要在校外環境存取 CCServer 的東西，這篇文章可以參考看看有沒有幫助。</p>
<p>參考資料：<a href="http://ws1.ccserver.ncnu.edu.tw/FTP/">FTP 存取 CCServer 網路資料夾之相關使用說明</a></p>
<h2 id="1ftpclient">1. 安裝 FTP client</h2>
<p>首先叫你的軟體中心出來（圖中右邊的圖案）<br>
<img src="https://i.imgur.com/iYYs115.png" alt></p>
<p>在軟體中心的搜尋列（下圖上方）搜尋 FileZilla<br>
<img src="https://i.imgur.com/vlKq6XE.png" alt></p>
<p>然後按下右邊的 install<br>
<img src="https://i.imgur.com/lyRJfwH.png" alt></p>
<p>在 Ubuntu 只要是安裝或移除程式通常都需要輸入密碼哦。<br>
<img src="https://i.imgur.com/ro4cuvq.png" alt></p>
<p>輸入密碼之後就會開始安裝，<br>
這邊就稍微等它一下。<br>
裝好之後應該在左邊選單會出現最下方紅底白字 FZ 的按鈕。<br>
<img src="https://i.imgur.com/Ymy2zOt.png" alt></p>
<h2 id="2">2. 設定站台</h2>
<p>首先開啟你的 FZ，<br>
找到左上角那個看起來像是伺服器的按鈕。<br>
<img src="https://i.imgur.com/iPUGzG5.png" alt></p>
<p>點下去之後會跳出站台管理員的視窗，<br>
選擇左下方的新增站台，<br>
新增站台時需要填入站台名稱，<br>
名稱不影響任何作業，<br>
不過還是取個讓自己不會混淆的名稱較好。</p>
<p><img src="https://i.imgur.com/3v9wuav.png" alt></p>
<p>接著在 Host 貼上 <code>ws1.ccserver.</code></p>]]></description><link>https://blog.moli.rocks/2017/08/01/zai-ubuntu-16-04-cun-qu-ji-nan-da-xue-de-cc-server/</link><guid isPermaLink="false">597afa1a43dc0337f4e84a5b</guid><dc:creator><![CDATA[HeJung]]></dc:creator><pubDate>Tue, 01 Aug 2017 07:28:55 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2017/08/we-suck-more-109158.4.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.moli.rocks/content/images/2017/08/we-suck-more-109158.4.jpg" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"><p>在暨南大學只要是教職員生，都會有一個 <strong>CCServer</strong> 帳號，若你的系統不是 Windows，或常常需要在校外環境存取 CCServer 的東西，這篇文章可以參考看看有沒有幫助。</p>
<p>參考資料：<a href="http://ws1.ccserver.ncnu.edu.tw/FTP/">FTP 存取 CCServer 網路資料夾之相關使用說明</a></p>
<h2 id="1ftpclient">1. 安裝 FTP client</h2>
<p>首先叫你的軟體中心出來（圖中右邊的圖案）<br>
<img src="https://i.imgur.com/iYYs115.png" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"></p>
<p>在軟體中心的搜尋列（下圖上方）搜尋 FileZilla<br>
<img src="https://i.imgur.com/vlKq6XE.png" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"></p>
<p>然後按下右邊的 install<br>
<img src="https://i.imgur.com/lyRJfwH.png" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"></p>
<p>在 Ubuntu 只要是安裝或移除程式通常都需要輸入密碼哦。<br>
<img src="https://i.imgur.com/ro4cuvq.png" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"></p>
<p>輸入密碼之後就會開始安裝，<br>
這邊就稍微等它一下。<br>
裝好之後應該在左邊選單會出現最下方紅底白字 FZ 的按鈕。<br>
<img src="https://i.imgur.com/Ymy2zOt.png" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"></p>
<h2 id="2">2. 設定站台</h2>
<p>首先開啟你的 FZ，<br>
找到左上角那個看起來像是伺服器的按鈕。<br>
<img src="https://i.imgur.com/iPUGzG5.png" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"></p>
<p>點下去之後會跳出站台管理員的視窗，<br>
選擇左下方的新增站台，<br>
新增站台時需要填入站台名稱，<br>
名稱不影響任何作業，<br>
不過還是取個讓自己不會混淆的名稱較好。</p>
<p><img src="https://i.imgur.com/3v9wuav.png" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"></p>
<p>接著在 Host 貼上 <code>ws1.ccserver.ncnu.edu.tw</code>，<br>
Protocol 選擇圖中的 <code>FTP - File Transfer Protocol</code>，<br>
Encryption 選擇圖中的 <code>Require explicit FTP over TLS</code>，<br>
Logon Type 選擇 <code>Normal</code><sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup><br>
User 填入 <code>ccserver\yourUserName</code><br>
Password 輸入你的密碼。<br>
然後就完成了。<br>
<img src="https://i.imgur.com/owknDm5.png" alt="在 Ubuntu 16.04 存取暨南大學的 CC Server"><br>
在進階設定的地方也可以改一下預設連線的遠端資料夾為何，<br>
如上圖 Default remote diretory 的地方，<br>
這樣才不用每次都從茫茫大海裡面找到你的群組資料夾 Orz。</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>這邊跟學校的教學不太一樣，如果照學校的設定，每次存取檔案都需要再輸入一次帳號密碼 <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[就是要看通靈少女]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id>前言</h1>
<p>最近在公共電視播出的通靈少女非常的紅，雖然學校宿舍仍有電視但對於菸酒生來說還是非常不方便的，多半選擇網路來源來進行觀賞。</p>
<p>但是！！ 竟然有賞味期限為 4/9，只好來解析一下是否在過期之後繼續觀賞影片的方式。<br>
<img src="https://blog.moli.rocks/content/images/2017/04/Screenshot-from-2017-04-09-12-12-58.png" alt="賞味期限"></p>
<h1 id>分析一下</h1>
<p>身為一個網頁開發者，不免俗得還是要打開開發者工具來瞧瞧</p>
<p><img src="https://blog.moli.rocks/content/images/2017/04/Screenshot-from-2017-04-09-12-24-43.png" alt></p>
<p>由於它的連結中已經有做過一些處理，並無法直接打開連結網頁，只好選擇登入了公視 +7 了。</p>
<p>在登入之後，點擊影片的 icon 之後便會跳出一播放器來進行播放，就可以很開心的用 Console 來 <code>document.getElementsByTagName('video')</code> 取得 <code>video</code> 的來源。</p>
<p>這邊要比較注意的是，它彈出來的畫面是插入一個 HTML5 Frame，我們必須選擇 <code>videojs5.htm</code> 頁面來取得資料，如下圖。</p>
<p><img src="https://blog.moli.rocks/content/images/2017/04/Screenshot-from-2017-04-09-12-04-16.png" alt></p>
<p>打開該<a href="http://vqos.cdn.hinet.net/videojs5.htm?src=http%3A%2F%2Fplus7hd-pts.cdn.hinet.net%2Fpts-plus7hd%2F_definst_%2Fsmil%3Ambroutput%2F169%2F7_SUN%2F0402-1_LOGO%2F0402-1_LOGO.smil%2Fplaylist.m3u8%3Ftoken%3D_9QdyUxawf4dDFIpkdY_2Q%26expires%3D1491753599&amp;autoplay=true">純播放器網址</a>後，會發現到這個連結是<strong>不需要登入</strong>即可觀賞。在網頁播放器的部份，選擇了開源的 <a href="http://videojs.com/">video.js</a> 並使用</p>]]></description><link>https://blog.moli.rocks/2017/04/09/watching-the-teenage-psychic/</link><guid isPermaLink="false">597afa1a43dc0337f4e84a63</guid><dc:creator><![CDATA[Jerry Wang]]></dc:creator><pubDate>Sun, 09 Apr 2017 05:22:27 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2017/04/bn1-1.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id>前言</h1>
<img src="https://blog.moli.rocks/content/images/2017/04/bn1-1.jpg" alt="就是要看通靈少女"><p>最近在公共電視播出的通靈少女非常的紅，雖然學校宿舍仍有電視但對於菸酒生來說還是非常不方便的，多半選擇網路來源來進行觀賞。</p>
<p>但是！！ 竟然有賞味期限為 4/9，只好來解析一下是否在過期之後繼續觀賞影片的方式。<br>
<img src="https://blog.moli.rocks/content/images/2017/04/Screenshot-from-2017-04-09-12-12-58.png" alt="就是要看通靈少女"></p>
<h1 id>分析一下</h1>
<p>身為一個網頁開發者，不免俗得還是要打開開發者工具來瞧瞧</p>
<p><img src="https://blog.moli.rocks/content/images/2017/04/Screenshot-from-2017-04-09-12-24-43.png" alt="就是要看通靈少女"></p>
<p>由於它的連結中已經有做過一些處理，並無法直接打開連結網頁，只好選擇登入了公視 +7 了。</p>
<p>在登入之後，點擊影片的 icon 之後便會跳出一播放器來進行播放，就可以很開心的用 Console 來 <code>document.getElementsByTagName('video')</code> 取得 <code>video</code> 的來源。</p>
<p>這邊要比較注意的是，它彈出來的畫面是插入一個 HTML5 Frame，我們必須選擇 <code>videojs5.htm</code> 頁面來取得資料，如下圖。</p>
<p><img src="https://blog.moli.rocks/content/images/2017/04/Screenshot-from-2017-04-09-12-04-16.png" alt="就是要看通靈少女"></p>
<p>打開該<a href="http://vqos.cdn.hinet.net/videojs5.htm?src=http%3A%2F%2Fplus7hd-pts.cdn.hinet.net%2Fpts-plus7hd%2F_definst_%2Fsmil%3Ambroutput%2F169%2F7_SUN%2F0402-1_LOGO%2F0402-1_LOGO.smil%2Fplaylist.m3u8%3Ftoken%3D_9QdyUxawf4dDFIpkdY_2Q%26expires%3D1491753599&amp;autoplay=true">純播放器網址</a>後，會發現到這個連結是<strong>不需要登入</strong>即可觀賞。在網頁播放器的部份，選擇了開源的 <a href="http://videojs.com/">video.js</a> 並使用 plugin<br>
<a href="https://github.com/streamroot/videojs5-hlsjs-source-handler">videojs5-hlsjs-source-handler</a>。</p>
<p><a href="https://zh.wikipedia.org/wiki/HTTP_Live_Streaming">HTTP Live Streaming（HLS）</a>，是因應現在多元化的使用裝置解析度，透過碎片化檔案，讓使用者區讀取到哪一片段在進行下載檔案，而言伸出來的一種協定。</p>
<p>再次開啟開發者工具，Network 頁面，可以查看到 <code>playlist.m3u8</code> 的清單</p>
<blockquote>
<p>M3U 是一種播放多媒體列表的檔案格式，它的設計初衷是為了播放音訊檔案，比如 MP3，但是越來越多的軟體現在用來播放影片檔列表，M3U 也可以指定線上串流媒體音訊源。很多播放器和軟體都支援 M3U 檔案格式。--From Wiki</p>
</blockquote>
<p><img src="https://blog.moli.rocks/content/images/2017/04/Screenshot-from-2017-04-09-12-07-57.png" alt="就是要看通靈少女"></p>
<p>簡單來說，<code>playlist.m3u</code> 定義了</p>
<ul>
<li>解析度：<code>1920x1080</code>、<code>1280x720</code>、<code>854x480</code></li>
<li>token</li>
<li>expires</li>
</ul>
<p>當解析度為 <code>1920x1080</code> 就會取得 <code>chunklist_b4000000.m3u8</code> 的播放清單，在 chunklist 裡面清楚定義有多少檔案及每個檔案播放長度。</p>
<p><img src="https://blog.moli.rocks/content/images/2017/04/Screenshot-from-2017-04-09-12-08-11.png" alt="就是要看通靈少女"></p>
<p>換言之，我們已經知道共有 227 個檔案，而且檔名皆為 <code>media_b4000000_[xx].ts</code><br>
所以就能撰寫一個小 shell script 來幫我們備份影片了（？</p>
<pre><code class="language-bash=">#! /bin/bash

for i in {0..237}
do
   wget &quot;http://plus7hd-pts.cdn.hinet.net/pts-plus7hd/_definst_/smil:mbroutput/169/7_SUN/0402-1_LOGO/0402-1_LOGO.smil/media_b4000000_$i.ts&quot;
done
</code></pre>
<p>最後，你只需要一個播放器可以播放 <code>.ts</code> 的影片格式，及我們剛剛的 <code>chunklist.m3u8</code> 的檔案，便可以觀賞影片了。</p>
<p>或是可以透過 <code>ffmpeg -i chunklist_b4000000.m3u -c copy -bsf:a aac_adtstoasc output.mp4</code> 來轉出成 MP4 檔案來觀賞</p>
<h1 id>附註</h1>
<p>若要用此方法請注意版權問題記得要刪掉，大家支持正版喔～</p>
<p>然後，通靈少女是一部值得推薦的戲劇，還有瑤瑤好正 XDDDDDDDD</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[2017 SITCON Review]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id>攤位</h2>
<p>今年的 SITCON 我反而沒有花那麼多時間去聽演講, 因為 <strong>NCNU</strong> X <strong>MOLi</strong> X <strong>OSSPlanet</strong> 今年變成贊助商攤販了！ 身為潛水成員, 平常都只在 Telegram 出現, 這種時候總該要出來露個臉</p>
<p><img src="https://blog.moli.rocks/content/images/2017/03/IMG20170318124359.jpg" alt><br>
<strong>NCNU X MOLi X OSS Planet 攤位照</strong></p>
<h4 id="molimakersopenlabforinnovation">MOLi (Maker's Open Lab for Innovation) 創新自造者開放實驗室 (<a href="https://moli.rocks/">詳細介紹請點此進入</a>)</h4>
<p>老屁股們好久不見, 有人從前端跨資安跟 Blockchain, 有人專案還沒討論就可以自己把網站做完, 有人準備要投論文結果是我們實驗室協辦的 conference, 有人是持續跳坑, 每次聊天除了屁話其實都還是有種我在跟大大們對話的感覺</p>
<h4 id="ossplanet">OSS Planet (<a href="http://ossplanet.net/">詳細介紹請點此進入</a>)</h4>
<p>順便在這邊幫忙推廣一下, 這是一個可以幫 Open Source 做 Free hosting 的一個服務,</p>]]></description><link>https://blog.moli.rocks/2017/03/18/2017-sitcon-review/</link><guid isPermaLink="false">597afa1a43dc0337f4e84a60</guid><category><![CDATA[SITCON]]></category><category><![CDATA[conference]]></category><category><![CDATA[review]]></category><dc:creator><![CDATA[Chen-Ming Yang]]></dc:creator><pubDate>Sat, 18 Mar 2017 15:19:38 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2017/03/15271874_1166608823437895_7159595368715420385_o.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>攤位</h2>
<img src="https://blog.moli.rocks/content/images/2017/03/15271874_1166608823437895_7159595368715420385_o.jpg" alt="2017 SITCON Review"><p>今年的 SITCON 我反而沒有花那麼多時間去聽演講, 因為 <strong>NCNU</strong> X <strong>MOLi</strong> X <strong>OSSPlanet</strong> 今年變成贊助商攤販了！ 身為潛水成員, 平常都只在 Telegram 出現, 這種時候總該要出來露個臉</p>
<p><img src="https://blog.moli.rocks/content/images/2017/03/IMG20170318124359.jpg" alt="2017 SITCON Review"><br>
<strong>NCNU X MOLi X OSS Planet 攤位照</strong></p>
<h4 id="molimakersopenlabforinnovation">MOLi (Maker's Open Lab for Innovation) 創新自造者開放實驗室 (<a href="https://moli.rocks/">詳細介紹請點此進入</a>)</h4>
<p>老屁股們好久不見, 有人從前端跨資安跟 Blockchain, 有人專案還沒討論就可以自己把網站做完, 有人準備要投論文結果是我們實驗室協辦的 conference, 有人是持續跳坑, 每次聊天除了屁話其實都還是有種我在跟大大們對話的感覺</p>
<h4 id="ossplanet">OSS Planet (<a href="http://ossplanet.net/">詳細介紹請點此進入</a>)</h4>
<p>順便在這邊幫忙推廣一下, 這是一個可以幫 Open Source 做 Free hosting 的一個服務, 目前已經有蠻多比較大的服務在上面做 hosting 或是 mirror</p>
<p><img src="https://blog.moli.rocks/content/images/2017/03/IMG20170318204920.jpg" alt="2017 SITCON Review"><br>
<strong>OSS Planet sticker #JustGoOpen</strong></p>
<h4 id="ethereumtaipeimeetup">Ethereum Taipei meetup</h4>
<p>這是今年有特別注意到的攤位, 因為區塊練跟虛擬貨幣的東西我一直沒有甚麼接觸, 僅僅知道這個東西的存在以及一堆人在玩　Bitcoin 跟挖礦而已, 這方面的 pickup 應該是今天我收穫最多的東西, 詳細的內容應該會再後面演講的部份一並提到</p>
<p>順便紀錄一下 @focaaby 大大給我的文章, 用白話文解釋區塊鍊並提及一些區塊練的問題, 我以一個完全沒接觸過區塊鍊資訊的人看完文章, 覺得蠻平易近人而且簡潔扼要, 希望給一些想要了解的人參考看看</p>
<p>reference:<br>
<a href="https://www.facebook.com/notes/shi-cho-cha/%E6%AF%8F%E6%97%A5%E9%96%B1%E8%AE%80%E5%BF%83%E5%BE%97-20170317/10155112963374483/">https://www.facebook.com/notes/shi-cho-cha/每日閱讀心得-20170317/10155112963374483/</a></p>
<h2 id>演講</h2>
<p>剛剛上面也有提到, 今年沒有參加太多場演講, 也不打算講太多演講的技術細節</p>
<h4 id="mmrpineapplekao">十分鐘認識 MMR (PineApple Kao)</h4>
<p>MMR (Montgomery Modular Reduction),　主要是用來解決大數在做 mod (也就是算除法的餘數) 造成的龐大運算資源問題, 透過一些數學證明, 省略除法步驟達到 mod 的目的</p>
<p>可能大家一樣都有意會到這是實際上非常需要注意的問題, 首先不可能讀一個很大的數字再來做運算, 大部分的人都是做 mod 讓數字變小, 然後再對這個數字做運算, 之後再重複這個過程, 因此實際上耗費的運算資源是相對龐大的, 但至少讓大數運算變成一個可以實作的解法之一</p>
<p>數學細節這邊暫且不提, 但是我覺得內容以十分中的時間來說是相對有邏輯並且實際, 唯一可惜的就是 R1 當時人數多到有點誇張</p>
<hr>
<h4 id="mlterrycheong">所以我說那個 ML 入門其實真的沒想像中那麼難 (Terry Cheong)</h4>
<p>可能因為自己有稍微接觸 Machine Learning 的東西, 這場演講反而是抱持著不知道十分鐘可以說些甚麼的心態去的</p>
<p>雖然有稍微介紹到何謂 Machine Learning, 但是我覺得解釋起來好像還是不夠清楚, 到目前為止我覺得直接參考 Tom M.Mitchell 的比較適合</p>
<blockquote>
<p>A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P if its performance at tasks in T, as measured by P, improves with experience E<br>
<small>from <a href="https://en.wikipedia.org/wiki/Machine_learning">wikipedia</a></small></p>
</blockquote>
<p>然後講者說明了 Machine Learning 的過程, 以及一些常見的演算法</p>
<ul>
<li>decision tree</li>
<li>random forest</li>
<li>gradient descent</li>
</ul>
<p>最後講解實作技術使用的是 scikit-learn, 概略描述建 model 的過程, 只是這邊發現講者頭影片上用的 gradient descent 是 stochastic gradient descient 但是卻沒有解釋這是甚麼東西, 果然以十分鐘的長度連 stochastic / batch / mini-batch 的概念都沒辦法完整描述完畢</p>
<p>紀錄一下講者補充的好玩套件: <a href="http://www.r2d3.us/visual-intro-to-machine-learning-part-1/">r2d3</a>, 這是一個 R package, 主要是做視覺化的套件</p>
<p>感想就是果然十分鐘講這麼大的主題還是太短</p>
<hr>
<h4 id>和我簽訂契約成為區塊鍊魔法少女吧 (飛魚)</h4>
<p>...先不要討論魔法少女跟庫洛魔法使大家有沒有聽過, 這場演講是我整天聽下來最好的演講, 從投影片到演講方式到內容深度完全適合當概論</p>
<p>這場主要是在說 Ethereum 跟智慧合約的部份, 前面稍微比較了 Bitcoin 跟 Ethereum 的差別, Ethereum 感覺更容易用現在人類的交易模式解釋, 透過挖礦或是購買得到足夠的手續費 (Gas), 然後才可以透過區域鍊做交易的動作, 透過這個機制的實作來限制交易量, 也才因此讓 Ethereum 再實作上可以使用迴圈, 所以如果你有足夠多的手續費...</p>
<blockquote>
<p>如果你有很多錢, 這世界就會為你而轉動 <small>飛魚</small></p>
</blockquote>
<p>在上面 @focaaby 大大分享給我的文章裏面也有提到, 區塊鍊基本上就是透過讓大多數人認可達到信賴的技術, 這邊在定義何謂「大多數」的認可時候, 我覺得也是一個蠻有趣的思考面</p>
<p>另外說到區塊練上的資料是無法被更改的時候, 講者提到的小插曲也蠻讓我印象深刻的</p>
<blockquote>
<p>2/14 情人節當天有挖礦工司提供一個服務, 讓情人可以把我愛你的字句存入區塊鍊中, 因為區塊鍊的資料是無法被更改的, 所以就算以後你不愛她了, 也無法改變你曾經愛過他的事實<small>飛魚</small></p>
</blockquote>
<p>我真的滿喜歡這種有趣的小八卦</p>
<hr>
<h4 id>開發學校雲端服務的奇技淫巧 (馬聖豪)</h4>
<p>又是一個因為學校網站相關服務太難用, 所以乾脆自幹一個的作品, 感覺在各大校園都會有這個問題, 從首頁設計到選課系統, 總是會有些服務沒辦法滿足學生</p>
<p>雖然演講題目是雲端服務, 但其實就是說明一個第三方服務的架構跟流程設計, 學生提供帳密給該服務, 該服務再把這些個人資料送 requests 到學校主機取得學生的資料, 然後用更好看的 UI 跟 UX 設計呈現給學生使用</p>
<p>剛好最近做了一個爬蟲專案 (這個有機會再寫成文章), 所以讀了一些瀏覽器如何跟網站做互動的資料, 這場演講我才聽的懂, 內容包含動態網頁分析, header 內容, 常見的擋 bot 作法, 只是我到現在還在想破解 CAPTCHA 的方式除了講者的方法, 感覺簡單的英文或數字 CAPTCHA, 建個簡單的圖像辨識 + Machine Learning Model 似乎更好一些？只是不知道會不會有點殺雞用牛刀的感覺</p>
<p>這場演講比較適合有實作過一些東西的人參加, 內容都有說到痛點</p>
<h2 id="lightningtalk">Lightning talk</h2>
<p>每次 conference 的 lightninh talk 真的都蠻精彩的, 這次的亮點之一就是最近再網路上瘋狂轉載的文章「<a href="https://www.ptt.cc/bbs/graduate/M.1489646585.A.95D.html">台大資工短時間上榜心得</a>」神人本人親自現身, 4~5 天準備台大資工考試, 然後正取一這件事情本身本來就是很狂的事情了, 看到本人演講更有種他真的是奇葩的感覺</p>
<p>另外, 我其實一直都很喜歡像是 PCC 或是 Denny 那種統計總結今年年會的一些數據, 當然還有那種 UCCU 的演講方式</p>
<h2 id>總結</h2>
<p>這次跟以往相比我花了比較多時間跟人討論, 感覺這樣 pickup 的東西更多, 然後 BlockChain 果然還是我今天最有感的領域</p>
<p>議程我比較偏好長度 40 分鐘以上的內容, 十分鐘比較像是 Lighting talk 的演講方式, 但講者常常會一直想要補充更多東西導致東西講不完</p>
<p>然後聽到 SITCON X HK 的心得感想覺得有點可惜, 也開始好奇香港那邊的資訊圈發展情況是如何？</p>
<blockquote>
<p><small>最後感謝 SITCON 小編讓我轉載 Cover</small></p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[資料分析入門：具有影響力的文章關鍵字]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>這次的分享主要是針對入門的文本分析步驟，雖然沒有太多技術細節，但至少可以讓沒有接觸過這一塊的人了解可能的作法與需要的工具</p>
<p>資料分析可以簡單的分為三大步驟：</p>
<ul>
<li>收集資料</li>
<li>過濾資料</li>
<li>顯示資料</li>
</ul>
<p><strong>收集資料</strong></p>
<p>爬蟲（Crawling）是一種收集資料的手段，針對網站可以分析 <code>html</code> 架構之後再透過相關 http client 的 library 撰寫程式取得資料，像是 <code>python</code> 的 <code>requests</code> 與 <code>BeautifulSoup</code> 的搭配使用</p>
<p>另外如果該網站或是該服務有提供 API，那我們只要透過 API 做 request 就可以拿到整理好的資料（通常格式都會是 <code>csv</code>，<code>xml</code>，<code>json</code> 其中一種）</p>
<p><strong>過濾資料</strong></p>
<p>拿完資料之後，不論是<a href="https://kevinwang.gitbooks.io/bigdata/content/general/structured-data.html">結構式資料或是非結構式資料</a>，原始資料內都會有許多不會影響到你的決策但卻會干擾分析的資料，我們稱之為噪音（noise）</p>
<p>一開始很難得知哪些資料是噪音，因此必須透過一些指標來整理並判斷過濾資料，而這些步驟會不斷重複，直到你覺得資料已經出現趨勢時就可以停止</p>
<p><strong>顯示資料</strong></p>]]></description><link>https://blog.moli.rocks/2017/01/14/analyze-facebook-keywords/</link><guid isPermaLink="false">597afa1a43dc0337f4e84a5d</guid><category><![CDATA[data]]></category><category><![CDATA[analyze]]></category><category><![CDATA[facebook]]></category><category><![CDATA[correlation]]></category><category><![CDATA[pvalue]]></category><category><![CDATA[R]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Chen-Ming Yang]]></dc:creator><pubDate>Sat, 14 Jan 2017 11:43:02 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2017/01/t5bva-q_m_y-luis-llerena.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.moli.rocks/content/images/2017/01/t5bva-q_m_y-luis-llerena.jpg" alt="資料分析入門：具有影響力的文章關鍵字"><p>這次的分享主要是針對入門的文本分析步驟，雖然沒有太多技術細節，但至少可以讓沒有接觸過這一塊的人了解可能的作法與需要的工具</p>
<p>資料分析可以簡單的分為三大步驟：</p>
<ul>
<li>收集資料</li>
<li>過濾資料</li>
<li>顯示資料</li>
</ul>
<p><strong>收集資料</strong></p>
<p>爬蟲（Crawling）是一種收集資料的手段，針對網站可以分析 <code>html</code> 架構之後再透過相關 http client 的 library 撰寫程式取得資料，像是 <code>python</code> 的 <code>requests</code> 與 <code>BeautifulSoup</code> 的搭配使用</p>
<p>另外如果該網站或是該服務有提供 API，那我們只要透過 API 做 request 就可以拿到整理好的資料（通常格式都會是 <code>csv</code>，<code>xml</code>，<code>json</code> 其中一種）</p>
<p><strong>過濾資料</strong></p>
<p>拿完資料之後，不論是<a href="https://kevinwang.gitbooks.io/bigdata/content/general/structured-data.html">結構式資料或是非結構式資料</a>，原始資料內都會有許多不會影響到你的決策但卻會干擾分析的資料，我們稱之為噪音（noise）</p>
<p>一開始很難得知哪些資料是噪音，因此必須透過一些指標來整理並判斷過濾資料，而這些步驟會不斷重複，直到你覺得資料已經出現趨勢時就可以停止</p>
<p><strong>顯示資料</strong></p>
<p>也就是所謂的資料視覺化（Data Visualization），針對你想呈現的訊息，研究怎樣的呈現方式可以讓人一目了然</p>
<p>這邊想特別提到一篇最近看到的文章：<a href="https://medium.com/@noelfish/%E4%BF%A1%E6%81%AF%E5%9C%96%E8%A1%A8%E6%98%AF%E5%A6%82%E4%BD%95%E7%85%89%E6%88%90%E7%9A%84-%E4%B8%80-%E5%9C%93%E5%BD%A2%E8%88%87%E7%B7%9A%E6%A2%9D-%E6%B5%B7%E5%A4%96%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-71ae17396497#.lxa78lwwr">信息圖表是如何煉成的（一）：圓形與線條 | 海外學習筆記</a>。雖然說文章中提到的視覺化程度可以算是尾聲的階段，但是這種可以很直觀傳遞資料意涵的圖表的確是所有資料科學家可以努力的方向</p>
<p>前面資料分析的階段很重要，但是視覺化的這部份也需要花時間好好研究，就像網站設計如果 UI/UX 不好，我覺得會讓事前準備的那些工作全都事半功倍</p>
<h2 id>目標</h2>
<p>接下來要分享的這些流程是我從毫無經驗的狀態，花了大約兩個禮拜做的東西，因此覺得這對於完全沒有學過資料分析的人，門檻應該算是相對來的低，但是同樣的這些也只是很初步的分析</p>
<p>這篇文章的目標是「分析 Facebook 粉絲團貼文內容與按讚數，分享數之間的關聯性」，對於需要做網路行銷，社群行銷的人，可能幫的上一點忙，在購買 Facebook 廣告之餘，了解你的目標族群喜好的關鍵字與內容</p>
<p>初步期待的結果是最後可以得到以下這種圖表</p>
<p><img src="https://blog.moli.rocks/content/images/2016/12/message_data.png" alt="資料分析入門：具有影響力的文章關鍵字"></p>
<h2 id>收集資料</h2>
<p>目標是讓新手可以快速取得一些資料並開始著手進行分析，因此在收集資料這塊，打算用比較簡單的方式</p>
<p>取得 Facebook 資料除了可以透過分析網頁然後做爬蟲（較難的方式）以外，還可以透過 Facebook 所提供的 <a href="https://developers.facebook.com/tools/explorer">Graph API</a> 取得，相關的 API 文件可以去<a href="https://developers.facebook.com/docs/graph-api">官網</a>查詢，而我這次要使用的是透過 Python 的 <code>requests</code> library 搭配 Facebook URL API，取得文章內容，按讚數量，以及分享數量</p>
<blockquote>
<p><small>在<a href="https://developers.facebook.com/docs/">官網</a>上你可以看到他有列出一些 SDK（Software Development Kit），這邊只是提供其他管道做爬蟲，但是跟我接下來的內容沒有甚麼直接關係</small></p>
</blockquote>
<p>Facebook 爬蟲要做的第一件事情就是要取得 Access token，這個在 <a href="https://developers.facebook.com/tools/explorer">Graph API</a> 中就可以取得，直接複製貼上到我們的程式之中使用即可，但是在這邊需要提醒一件事情，那就是 <strong>Access token 有效期限</strong>，某些 application 在使用之前會要求 Facebook login，這就是為了取得有效的 Access token。如果未來你要用同一份程式碼爬蟲，記得要更新 Access token，更詳細的 Token 可以參考<a href="https://developers.facebook.com/docs/facebook-login/access-tokens/expiration-and-extension">官網</a>文件</p>
<blockquote>
<p><small>Native <strong>mobile apps</strong> using Facebook's SDKs will get long-lived access tokens, good for about <strong>60 days</strong>.</small><br>
<small>Access tokens on the <strong>web</strong> often have a lifetime of about <strong>two hours</strong></small></p>
</blockquote>
<p>雖然還是有方法可以延長 Access token 有效期限，甚至可以取得永久 Access token，但我個人覺得不太安全也沒有必要</p>
<p>回到正題，Facebook 爬蟲要做的第二件事情是要取得你想要分析的粉絲團 id，同樣的，這件事情可以透過 <a href="https://developers.facebook.com/tools/explorer">Graph API</a> 取得，這邊以 Moli 社團為例，進入臉書頁面之後將上面的網址複製貼到 Graph API 上，submit 之後你可以透過回傳物件看到 id</p>
<p><img src="https://blog.moli.rocks/content/images/2017/01/Screenshot-from-2017-01-08-15-11-59.png" alt="資料分析入門：具有影響力的文章關鍵字"></p>
<pre><code class="language-python">import requests
import json

token = '...'
id = '...'

# 透過 python request 接 facebook URL API 拿到我們所需要的資料
all_post = requests.get('https://graph.facebook.com/v2.8/{id}?fields=posts.limit(100){{id,created_time,name,likes.limit(0).summary(true),shares,message}}&amp;access_token={token}'.format(id=id, token=token))

# 透過 python json 將 response 轉為 json 物件
all_post = all_post.json()
</code></pre>
<p>透過上面的程式碼我們會拿到以下這種格式的回傳物件</p>
<pre><code class="language-json">{
  &quot;id&quot;: &quot;...&quot;, # 你要搜尋的粉絲團或是社團 id
  &quot;posts&quot;: {
    # 因為 facebook API 會限制單次回傳的文章數量
    # 所以要透過不斷的 request &quot;paging&quot; 中的 &quot;next&quot; 取得其他文章
    &quot;paging&quot;: { 
      &quot;next&quot;: &quot;...&quot;,
      &quot;previous&quot;: &quot;...&quot;
    }
    &quot;data&quot;: [
      &quot;id&quot;: &quot;...&quot;, # 文章 id
      &quot;message&quot;: &quot;...&quot;, # 臉書貼文文章
      &quot;name&quot;: &quot;...&quot;, # 外部連結標題
      &quot;created_time&quot;: &quot;...&quot;,
      &quot;shares&quot;: {&quot;count&quot;: ...},
      # 這邊我們只需要 &quot;total_count&quot;，所以可以在爬蟲之後重新修改一下 json 結構
      &quot;likes&quot;: {
        &quot;data&quot;: [],
        &quot;can_like&quot;: ...,
        &quot;has_like&quot;: ...,
        &quot;total_count&quot;: ...
      }, ...
    ]
  }
}
</code></pre>
<p>這邊提供幾個對 python 比較不熟的初學者，可能會用到的 Tips</p>
<pre><code class="language-python"># 想要在 terminal　上看有階層式的資料（e.g. json, dict）
from pprint import pprint
pprint(all_posts)

# 過濾臉書發文的時間（e.g. 我只想分析近兩年的文章趨勢）
# facebook time stamp format example: &quot;2015-04-10T08:40:00+0000&quot;
# 轉成 datetime 物件再去做處理會比較恰當
from datetime import datetime
dt = datetime.strptime(&quot;2015-04-10T08:40:00+0000&quot;, '%Y-%m-%dT%H:%M:%S+0000')
dt.year # output: 2015

# 透過文章 id 過濾重複文章
list({ i['id']:i for i in all_posts['posts']['data'] }.values())

# 將處理完的資料存成 json
# 透過 `with` 會在文件操作結束之後自動幫你 file close
# 如果你需要直接看 json file，可以在 json.dump 加上 indent，但是檔案容量會比較大
# 所以如果要餵給其他檔案做讀取時，建議不要使用
import json
with open('data.json', 'w+') as f:
  json.dump(all_posts, f, indent=2)
</code></pre>
<h2 id>過濾資料</h2>
<p>從這邊開始會一邊說明基本過濾資料流程，一邊透過 <code>R</code> 來說明實作部份的程式碼，但不包含太多 <code>R</code> 的基本操作</p>
<p>利用 <code>R</code> 來做 Text mining 之前，我們需要先對我們要分析的標題或是內文做斷詞，而目前比較多人用來做中文斷詞的是 jieba（<a href="https://github.com/fxsjy/jieba">python</a> <a href="https://github.com/qinwf/jiebaR">R</a>）。而斷詞的準確率會直接影響到後面做的分析，所以這邊我會先說明幾項斷詞需要注意的事項</p>
<p><strong>字典</strong></p>
<p>字典的功能就是所謂的查表，我要讓程式知道哪些文字組合在一起是一個單字，這邊其實 jieba 本身就有字典檔，但對於繁體中文字的處理其實並沒有很好，所以這邊可以去網路上找一些繁體中文字的字典檔。打開字典檔你會發現有許多筆語料資料，語料資料同常會包含<strong>單字</strong>，<strong>權重</strong>，<strong>詞性</strong>等，所以其實你也可以自己定義字典檔</p>
<p><strong>停止詞 stop words</strong></p>
<p>所謂的停止詞就是一些對文章沒有實質上的影響，頻率卻很高的字，像是「首先」「非常」或是一些連接詞。由於我們要做的是尋找關鍵字，所以停止字也是我們要過濾的噪音之一，而這個其實可以在斷字的時候就將其排除，同樣的，這邊也是可以自己定義哪些屬於停止詞，但是這邊可以很簡單存成 csv 就可以了</p>
<h4 id="1">1. 讀檔</h4>
<p>我們在上面用 python 蒐集完資料之後存成 json 檔，現在我們要用 R 讀進剛剛的 json 檔</p>
<pre><code class="language-R">install.packages(rjson, dependency = T)
library(rjson)
json_data &lt;- fromJSON(file = &quot;data.json&quot;, method = &quot;C&quot;)
</code></pre>
<p><strong>備註</strong></p>
<p>安裝 packages 的時候你可以直接打 <code>install.packages(rjson)</code>，也可以打 <code>install.packages(&quot;rjson&quot;)</code>，雖然看起來沒甚麼不同，但這算是蠻進階的 R Tips，這個我覺得蠻有趣的可以研究一下 <code>NSE（Non-standard evaluation）</code></p>
<blockquote>
<p><small>NSE is particularly useful for functions when doing interactive data analysis because it can dramatically reduce the amount of typing</small></p>
</blockquote>
<h4 id="2">2. 斷字</h4>
<p>首先我們要先引入 jiebaR，這邊安裝的的方法都一樣，然後要宣告一個 worker，你可以把他想成斷字器，在這邊我們可以使用自己定義的字典檔</p>
<pre><code class="language-R">install.packages(jiebaR, dependency = T)
library(jiebaR)
cutter &lt;- worker(user = &quot;user.dict.new.txt&quot;)
</code></pre>
<p>接著我們要注意一件事情，那就是剛剛透過 <code>R</code> 讀進來的 json 檔案格式，在 <code>R</code> 裏面並沒有 <code>json</code> 這種資料格式，取而代之的是利用 list of list 的方式儲存</p>
<p><code>R</code> 眾所皆知的是適合拿來做矩陣運算，向量運算等等的程式語言，做 for loop 這種操作反而很沒有效率，所以通常大家會使用 <code>apply</code>，<code>lapply</code> 等等的方式取代 for，在這邊其實還可以透過平行運算加速，也就是我們接下來要安裝的 parallel。我們可以利用 parallel library 中的 <code>mclapply</code> 來讓斷字的過程加速</p>
<pre><code class="language-R">install.packages(parallel, dependency = T)
library(parallel)

# define as function
# 這邊針對標題（name）做範例介紹斷字流程，並使用自定義停止詞將其排除
stopwords &lt;- read.csv(file = &quot;stopwords.csv&quot;, header = F)$V1
break.file &lt;- function (f) {
  mclapply(1:length(f), function (x) {
    if (&quot;name&quot; %in% names(f[[x]])) {
      # 1. 這邊我不會讓斷字結果把原本的標題取代掉，這樣後面要看關鍵字範例會比較方便
      f[[x]]$raw_name &lt;- f[[x]]$name
      
      # 2. 斷字 &gt; 過濾 stopwrods &gt; 過濾英文數字 &gt; 過濾空白
      segment.words &lt;- segment(f[[x]]$name, cutter)
      segment.words &lt;- filter_segment(segment.words, stopwords)
      segment.words &lt;- gsub(&quot;[0-9A-z]+?&quot;, &quot;&quot;, segment.words)
      segment.words &lt;- str_trim(segment.words)
      segment.words &lt;- segment.words[segment.words != &quot;&quot;]

      f[[x]]$name &lt;- segment.words
    }
    f[[x]]
  })
}

</code></pre>
<h4 id="3">3. 頻率篩選</h4>
<p>接著要進入主要的分析流程，我們要從剛剛所有文本的斷字結果中找出關鍵字，而這並不是單單看出現頻率的高低就可以直接宣稱該單字是關鍵字。可能有字典以外的 stopwords 沒有被過濾掉，或是斷字結果不夠正確的都還是有可能成為資料雜訊，這邊可能就要等最後結果出來之後回頭找文本範例檢查是否真的是關鍵字來判斷</p>
<p>雖然說出現頻率無法直接等於關鍵字，但卻也是其中一項指標，因此我們可以先把剛剛出現的斷字結果拿去計算出現的次數，在 <code>R</code> 裏面可以使用內建函數 <code>freq</code> 簡單的得到結果，接著我們必須思考出現頻率與關鍵字之間的關係，假如說「科學」這個關鍵字幾乎在每篇文章都有出現，他是屬於對讀者有吸引力的關鍵字？或是根本沒有影響力？</p>
<p>以我這次做的分析為例，我認為出現頻率太極端的單字都可以排除在分析以外，出現頻率超過 70% 以上或是低於 1% 以下的單字我都不納入後面的分析流程（這邊只是舉例）</p>
<h4 id="4">4. 權重</h4>
<p>當我們根據頻率篩選完之後，會得到一個比原本斷字結果還要小的單字集合，但是這邊每個單字的權重是否都一樣呢？</p>
<p>回頭思考，我們上一步驟是根據頻率篩選，但這樣結果有可能是<strong>某一個單字在其中一篇文章出現頻率超高，但出現該單字的文章數卻很少</strong>，考慮到這一個狀況，我一開始的作法是建立一張表格，計算該單字是否有出現在文章內，並列出該文章相對應的按讚與分享數</p>
<p><img src="https://blog.moli.rocks/content/images/2017/01/Screenshot-from-2017-01-14-15-54-06.png" alt="資料分析入門：具有影響力的文章關鍵字"></p>
<p>但是後來被建議可以使用 <a href="https://zh.wikipedia.org/wiki/TF-IDF">TF-IDF</a>，這個用於 text mining 的加權技術會同時考慮到出現的文章篇數與出現在同一篇文章內的次數，因此我這個分析後來就用 TF-IDF 重做了</p>
<h4 id="5correlationpvalue">5. 關聯性分析（Correlation &amp; p-value）</h4>
<p>當我們做完頻率的初步篩選以及單字的權重之後，我們接著就要做這些單字跟按讚數以及分享數之間的關聯連性分析，雖然是統計領域，但這些觀念其實國高中應該都有說過</p>
<p>e.g. 當變數 A 的值越來越大時，變數 B 的值也越來越大時我們稱變數 A 與 B 是正相關，反之變數 B 的值越來越小時我們稱變數 A 與 B 是負相關</p>
<p>透過上面的例子來，我可以可以把剛剛得到的「單字在文章中的 TF-IDF value」視做變數 A，而按讚數或是分享數視做變數 B，然後透過 <code>R</code> 內建函數 <code>cor.test</code> 得到兩個變數之間的關聯性，如果自己做測試你會看到類似下面這種格式的東西</p>
<pre><code class="language-R">cor.test(x, y,)

        Pearson's product-moment correlation

data:  x and y
t = 1.8411, df = 7, p-value = 0.05409
alternative hypothesis: true correlation is greater than 0
95 percent confidence interval:
 -0.02223023  1.00000000
sample estimates:
      cor 
0.5711816 
</code></pre>
<p>這邊我們需要的是 <code>cor</code> 與 <code>p.value</code> 這兩個值，在統計學中 p-value 經常被拿來視做統計果的顯著性，剛好最近有些文章在探討，建議有興趣的人可以仔細看一下，這些包含了 p-value 的本質以及虛無假設的相關探討，我會放在後面 reference</p>
<p>雖然說 p-value 有些討論空間，但我們這邊仍然是先根據 p-value 區別關鍵字的顯著性</p>
<ul>
<li><code>p.value &gt;= 0.05</code>：不顯著</li>
<li><code>0.01 &lt;= p.value &lt; 0.05</code>：稍微顯著，我們以 <code>*</code> 標記</li>
<li><code>0.001 &lt;= p.value &lt; 0.01</code>：顯著，我們以 <code>**</code> 標記</li>
<li><code>p.value &lt; 0.001</code>：非常顯著，我們以 <code>***</code> 標記</li>
</ul>
<p>透過這些作法與標記，我們可以個別得到單字跟按讚的關聯性與顯著程度，以及單字跟分享的關聯性與顯著程度，我這邊為了最後要輸出的二維圖，還額外加了一個欄位 <code>significance</code> 代表單字同時對按讚與分享顯著，只對其中一項顯著，或是對兩者都不顯著的標記</p>
<p><img src="https://blog.moli.rocks/content/images/2017/01/Screenshot-from-2017-01-14-17-00-21.png" alt="資料分析入門：具有影響力的文章關鍵字"></p>
<h4 id="6">6. 資料視覺化</h4>
<p>我在這邊使用的是 <code>R</code> 的 <code>ggplot2</code>，這是一個非常強大也非常具有彈性的繪圖函式庫，我在 reference 中也列了一些可以參考的網站，所以這邊我就不多做介紹了</p>
<p>做到最後一步，發現單字太多會造成圖表混亂，所以我這邊會手動挑出比較極端的關鍵字，然後不顯著的我後來也乾脆就不列出來了，因此最後的結果比較會像是以下這種圖</p>
<p><img src="https://blog.moli.rocks/content/images/2017/01/title_pansci_general.png" alt="資料分析入門：具有影響力的文章關鍵字"></p>
<p>當然這是比較一般性的分析，同樣的一份資料我們還可以根據日期看趨勢，以一個月為位移單位，一年份為資料集大小，透過 <code>facet_wrap</code> 可以做出以下這種圖表</p>
<p><img src="https://blog.moli.rocks/content/images/2017/01/title_shares_trend.png" alt="資料分析入門：具有影響力的文章關鍵字"></p>
<p>又或者有特別需要提出來做範例與介紹的關鍵字，我希望知道他在文章中與按讚或是分享數的分佈狀況，可以透過 boxplot 來做，如果要一次呈現二維資料可以參考 <a href="http://docs.ggplot2.org/dev/stat_ellipse.html">stat_ellipse</a></p>
<p><img src="https://blog.moli.rocks/content/images/2017/01/--_likes.png" alt="資料分析入門：具有影響力的文章關鍵字"></p>
<h2 id>結語</h2>
<p>以上列的是在兩個禮拜內從毫無經驗，歷經爬蟲，分析到視覺化的過程，其實這些都只是算是很基礎的資料分析過程，如果有人有看過<a href="http://www.slideshare.net/swchen11/ss-70860055">陳昇瑋老師的報告</a>可能會覺得很多圖表都很像，那是因為我就是直接問那些團隊裏面的人邊學習的，哈哈哈</p>
<p>看完那份報告，其實可以知道我這些只是很初期的分析程度，甚至也還不夠完美，但是對我來說卻是一個很好的練手，如果未來我開始接觸後面那些包含模型的建立，機器學習的部份，我再繼續分享</p>
<p>如果對我這篇文章有任何指正的也歡迎一起討論</p>
<hr>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="http://docs.python-requests.org/en/master/">Python requests</a></li>
<li><a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/">Python BeautifulSoup</a></li>
<li><a href="https://www.r-project.org/nosvn/pandoc/jiebaR.html">R jiebaR</a></li>
<li><a href="https://cran.r-project.org/web/packages/rjson/rjson.pdf">R rjson</a></li>
<li><a href="https://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf">R parallel</a></li>
<li><a href="https://www.r-bloggers.com/how-to-go-parallel-in-r-basics-tips/">R blogger parallel</a></li>
<li><a href="http://adv-r.had.co.nz/Computing-on-the-language.html">R Non-standard evaluation</a></li>
<li><a href="http://r-statistics.co/Complete-Ggplot2-Tutorial-Part1-With-R-Code.html">R ggplot2 tutorial</a></li>
<li><a href="http://cliwc.weebly.com/liwc3693920316332872930524615.html">LIWC</a></li>
<li><a href="http://pansci.asia/archives/110923">p 值的陷阱（上）：p 值是什麼？又不是什麼？</a></li>
<li><a href="http://pansci.asia/archives/111916">p 值的陷阱（下）：「摘櫻桃」問題</a></li>
<li><a href="https://taweihuang.hpd.io/2017/01/11/poorpvalue/">P-值已經死了嗎？莫須有罪名的最大受害者！</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在 Ubuntu 的 NIS 環境底下設定 iptables]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>不論是實體機器或是 VPS (Virtual Private Server)，當手上需要管理的 server 愈來愈多的時候，我們都不希望逐一在 server 上面做設定，於是就有了中央管理的服務出現，<strong>NIS (Network Information Service)</strong> 就是其中一種。</p>
<h3 id="nis">NIS 的安全性</h3>
<p>NIS 比起其他中央管理帳號的服務，安裝與設定是相對簡單，但是安全性來說是相當低的。</p>
<blockquote>
 <p><strong style="color:red;">Anyone who can get access to the daemon can dump your password lists</strong>. If they can do that, then they have your passwords. It doesn't matter that</p></blockquote>]]></description><link>https://blog.moli.rocks/2016/12/24/set-iptables-in-nis/</link><guid isPermaLink="false">597afa1a43dc0337f4e84a59</guid><category><![CDATA[nis]]></category><category><![CDATA[iptables]]></category><category><![CDATA[Ubuntu]]></category><dc:creator><![CDATA[Chen-Ming Yang]]></dc:creator><pubDate>Sat, 24 Dec 2016 14:08:22 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2016/12/fpxoowbr6ls-matthew-henry.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.moli.rocks/content/images/2016/12/fpxoowbr6ls-matthew-henry.jpg" alt="在 Ubuntu 的 NIS 環境底下設定 iptables"><p>不論是實體機器或是 VPS (Virtual Private Server)，當手上需要管理的 server 愈來愈多的時候，我們都不希望逐一在 server 上面做設定，於是就有了中央管理的服務出現，<strong>NIS (Network Information Service)</strong> 就是其中一種。</p>
<h3 id="nis">NIS 的安全性</h3>
<p>NIS 比起其他中央管理帳號的服務，安裝與設定是相對簡單，但是安全性來說是相當低的。</p>
<blockquote>
 <p><strong style="color:red;">Anyone who can get access to the daemon can dump your password lists</strong>. If they can do that, then they have your passwords. It doesn't matter that the passwords are encrypted; they are plaintext equivalent (since authentication is done with encrypted passwords, you don't need to know the text password, you just need to write an app to provide the encrypted one to the authentication system correctly).</p><p><small> [Ubuntu wiki](https://help.ubuntu.com/community/SettingUpNISHowTo) </small>
</p></blockquote>
<p>NIS 自己提供的防護這邊暫且不提，有興趣的可以去看看 <a href="https://help.ubuntu.com/community/SettingUpNISHowTo">Ubuntu wiki</a>，或是透過鳥哥先學概念，但是要注意如果你是用 Ubuntu 的話會發現鳥哥上面的指令或是路徑你會找不到（廢話，人家是用 CentOS）。像是 NIS 要設定 nisdomainname 時，Ubuntu 上並沒有 <code>/etc/sysconfig/network</code>這份檔案，就算查到在 Ubuntu 上面應該是要去找 <code>/etc/network/interfaces</code>，你也看不到上面有 nisdomainname 設定參數（補充：其實直接透過 <code>nisdomainname [domain name]</code> 這個指令就可以設定）。</p>
<h3 id="iptables">設定 iptables</h3>
<h4 id>建議</h4>
<ul>
<li>
<p><strong>NIS slave server</strong>：在設定 iptables 之前有些要建議的事項，如果你管理的 server 有其他人正在使用（e.g. 公司同事），請先確保你有 NIS slave 當備用，不然 iptables 一設定錯誤。你自己被擋掉到還好，全公司的人都被擋掉的話<del>（大家就可以提早下班了）</del>，想也知道這是多麼大的麻煩。</p>
</li>
<li>
<p><strong>local sudo 帳號 or 直接存取</strong>：同樣的，如果對語法不熟常常會自己把自己鎖在門外，人能夠在機器前面最好，local 帳號只能應對 NIS 服務失效，但如果你把所有 IP 都擋掉，還是只能透過 console 直接存取。</p>
</li>
</ul>
<h4 id="nismaster">設定 NIS master</h4>
<p>設定 <code>/etc/hosts.allow</code> 跟 <code>/etc/hosts.deny</code> 以外，比較常用的是設定 iptables，我個人還會裝 <code>iptables-persistent</code>，參考一些網路上的設定方式比較喜歡寫 shell script 然後把 service 跟針對 ip 的規則這些分開，但其實這些都只是個人喜好，最後 iptables rule 設定正確就可以了。</p>
<p><strong>Step 1: 安裝</strong></p>
<pre><code class="language-bash">$ sudo apt-get update
$ sudo apt-get install iptables iptables-persistent
</code></pre>
<p><strong>Step 2: 固定 NIS 需要用到的 port</strong></p>
<p>我個人比較喜歡 INPUT filter policy 設定為 DROP，然後再針對 IP 或是 port 去設定條件，這樣的設定算是比較嚴格，而且設定的過程中，也可以複習一下自己管理的網路架構圖跟開啟的服務有哪些</p>
<p><strong>RPC (Remote Procedure Call) port</strong></p>
<p>NIS 是透過 <strong>RPC</strong> 來做遠端查詢，你可以透過指令 <code>rpcinfo -p</code> 查看詳細資訊。首先要先確定我們有開啟 RPC 服務，看到 <code>portmapper</code> 代表 RPC 有開啟，你可以發現使用的是 port 111，如果你沒看到的話請先執行 <code>sudo service portmap start</code> 開啟服務</p>
<p>幸運的是，RPC 是固定使用 port 111，所以我們後面可以直接針對 port 111 設定防火牆規則</p>
<p><strong>NIS port</strong></p>
<p>如果你一開始在設定 NIS 時並沒有考慮到 iptables，沒有固定 NIS 服務的 port，那每次你做 <code>sudo service ypserv restart</code> 或是 <code>sudo service ypbind restart</code> 時，你會發現他的 port 會一直變，所以下一步我們要固定這些服務的 port</p>
<p>透過你常用的編輯器打開 <code>/etc/default/nis</code>，我們需要固定的 port 有四個，在這邊我們假設我們要設定 port 875~878，這邊要注意一下 <code>YPPASSWDDARGS</code> 的設定參數不太一樣</p>
<ol>
<li>YPSERVARGS=&quot;-p 875&quot;</li>
<li>YPBINDARGS=&quot;-p 876&quot;</li>
<li>YPPASSWDDARGS=&quot;--port 877&quot;</li>
<li>YPXFRDARGS=&quot;-p 878&quot;</li>
</ol>
<p><strong>Step 3: 針對 NIS 需要用到的服務新增 rule</strong></p>
<p>這邊你可以再次透過 <code>rpcinfo -p</code> 觀察發現，哪些需要用 tcp，哪些需要用 udp，然後再根據這個去設定 iptables rule，為了稍微增加一點點安全性，可以不要用 ALL 就不要用 ALL</p>
<pre><code class="language-bash">$ iptables -A INPUT -p tcp -i eth0 -s [要開放的 server IP] -m multiport --dport 111,875,876,878 -j ACCEPT

$ iptables -A INPUT -p udp -i eth0 -s [要開放的 server IP] -m multiport --dport 111,875,876,877,878 -j ACCEPT
</code></pre>
<p><strong>Step 4: 重啟服務</strong></p>
<p>這邊要注意的是，如果你直接重啟 ypserv 和 ypbind 會出現：<code>YPBINDPROC_DOMAIN: Domain not bound</code>，因為你沒有通知 RPC server 你做了變更，這邊要先重啟 portmap，再重啟 ypserv 和 ypbind 才會成功</p>
<pre><code class="language-bash">$ sudo service portmap restart
$ sudo service ypserv restart
$ sudo service ypbind restart
</code></pre>
<p><strong>Step 5: 測試是否 NIS 有正常服務</strong></p>
<p>首先，因為我們是要測試 NIS 在防火牆環境中是否能夠執行，請先在 NIS client 設定 iptables，記住不要針對 NIS master IP 做設定，這樣就算可以連線但意義不同</p>
<p>然後我們稍早有提過為了不要讓其他人的服務中斷，我們要確保 NIS slave 的存在，現在要測試的時候我們就先在一台沒人用的 NIS client 上面編輯 <code>/etc/yp.conf</code> 這份檔案，確認我們設定的 NIS server 只有我們剛剛設定過的 NIS master</p>
<p>接著重啟 <code>ypbind</code> 之後，我們可以透過 NIS 提供的測試指令：<code>yptest</code> 來檢查</p>
<hr>
<h3 id>後記</h3>
<p>上面說的注意事項其實我都踩過了，就連看起來最嚴重的：全公司的人無法連線，我都遇到了，當時是大概是晚上六七點，已經超過可以進入機房的時間，所以我也沒辦法進去修，只能一直跟大家道歉，然後在一些沒有被影響到的 server 上幫他們佈署環境，隔天早上9點多再馬上進機房解決。</p>
<p>指令下錯的瞬間真的臉都白了⋯⋯</p>
<p>雖然這篇內容的東西也不算複雜，但是真的是找了很多論壇討論串才解決，因為真的幾乎沒人在用 NIS，更不用說是在 ubuntu 上用 NIS，如果有中文的教學也幾乎都跟鳥哥內容差不多（也就代表著都是 CentOS 環境），然後關於 iptables 的設定，如果確定 rule 都沒有問題，建議可以設定成重新開機時也預先啟動 iptables，我個人是透過指令 <code>iptables-persistent save</code> 儲存 rule。</p>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="http://linux.vbird.org/linux_server/0430nis.php">鳥哥的 Linux 私房菜</a></li>
<li><a href="https://help.ubuntu.com/community/SettingUpNISHowTo">Ubuntu wiki</a></li>
<li><a href="http://blog.pulipuli.info/2011/07/linuxiptables.html">Linux 設定 iptables</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Fcitx 輸入法一般來說應該不會使用到，但是如果您/您的朋友需要用到嘸蝦米輸入法的時候，也許也可以考慮來研究一下。</p>
<ul>
<li>參考資料：<a href="https://www.ubuntu-tw.org/modules/newbb/viewtopic.php?topic_id=53570&amp;forum=8">Ubuntu與嘸蝦米</a></li>
</ul>
<p>在<a href="http://blog.geeky.name/post/ubuntu-14.04-boshiamy-gcin">這篇文章</a>裡面 BlueT 大大有介紹使用 gcin 的方式，如果不喜歡 Fcitx 的話可以過去看一下。不過 16.04 的 im-switch 好像消失了，請改用 BlueT 大大文中提到的圖形化界面操作方式：</p>
<hr>
<h3 id>使用圖形化界面切換輸入法</h3>
<p>按下 Ubuntu 右上角的小齒輪，</p>
<p><img src="https://i.imgur.com/AT07HBg.png" alt="menubar 畫面。"></p>
<p>選擇系統設定 (System Settings)，<br>
然後找到語言支援（Language Support），</p>
<p><img src="https://blog.moli.rocks/content/images/2016/12/2016-12-20-21-10-10-------1.png" alt="系統設定畫面。"></p>
<p>進去語言支援後在視窗下方有個輸入法的下拉式選單，</p>
<p><img src="https://i.imgur.com/Vg1yXam.png" alt="輸入法選單畫面。"></p>
<p>拉下去就會看到 IBus, gcin, XIM 和 fcitx 等。</p>
<hr>
<h3 id>安裝小企鵝輸入法</h3>
<p>小企鵝輸入法只要安裝完中文語系之後就會出現，<br>
所以先照上面的步驟到語言支援視窗，然後選擇<strong>安裝/移除語系</strong></p>]]></description><link>https://blog.moli.rocks/2016/12/20/ubuntu-16-04-boshiamy-fcitx/</link><guid isPermaLink="false">597afa1a43dc0337f4e84a5a</guid><category><![CDATA[Ubuntu]]></category><dc:creator><![CDATA[HeJung]]></dc:creator><pubDate>Tue, 20 Dec 2016 13:26:23 GMT</pubDate><media:content url="https://blog.moli.rocks/content/images/2016/12/Untitled.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.moli.rocks/content/images/2016/12/Untitled.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"><p>Fcitx 輸入法一般來說應該不會使用到，但是如果您/您的朋友需要用到嘸蝦米輸入法的時候，也許也可以考慮來研究一下。</p>
<ul>
<li>參考資料：<a href="https://www.ubuntu-tw.org/modules/newbb/viewtopic.php?topic_id=53570&amp;forum=8">Ubuntu與嘸蝦米</a></li>
</ul>
<p>在<a href="http://blog.geeky.name/post/ubuntu-14.04-boshiamy-gcin">這篇文章</a>裡面 BlueT 大大有介紹使用 gcin 的方式，如果不喜歡 Fcitx 的話可以過去看一下。不過 16.04 的 im-switch 好像消失了，請改用 BlueT 大大文中提到的圖形化界面操作方式：</p>
<hr>
<h3 id>使用圖形化界面切換輸入法</h3>
<p>按下 Ubuntu 右上角的小齒輪，</p>
<p><img src="https://i.imgur.com/AT07HBg.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>選擇系統設定 (System Settings)，<br>
然後找到語言支援（Language Support），</p>
<p><img src="https://blog.moli.rocks/content/images/2016/12/2016-12-20-21-10-10-------1.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>進去語言支援後在視窗下方有個輸入法的下拉式選單，</p>
<p><img src="https://i.imgur.com/Vg1yXam.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>拉下去就會看到 IBus, gcin, XIM 和 fcitx 等。</p>
<hr>
<h3 id>安裝小企鵝輸入法</h3>
<p>小企鵝輸入法只要安裝完中文語系之後就會出現，<br>
所以先照上面的步驟到語言支援視窗，然後選擇<strong>安裝/移除語系</strong>（Install / Remove Languages）：</p>
<p><img src="https://i.imgur.com/QkxMfIv.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>把正體中文打勾之後，  按右下角的按鈕，不曉得中文是套用還是確定（Apply）...</p>
<p>接著回到語言支援的視窗，下方輸入法的下拉式選單應該就會出現 fcitx 了。</p>
<p>選擇 fcitx 之後把您手邊的工作先告一段落存檔，然後我們需要登出再登入。請點選右上角小齒輪，然後應該就會看到在使用者名稱下面有登出（Log Out）的選項：</p>
<p><img src="https://i.imgur.com/sGOmMuH.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>再次登入之後你應該就會看到你的工具列出現小企鵝輸入法了：</p>
<p><img src="https://i.imgur.com/sdHYS5s.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<hr>
<h3 id>安裝嘸蝦米輸入法</h3>
<p>這個步驟會需要用到一點點指令，沒用過請不要害怕，Ubuntu 沒有脆弱到一點失誤就壞掉 XD。</p>
<p>首先按下 <code>ctrl + alt + t</code> 叫終端機出來，然後在終端機按右鍵貼上這串指令：</p>
<pre><code class="language-bash">$ sudo apt install fcitx-table-boshiamy
</code></pre>
<ul>
<li><code>sudo</code> 的意思請看<a href="http://note.drx.tw/2008/01/linuxsudo.html">這邊</a>。</li>
<li><code>apt</code> 是 Advanced Packaging Tools，用來幫你安裝程式。</li>
<li><code>install</code> 是安裝的意思，然後 <code>fcitx-table-boshiamy</code> 就是我們要安裝的嘸蝦米輸入法。</li>
</ul>
<p>按下 Enter 之後會開始執行，不過因為安裝程式是需要使用管理員權限的，所以這個時候你需要輸入密碼。</p>
<p><img src="https://i.imgur.com/WHE1e0p.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>然後就安裝完了。</p>
<p><img src="https://i.imgur.com/nSYIStS.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p><strong>安裝完之後可能需要登出再登入</strong>，<br>
比較能夠順利找到我們剛剛安裝的嘸蝦米輸入法。</p>
<hr>
<h3 id>設定嘸蝦米輸入法</h3>
<p>接著我們要開始設定輸入法，在小企鵝身上戳一下之後會彈出來一個選單：</p>
<p><img src="https://i.imgur.com/9XGMMTt.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>請選擇設定 Fcitx（圖中的 ConfigureFcitx），是說我第二次登入的時候設定視窗變成這樣：</p>
<p><img src="https://i.imgur.com/mxAYIk3.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>如果是第二個情況的話請選「設定」（圖中的 Configure）按鈕。</p>
<p>然後會看到下面這個視窗：</p>
<p><img src="https://i.imgur.com/acSoKdX.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>按下左下角的 + 號按鈕，會列出目前可以使用的輸入法：</p>
<p><img src="https://i.imgur.com/ac2A6Lr.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>把左下方的<strong>只顯示目前語言</strong>（Only Show Current Language）取消勾選，然後搜尋 <code>boshiamy</code>，選擇後按下確定，接著你就可以開始使用嘸蝦米輸入法了<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>。</p>
<p><img src="https://i.imgur.com/pwrvYRP.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>然後如果你也想要用注音輸入法的話，建議把<strong>輸入視窗</strong>關閉。</p>
<p>在設定 Fcitx 的視窗，切換到全域設定（圖中的 Global Config）：</p>
<p><img src="https://i.imgur.com/Eq1Afcn.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<p>首先勾選左下角的顯示進階選項（圖中的 Show Advance Option），視窗會多出第二排橫排的分頁，然後選擇第二排最後面的外觀顯示設定（下圖中的 Appearance），就會看到下面這張圖，把最下面兩個選項勾起來，這樣注音選字的時候會運作的比較正常哦！</p>
<p><img src="https://i.imgur.com/bIJhNhj.png" alt="Ubuntu 16.04 的嘸蝦米輸入法（使用 Fcitx）"></p>
<hr>
<h4 id>腳註</h4>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>使用 ctrl + space 可以切換輸入法至 fcitx，接著按 ctrl + shift 可以在你有安裝的輸入法之間依序切換。 <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[用 Ubuntu Linux (64bit) 環境使用 Juniper SSL VPN（免裝 32bit Java）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><strong>Juniper SSL VPN</strong> 常被用在各種地方，包括台灣各國立大學也都有由 <a href="http://noc.twaren.net/noc_2008/Services/SSLVPN/index.php">TWAREN</a> 所提供的服務。<br>
因為它對於 64bit Linux 的支援問題，要在 <strong>Ubuntu (Linux) 64bit</strong> 上使用並不容易。<br>
如果你<em>不希望</em>只為了用它而得<em>多裝一套肥大的 32bit Java</em>，這篇就是你要的教學文。</p>
<p>If you want English HOWTO, check English version <a href="https://medium.com/geeky-log/howto-ubuntu-linux-64bit-client-connect-to-juniper-ssl-vpn-without-32bit-java-en-32544ab73ad4#.43744do88">HERE</a> or <a href="http://blog.geeky.name/post/2016/03/29/HOWTO%3A-Ubuntu-Linux-64bit-Client-connect-to-Juniper-SSL-VPN-without-32bit-Java-%28en%29">HERE</a>.</p>
<h2 id>概要</h2>
<pre><code class="language-bash"># 安裝函式庫
$ sudo apt-get install libc6:i386 zlib1g:i386 libgtk2-perl libwww-perl

# 取得檔案
$ wget https://raw.github.</code></pre>]]></description><link>https://blog.moli.rocks/2016/12/15/howto-ubuntu-linux-64bit-client-connect-to-juniper-ssl-vpn-without-32bit-java/</link><guid isPermaLink="false">597afa1943dc0337f4e84a58</guid><category><![CDATA[VPN]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Java]]></category><category><![CDATA[Juniper]]></category><dc:creator><![CDATA[BlueT - Matthew Lien - 練喆明]]></dc:creator><pubDate>Thu, 15 Dec 2016 11:02:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><strong>Juniper SSL VPN</strong> 常被用在各種地方，包括台灣各國立大學也都有由 <a href="http://noc.twaren.net/noc_2008/Services/SSLVPN/index.php">TWAREN</a> 所提供的服務。<br>
因為它對於 64bit Linux 的支援問題，要在 <strong>Ubuntu (Linux) 64bit</strong> 上使用並不容易。<br>
如果你<em>不希望</em>只為了用它而得<em>多裝一套肥大的 32bit Java</em>，這篇就是你要的教學文。</p>
<p>If you want English HOWTO, check English version <a href="https://medium.com/geeky-log/howto-ubuntu-linux-64bit-client-connect-to-juniper-ssl-vpn-without-32bit-java-en-32544ab73ad4#.43744do88">HERE</a> or <a href="http://blog.geeky.name/post/2016/03/29/HOWTO%3A-Ubuntu-Linux-64bit-Client-connect-to-Juniper-SSL-VPN-without-32bit-Java-%28en%29">HERE</a>.</p>
<h2 id>概要</h2>
<pre><code class="language-bash"># 安裝函式庫
$ sudo apt-get install libc6:i386 zlib1g:i386 libgtk2-perl libwww-perl

# 取得檔案
$ wget https://raw.github.com/madscientist/msjnc/master/msjnc
$ wget http://mad-scientist.net/junipernc
$ chmod +x msjnc junipernc

# 瀏覽器開 SSLVPN 網站並下載 jar 檔

# 解出檔案
$ ./msjnc

# 啟動 VPN
$ junipernc --nojava
</code></pre>
<hr>
<h2 id="sslvpn">SSL VPN 是什麼</h2>
<h3 id="vpn">VPN</h3>
<p><strong>VPN</strong>（虛擬私有網路）是個讓人們能<em>存取 NAT 防火牆內，位在 LAN (區域網路) 裡的主機和服務</em>的方法。例如：從家裡或是出差時連線到公司的電腦。 有許多不同種類的 VPN，例如 PPTP、OpenVPN、Cicso OpenConnect 等等。</p>
<h3 id="sslvpn">SSL VPN</h3>
<p><strong>SSL VPN</strong> 是其中一種 VPN，原本被設計來讓使用者只要有瀏覽器就能夠使用。<br>
有些人將它視作是使用者<em>最容易使用的方法</em>，但<em>前提是</em>所有使用者都用 M$ Windows，或是廠商提供了<em>足夠的跨平台支援</em>。<br>
可惜的是 <strong>Juniper SSLVPN</strong> 的方案 （<strong>NetworkConnect</strong> client）並沒有對 <em>64 位元 Linux</em> 的良好支援，所以我們得自己動手做點小修改。</p>
<hr>
<h2 id>工具</h2>
<p>我們需要這些東西：</p>
<ul>
<li>junipernc</li>
<li>msjnc</li>
<li>瀏覽器（Firefox 或 Chromium）</li>
<li>Java（你系統裡原本的 64bit Java 以及隨附的瀏覽器外掛）</li>
<li>一點點基本的 32 位元函式庫</li>
<li>幾個基本的 Perl 函式庫，這是為了支援圖形化的對話框。 （有了這個才能避免使用 32 位元 Java 提供的圖形界面）</li>
</ul>
<p>在這個例子中，我們會使用 <strong>junipernc</strong> 來協助我們安裝，以及幫我們自動執行一些複雜的指令。msjnc 只是用來取得我們需要的檔案。</p>
<p>瀏覽器只是用來下載 Juniper 的 SSLVPN 客戶端軟體 <strong>NetworkConnect</strong>。</p>
<p>Java 只是用來處理一些安裝流程。若你還沒有安裝 Java，可以看看 <a href="http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html">這篇</a> 有關 Oracle Java 的安裝教學文。</p>
<pre><code class="language-bash">$ sudo apt-get install libc6:i386 zlib1g:i386
$ sudo apt-get install libgtk2-perl libwww-perl
$ wget https://raw.github.com/madscientist/msjnc/master/msjnc
$ wget http://mad-scientist.net/junipernc
$ chmod +x msjnc junipernc
</code></pre>
<p>或是你也可以從 <a href="http://blog.geeky.name/public/junipernc">這裡</a> 下載 junipernc 及 <a href="http://blog.geeky.name/public/msjnc">這裡</a> 下載 msjnc 。</p>
<hr>
<h2 id>流程</h2>
<h3 id>準備所需資訊</h3>
<p>我們需要一些資訊來讓工具幫我們登入：</p>
<ul>
<li>Network Connect URL or Server</li>
<li>username</li>
<li>Realm</li>
</ul>
<p><strong>Network Connect URL or Server</strong> 是你瀏覽器開啟 SSLVPN 登入頁面時的網址。在我的例子中，長得像是這樣：</p>
<p><img src="https://blog.moli.rocks/content/images/2016/12/1-5qAYmu0todetxwfboPapdA.png" alt="TWAREN's Juniper SSLVPN Login page"></p>
<p>我們得將所有需要的檔案放在系統裡。</p>
<h4 id="1jar">1. 取得 .jar 以及其他檔案</h4>
<p>登入 SSLVPN 後，你會看到 <code>Network Connect -&gt; Start</code>，請點擊 <em>Start</em>。</p>
<p><img src="https://blog.moli.rocks/content/images/2016/12/0-lcvRWGiPf8Gt8CXr.jpg" alt="Juniper SSLVPN 登入後畫面"></p>
<p>點選頁面<em>右上角的「允許」<em>讓 Java 執行。<em>一路點允許、繼續</em>。最後它會</em>安裝失敗</em>並有關於 32 位元相關的錯誤。</p>
<p>*莫驚慌！莫害怕！*這是意料中的事，因為我們正在用 64 位元系統，而那個 Java 應用程式需要 32 位元的環境。</p>
<p><img src="https://blog.moli.rocks/content/images/2016/12/0-AUcolWx9aGAJIc-q.png" alt="安裝失敗畫面"></p>
<p>檢查一下你家目錄中的這個目錄，你會看到 <code>ncLinuxApp.jar</code> 就安靜地躺在那裡，像個睡著的孩子：</p>
<pre><code class="language-bash">bluet@clean:~$ ls -al .juniper_networks
總計 2032
drwxrwxr-x  2 bluet bluet    4096  3月 29 01:01 .
drwxr-xr-x 20 bluet bluet    4096  3月 29 01:00 ..
-rw-rw-r--  1 bluet bluet 2065489  6月 25  2014 ncLinuxApp.jar
-rw-rw-r--  1 bluet bluet      19  3月 29 01:01 whitelist.txt
</code></pre>
<h4 id="2">2. 將檔案抽取出來</h4>
<p>msjnc 這工具會像用了吸星大法一樣，幫我們把需要的檔案從 <code>ncLinuxApp.jar</code> 裡汲取出來：</p>
<pre><code class="language-bash">$ ./msjnc
</code></pre>
<p>執行後它會無聲無息地結束，但若再檢查一下剛才的目錄，你會發現世界變得不一樣。</p>
<pre><code class="language-bash">bluet@Zorya:~$ find ~/.juniper_networks/
/home/bluet/.juniper_networks/
/home/bluet/.juniper_networks/networkconnect.gif
/home/bluet/.juniper_networks/network_connect
/home/bluet/.juniper_networks/network_connect/version.txt
/home/bluet/.juniper_networks/network_connect/libncui.so
/home/bluet/.juniper_networks/network_connect/xlaunchNC.sh
/home/bluet/.juniper_networks/network_connect/ncsvc
/home/bluet/.juniper_networks/network_connect/ncdiag
/home/bluet/.juniper_networks/network_connect/NC.jar
/home/bluet/.juniper_networks/network_connect/META-INF
/home/bluet/.juniper_networks/network_connect/META-INF/IMPORTED.RSA
/home/bluet/.juniper_networks/network_connect/META-INF/IMPORTED.SF
/home/bluet/.juniper_networks/network_connect/META-INF/MANIFEST.MF
/home/bluet/.juniper_networks/network_connect/installNC.sh
/home/bluet/.juniper_networks/network_connect/ncsvc.log
/home/bluet/.juniper_networks/network_connect/getx509certificate.sh
/home/bluet/.juniper_networks/getx509certificate.sh
/home/bluet/.juniper_networks/ncLinuxApp.jar
</code></pre>
<h4 id="332javamsjnc32java">3. 使用 32 位元 Java 執行 msjnc（請略過這個步驟，如果你不想多裝一個累贅的 32 位元 Java）</h4>
<p>我不想安裝<em>多一個累贅癡肥的 Java</em>，<em>只為了這個</em> 32 位元的鬼東西。<br>
我用的是 240G SSD。速度快但是西北貴，我真的不想<em>浪費我的硬碟空間</em>在這<em>幾乎用不到的 32 位元 Java</em>。</p>
<p>但如果你堅持，或是你覺得你有<em>一狗票硬碟可浪費，還有浪費電、浪費網路頻寬</em>，那就這麼做吧。我制止不了你。</p>
<p>不然，<em>別這麼做</em>。</p>
<p>安裝多餘的 32 位元 Java：</p>
<pre><code class="language-bash">$ sudo apt-get install openjdk-7-jdk:i386
</code></pre>
<p>msjnc 有它自己的圖形界面，讓使用者能較容易地控制 VPN 連線，但它需要 32 位元 Java。</p>
<p>現在你可以在 <strong>Dash</strong> 中搜尋 <strong>Network Connect</strong> 並開始使用閃亮亮的圖形界面了。（歧視表情）</p>
<p>但我不是腦殘，指令列又酷又炫。好 CLI，不用嗎？</p>
<hr>
<h3 id="vpn">啟動 VPN，開始享受</h3>
<p>現在我們該設定 VPN 並讓它執行了。</p>
<h4 id="vpn">設定 VPN</h4>
<p>執行 <strong>junipernc</strong> 且<em>不要用 32 位元 Java</em>。</p>
<pre><code class="language-bash">$ junipernc --nojava
</code></pre>
<p><em>第一次執行</em>時，你會看到一些跳出的圖形對話框，詢問你有關 <em>VPN 的資訊</em>。<br>
我們在<em>第一步驟</em>時就已經準備好這些資訊了，此時不用更待何時，所以現在輸入吧。</p>
<p>一旦完成，系統裡會多出一個<em>新的網路界面</em>。</p>
<pre><code class="language-bash">bluet@clean:~$ ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.99.1.30  P-t-P:10.99.1.30  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1400  Metric:1
          RX packets:16363 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11128 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:20952021 (20.9 MB)  TX bytes:777393 (777.3 KB)
</code></pre>
<p>現在你可以 <code>ping</code> 看看你的辦公室電腦或是上 <a href="https://www.whatismyip.com/">WhatIsMyIP</a> <em>看看你的 IP</em>，你已經進入 VPN 的裏世界了。你也看看這兩個檔案中所儲存的 VPN 設定： ~/.vpn.default.crt</p>
<h4 id="vpn">啟動 VPN</h4>
<p>下次想要啟動 VPN 連線時，用<em>一樣的指令</em>即可。</p>
<pre><code class="language-bash">$ junipernc --nojava
</code></pre>
<p>輸入密碼後，你就再度進入那神秘美好的世界了。</p>
<h4 id="vpn">停止 VPN</h4>
<p>當你工作完畢，想要斬斷魂結、斷開鎖鏈時，用這個指令<em>斬斷 VPN 執行程序</em>以斷開 VPN。</p>
<pre><code class="language-bash">$ sudo killall ncsvc
</code></pre>
<hr>
<h3 id>後記</h3>
<p>我花了好幾個小時搞定讓它能動，然後花了整晚重複確認步驟、寫英文版 HOWTO，然後又寫中文版到早上⋯⋯希望這篇教學能為你節省時間，節能省碳，救了隻小貓、少砍一顆樹，促進世界和平大同。</p>
<p>享受吧！阿宅！</p>
<hr>
<p><em>Import from <a href="https://medium.com/geeky-log/%E6%95%99%E5%AD%B8-%E7%94%A8-ubuntu-linux-64bit-%E7%92%B0%E5%A2%83%E4%BD%BF%E7%94%A8-juniper-ssl-vpn-%E5%85%8D%E8%A3%9D-32bit-java-zh-tw-adabd9b298e4?source=collection_home---7------1---------">https://medium.com/geeky-log</a></em></p>
<p><em>Originally published at <a href="http://blog.geeky.name/post/2016/03/29/%E6%95%99%E5%AD%B8%3A-%E7%94%A8-Ubuntu-Linux-%2864bit%29-%E7%92%B0%E5%A2%83%E4%BD%BF%E7%94%A8-Juniper-SSL-VPN-%28%E5%85%8D%E8%A3%9D-32bit-Java%29-%28zh_TW%29">blog.geeky.name</a> on March 28, 2016.</em></p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>