三天兩夜北大武山

北大武山,排灣族的聖山,也是南部唯一的一座百岳,是座 A 級山但看到 A 級真別小看它了。

裝備紀錄

各位可以參考我整理的「北大武裝備清單」來進行整理,經過之前爬南華山的經驗這次準備就相當有經驗了,整體來說裝備是足夠的,但這次遇到寒流,檜谷山莊的氣溫只有 2 度,外套再好一些應該會更好。

行程

Day1: 新登山口 (9:30) -> 舊登山口 (11:00) -> 檜谷山莊 (16:30)

Day2: 檜谷山莊 (6:10) -> 大武遺址 (11:20) -> 三角點 (12:30) -> 檜谷山莊 (17:45)

Day3: 檜谷山莊 (6:30) -> 舊登山口 (10:10) -> 新登山口(11:00)

餐點紀錄

這次使用「北大武檜谷廚房 [ 登高工作室 ]」的服務並且使用兩天食宿的方案一個人的費用為 1800 元整,可以不用背睡袋與帳篷都會幫忙處理好,提供的帳篷是犀牛帳篷睡三個人挺剛好的,睡袋是相當厚的全身包頭睡袋,整體來說相當乾淨,食物簡單但是非常好吃,而且就跟官網上面圖片畫的「一模一樣」。

里程、海拔記錄

舊登山口 -> 0.5k (1602M) -> 1k (1553M) -> 1.5k (1618M) -> 2k (1742M) -> 2.5k (1796M) -> 3k (1870M) -> 3.5k (1955M) -> 光明頂 3.8k -> 4k (2145M) -> 檜谷山莊 4.2k -> 4.5k (2285M) -> 5k (2402M) -> 5.5k (2500M) -> 6k (2619M) -> 水源處 6.3 -> 6.5k (2726M) -> 7k (2802M) -> 7.5k (2962M) -> 8k (3029M) -> 8.5k (3010M) -> 三角點 9k (3092M)

心得記錄

  1. 開車前往的朋友一定要注意車子的底盤,路況不太好,要小心開。
  2. 最後 1k 的時候會需要橫跨 3 個假山頭才會到最後的三角點,這塊挺心累的。
  3. 攀升蠻多的,下山的時候才知道我們到底爬了多少的上升。
  4. 攻頂 4k -> 9k 一開始不要爬太快保留點體力應付後面的攀升,整段大多都是持續上攀的路線,爬完大約會需要 10 – 11 小時。
  5. 個人藥品一定要隨身攜帶,即便是攻頂小包,再攻頂時往往就會是最需要藥品的時候。
  6. 毛帽真的不能脫,脫了很可怕 xd 主要的原因絕對不是頭髮而是著涼。
雖然沒有看到雲海,但有這美景也滿足了

最後,完成人生第二座百岳了, 2020 年訂定的年度目標先完成一件了。

2019 回顧

年底到了,該回顧一下今年自己做了哪些事情,達到哪些成就,今年的自己在學習成長、休閒運動都有些突破但還有很多需要努力的地方。

挑戰 – 演講

MOPCON 2019, Agile Tour Kaohsiung 2019 演講

投影片:

參加 MOPCON 這麼多年還是第一次以講者的身份在講台上演講,也算是我第一場研討會演講,就獻給 MOPCON 了,這次的題目雖說大方向是我訂的,但在與同事討論的過程中也不斷的收斂與調整方向,瞭解到幾件事情。

  1. 不可貪心:專注在主題上不發散,不要都碰一點但都只是帶過卻沒有深入介紹,對於聽眾來說也無法全盤理解想要表達的內容。
  2. 題目盡可能不要走鋼索:有些容易引戰或是在沒有足夠時間下很難將想法表達清楚的題目,很容易在分享的過程中讓會眾遠離你,甚至對你的內容產生置疑,對演講都是不利的。
  3. 培養 Top-down 的思維:過往準備演講的方式都是透過中心主題拓展,從主題散出去將每個項目講清楚,但好的演講需具備的思維應該是要站在會眾的角度來思考會眾會想要聽些什麼內容,如會想要瞭解內容中的細節之外,也想知道如何套用,就需要將內容包裝成一個骨架,會眾透過這個骨架就可以輕鬆的在自己的情境下使用。

這次也是第一次 MOPCON 組織將內部工作方法分享出來讓更多朋友可以知道我們組織是如何運作的,整理了今年資訊組所做的改變,分別針對徵才流程、工作流程、測試與 CI/CD 導入、維護團隊熱情等等面向剖析作法,也將所有組員的努力價值化,讓更多人可以看到 MOPCON 資訊組做了哪些事情。

MOPCON 2019 演講 Photo by MOPCON 攝影組
MOPCON 2019 資訊組團隊 Photo by MOPCON 攝影組

休閒 – 爬山

爬山的目的不只是運動,在爬山的過程中可以幫助自己放下手邊的一切,將自己的身心獻給大地,讓身心感受大自然,幫助自己好好思考煩惱、規劃自己、解放壓力、與朋友聊天交流等好處多多阿,最重要的當然是欣賞爬山的沿途風景與山頂之美,今年很可惜沒有爬到百岳但期許明年的自己可以再登上台灣百岳看看更美的風景。

台中 – 鳶嘴山
屏東 – 里龍山

休閒 – 旅遊

在 MOPCON 2019 一結束之後放下一切煩惱起身前往澳洲兩週體驗當地文化,體會到澳洲人開車就是快、郊外路上隨處可見動物、晚上 8 點店就關光光、很高的物價、不斷地吃麵包等等,當然還有許多很美的風景,看著這些風景與動物,自己也被療癒了,在 Tasmania 有的是自然、寧靜、清幽的感覺雖說生活便利性與繁榮不比 Melbourne 來的多元方便,但自己好像還是喜歡 Tasmania 這種清靜的感覺。當坐飛機回到 Melbourne 的時候瞬間覺得,明明就在澳洲怎麼好像到另一個地方。

澳洲 wallaby

看,是否被療癒了呢?當然在澳洲當地也有非常非常多美麗的風景就不一一介紹了,直接看圖吧。

Tasmania – Mount Wellington
Tasmania Maria Island – Painted Cliffs

健康 – 減重

運動對我來說是生活中不可或缺的一個休閒娛樂,但是幾年的時間不斷的運動不斷的吃,其實體重不減反增,在每年公司的健康檢查持續聽到醫生的一句話「你的體脂肪很高,也有脂肪肝,需要多運動唷」,每次聽到這次話心理大概就是想每個禮拜運動三次不夠嗎 xD ,因此調整了自己的飲食方式進行飲食控制,從今年 10 月開始到 12 月底也有了些成績。

  • 體重: 78kg -> 72kg
  • 體脂肪:23.3% -> 19.6%
201909

201912


給自己的 2020 目標

  1. 爬山、露營、旅遊,還有很多山中美景等著我去看呢,減重持續努力,目標是 15% 體脂。
  2. 基本工穩扎穩打:理財、時間管理、技術等等,需要花點時間打基底的,期許自己可以多花點時間看點書精進。
  3. 更多的分享更多的貢獻:期許自己在文章、社群等都能夠做更多分享。

應該夠一年的時間去實現了。

Firefox Container + Easy Container Shortcuts Plugin 使用心得分享

Firefox 在前幾個月有驚人的效能改善之後就從 Chrome 換成 Firefox 使用好一陣子了,Firefox 到 70 版本之後效能更是有驚人的突破,這邊分享個我很常使用且很喜歡的 Plugin 。

Firefox 容器

簡單來說容器可以把你所使用的分頁放進容器中進行執行,每個容器都是獨立的設定,也就是說你的登入資訊等在不同的容器都是無法共用的,這個概念其實跟 Chrome 的使用者很像,只是 Chrome 必需要開很多的視窗來達到,但我喜歡開分頁使用。

我自己的使用情境為例,我就有這麼多的容器,裡面有公司的、私人的、社群用不同的容器,每個容器也都登入特定的 Google 帳號,向我本身有 7.8 個以上的 Google 帳號,如果在同一個瀏覽器全部都登入,當我今天要使用 Gmail 我就需要切換我的使用者才可以看到該使用者的信箱,但使用容器後我可以直接用該容器打開 Gmail 就會看到該容器所登入之 Google 帳號 Email 了,不只是 Gmail 而已,像是開發上常使用的 Rollbar 平台也是,不同的專案使用不同的 Rollbar 帳號來管理,使用容器管理後我就可以不用一直登入登出帳號來使用 Rollbar 了。

當然對於一個工程師,要切換容器還要用滑鼠點是非常麻煩的事情,找了一下發現有網友開發了 Plugin Easy Container Shortcuts 來達到使用鍵盤來開啟特定容器分頁,下載連結可以看這邊,這個 Plugin 是開源軟體,有興趣的朋友可以到他的 Github 上面看看,在 Mac 上可以直接透過 Alt + Shift + 數字 來開啟相對應容器的分頁,但這邊可能要注意一下 shortcuts 有沒有被其他的 plugin 使用,像我有使用 Droplr 他就衝突了,我的作法是調整 Droplr 的快捷鍵來給 Easy Container Shortcuts 來使用。

還有什麼不錯的 Plugin 嗎?歡迎也來跟我分享。

身為工程師的我如何看近期的 Evernote

最近 Evernote 有不少負面消息了,想說來寫一篇我如何看這個軟體,先說以下言論我不代表 Evernote 官方,僅僅是以一個 User 的角度來看這件事情,先讓大家回憶一下 Evernote 最近發生了哪些大事件。

大事件

上面兩個文章我這裡就不再多做說明,有興趣的朋友可以自行閱讀,但這些事件可以看到 Evernote 國際版經歷了非常大的挑戰,也對於他們的市場照成非常大的衝擊,當然發生的事情絕非我僅列的,另外在 Evernote 的使用者論壇 也可以看得出一些使用者對於這些新聞與軟體的反應,自己看了幾個月大概可以得出一些使用者常討論的內容

  1. 為什麼 Evernote 不支援 Markdown 語法
  2. 好爛阿離開吧
  3. 沒有什麼新 Feature 感覺沒什麼進步
  4. Bug, Unstable 等等

針對第一點,如上方大事件提到,印象筆記已經於 6/6 將中國業務與國際版進行獨立切割,並且於 8/7 就快速的推出了 Markdown 的功能,也引發大家不少的討論,詳細內容也可以看看這篇文章「印象笔记终于支持markdown了」。

其他的項目我個人也有些見解與看法,但就先讓我來說說我自己的想法

用 Evernote 這個軟體已經 6 年了,對於我來說,我會以 Evernote 就是我 第二個大腦 來形容,當時的他不僅支持跨平台(Windows, Mac, Linux, Mobile 等等)筆記,還可以隨時透過 Evernote web clipper 來擷取網頁內容進行留存,在當時真的是相當的驚人,說實話至今我還是沒有找到可以有這麼多功能可以取代的產品,如果有的話真的歡迎可以跟我分享,我很願意試試。

想要表達的是,大家都會期望這個筆記軟體可以更符合現在使用者的需求,也當然或許增加這個 Feature 可以讓我們對於他的喜愛度更高沒錯,但或許大家可能沒有看到其實 Evernote 還是 Evernote 他的核心價值與他想要帶給大家的功能其實他沒有變過, Evernote 還是 Evernote ,他還是非常方便的讓我們隨時筆記、完成 GTD 、檔案 / 內容搜尋、簡報等等功能整合在這個軟體裡面。

在今年我參加了由 高雄 HPX 讀書會 開的「打開大家的 Evernote 筆記本:50位職人x 50種思考x 50個活用,為什麼這樣做筆記可以解決80%的工作問題」書聚讓我有個機會可以用不同的面向來看這個軟體,這本書不是新書,但是非常多的觀念與思考流程還是適用於每個人的,這邊不會討論這本書的內容,我僅列出幾個本書想要強調給大家。

  1. 記下所有的事情,把他當作是一個大大的 bucket 全部都丟進去就好,當你有需要的時候你就會找的到資料。
  2. 善用他的搜尋功能,這個也是 Evernote 最強的功能,不管是筆記內容、檔案內容、圖片內容搜尋等,都是相當的方便的,總可以讓你再需要的時候找到資料。
  3. 雖然他是一個筆記軟體,但他也可以做到 GTD 管理的功效,也可以透過「記事連結」這個功能將筆記與代辦事項串連起來。
  4. 分享職人如何使用 Evernote 。

當然本書的內容不僅僅是這四項,每個人解讀可能會有些不同就歡迎有興趣的朋友也可以去嘗試借閱 / 購買來看。

如何將 Evernote 應用於我的生活

  1. Slack integration (快速擷取特定日期的對話內容存到 Evernote ,對於使用免費版 slack 的人來說是一大福音)
  2. XMind 可以將所畫的心智圖,存進 Evernote 中,方便進行關鍵字搜尋與回想
  3. 透過 Evernote 完成 135 代辦事項 Reference: [時間技客-1] 做得到的每日待辦清單:1-3-5 專注法則
  4. 透過 RSS 軟體閱讀文章,整理心得存入 Evernote 進行留存
  5. 透過網友開發的 Plugin 來將 Markdown 語法套用 syntax style

分享我的閱讀心流

總結

其實 Evernote 的核心價值還是存在,並沒有因為產品時代的不同而影響這個產品的核心價值,只是可能沒有支援那接 Nice to Have 的 feature ,或許可以想想那些他能夠帶給你與解決問題的角度來欣賞這個軟體而非否定他,當然在此不是要大家使用 Evernote ,只是覺得 Evernote 對我來說還是非常不錯的,工具還是要看自己的使用習慣,要用順手的工具比較重要,也歡迎大家可以分享你覺得哪些工具很棒。

MOPCON 2017 心得文

MOPCON 2017 結束了

算一算也參加 2 年半了,從 2015 年因緣際會下能了解了南部的社群與研討會而加入 MOPCON 當時從行政組組員到場務組副組長,到 2016 年變成場務組長到現在變成總召,我想這個速度比火箭發射還要快速。

於今年春酒確定需要加下總召一職的時候心理的感覺其實相當的複雜,不知道自己有沒有能力去扛下這個重擔,畢竟從跑 Conf 到現在都是以場務為主,技能樹還沒點到財務管理、法人操作、公關行銷、商業禮儀贊助等等,對我來說這些東西還需要花好多好多的時間慢慢的學習與累積經驗,但最後也決定了,就邊學邊做吧,感謝 Eric 與 Miki 在我需要幫忙的時候給了我很多的建議。

今年的外場活動也是突破天際,不管是成大的 Talk 、TDOH 2017 的 Talk 等等,也都突破我自己往年的演講經驗,也希望未來可以有更多的機會可以對學校或是社群解說讓讓大家可以看到 MOPCON。

MOPCON 2017 Opening

這半年來每天開會已經是家常便飯,只希望能夠有更好的活動可以呈現給大家,謝謝這段日子陪著我一起努力的人,也非常感謝這段時間一直支持著我的人,謝謝你們。

今年想要做的事情很多,也成功的慢慢推向到國際化的第一步,除了重視國外與會者的使用者體驗之外,也希望能夠讓更多人看見 MOPCON ,也感謝各組的 Carry 讓我們達成了第一步。

MOPCON 2017 Booth

還有幾個目標需要持續努力

  1. 讓更多的人可以知道什麼是 MOPCON
  2. 讓南部的資訊圈與資訊產業更為活絡
  3. 不斷的有心血加入,達到永續經營
  4. 持續走向國際化

當然這次活動不外乎還是要感謝很多人

感謝 dada 幫我接下這個擔子,場務的個坑不好接,很多很雜亂的事情需要處理,跨組討論問題也是相當的繁多,在我接下總召之時還願意接下來真的是滿心的感謝。

感謝 Martian 與培智協助處理議程組大大小小的事情,也感謝這次對於外籍講者的接待相當恰當。

感謝 Ofa 與 Chloe 兩位 Carry 起整個贊助的狀況,也配合和了很多贊助商大大小小的需求,各個千奇百怪的需求不斷來,還得不斷的跟廠商進行溝通與配合。

感謝 Chuck 與富棋兩位帶領著組員協助將所有會場的過程記錄的漂亮又完整,不管是攝影品質、直播與聯播品質都是相當的棒的。

感謝宛儀在今年公關業務龐大的一年撐起來整個 MOPCON 的形象與公關活動,今年的活動真的太多了,從往年的 2 場活動到今年增到 4 場,對外演講的數量也增加了不少,真的是很辛苦你了。

感謝 Martian 與培智兩位協助打理講師議程狀況,今年的 UnConference 與 Lightning Talk 成效相當的好,辛苦你們了。

感謝哲岳與資訊組協助配合這次的官網調整達到全雙語與 APP 的支援,需求不斷的變動下還是很感謝你們的全力配合。

感謝采旻這次帶領美術組產出許多精美漂亮的設計作品與產品,也謝謝你們的擔待配合各組狀況而 Delay 你們的預定時程,還可以好好的跟大家溝通真的是謝謝你們了。

感謝線路組與樹德科技大學的付出,這次的網路品質明顯提高了,場佈爬上爬下的真的是辛苦各位組員們了,也謝謝你 們六年來的幫忙與付出。

感謝 Chita 姊協助我這邊配合很多協會與 MOPCON 之間的行政事務,合約也是看到眼花了。

感謝允文、球魚、阿空三位抽出了許多時間配合我這邊進行行政的相關事務,感謝你們的幫忙。

當然還有很多很多的人員我沒有辦法一一列出,自己曾經也身為場務組組長,可以體會佈置場地上面的困難與辛苦,也很感謝這些志工的無私奉獻,再此致上最真誠的感謝。

今年小弟第一次擔任總召一職,可能還有許許多多的事情還有很多的改進空間,還請各位組長、組員們與與會者多多擔待,若有任何建議與 Feedback 還請大家可以幫忙填寫回饋問卷,謝謝大家,我們明年見。

MOPCON 2017 總召集人 Hash 敬上

MOPCON 2017 Closing

HITCON CMT 2017 x MOPCON 社群攤位

HITCON CMT 2017 簡稱 HITCON
Mobile Open Platform Conference 簡稱 MOPCON

前言

這次來到 HITCON 有種很不一樣的感覺,代表著兩個不同身份來到這裡。

HITCON CMT 2017 Badge

已經 3.4 年沒有參加 HITCON 了,重回這個研討會對我來說真的是充電並且與許多各方強者好友聚聚聊聊的好地方,距離上次到現在從學生到已在職場工作 2 年的工程師,希望可以再這場會議中尋找 KKBOX 在研發與管理中可能會遇到的資安風險與管理存在問題。

MOPCON

第一次帶領著 MOPCON 踏入專精資安的研討會進行交流、宣傳與學習,非常感謝 HITCON 給了我們這個機會可以參與這場盛會。

13 , HITCON 13 年了, 總召 allenown 說:「 13 這個數字剛好是一個小學生讀書讀到大學畢業的時間,述說著 HITCON 培育著小小資安人才從小萌芽成長茁壯到今年的成就」。

學習與衝擊

HITCON 本年特色

  • 與聯發科合作非常新潮的電子 Badge
    • 獲得方式:
      • 需購買「尊榮一般票 ($3,500)」或「尊榮學生票 ($2,000)」才可以獲得。
    • Badge 特色:
      • 依照 BLE(Bluetooth Low Energy) 的信號抓取神奇寶貝(HITCON GO)並且獲得相對應的 key。
      • 貪食蛇。
    • 也聽幾位好友提到這個 Badge 的不良率其實蠻高的,另外是研發先關的功能,人力成本投入也是相當的驚人。
  • Mini Wargame
    • Wargame 一直以來都是 HITCON 的傳統,自從 2014 年 Capture The Flag, CTF 正夯,將 HITCON 的 Wargame 轉為 CTF 競賽, HITCON 今年希望可以將 Wargame 重返 HITCON。
  • 講師陣容
    • HITCON 每年的講師陣容都是非常的堅強,今年也不例外的近乎一半已上都是外國講師或全英語議程,當然現場也提供了即時同步口譯的平台工會場的大家進行使用,但需要自行攜帶耳機與電腦。
  • ZeroDay 漏洞通報平台
    • 希望持續提升台灣企業資安水準,也希望更多的白帽駭客可以參與這個漏洞通報的一環,提升企業與個人資安水平。

對於自己的衝擊

來到 HITCON 就是一個網友大拜拜的感覺,見了許多朋友,也看到許多朋友在資安圈上的貢獻與努力持續成長茁壯,回想起大學時期跟著一些朋友學習著資安,而開始寫起程式 怎麼感覺是反過來的 ,到大學後期慢慢轉網 Web 的路程走下去,除了常見的 Web Security 會去關注,但其他的資安議題也漸漸放下了,出了社會成了前端工程師到現在來到 KK 為全端工程師,這個路程離著資安也漸行漸遠,參加完 HITCON 希望可以找回自己對於資安的那塊熱情與初衷。

對於 MOPCON 的學習

MOPCON 第一次參與 HITCON 這個盛會,除了讓很多 MOPCON 的工作人員第一次見識到全台灣「網路」最不安全的研討會 xDD ,也看到不一樣類型的會眾與廠商,讓 MOPCON 有非常多的機會可以跟這些會眾好好交流與曝光,再次非常感謝 HITCON 給了我們這個機會。

MOPCON 2017 社群攤位 at HITCON CMT 2017

MOPCON 2017 Lighting Talk at HITCON CMT 2017

台灣駭客協會 x chrO.ot

來到 HITCON 其實可以非常明顯的感受到台灣駭客協會對於台灣政府、企業、個人與 NGO 的影響與改變,希望可以提升基本資安觀念與教育,像是透過 Zeroday 漏洞通報平台,嘗試將企業、政府或是學術單位的漏洞透過台灣駭客協會、 TWCERT/CC 與 TACERT ,讓通報者與政府學術單位等通報流程更為順利順暢。

也有像是 Civil Society Cyber Shield(CSCS) 資安工作坊,希望可以增加人權倡議者等 NGO 團體,提升他們的資訊安全素質,這些都是近年來台灣的變化。

或許 5 年成長了一點, 10 年成長了一點, 15 年也成長了一點,但回頭看這 10 幾年的時光,其實台灣資安重視狀況是有進步的,很感謝台灣駭客協會的貢獻與努力。

參考資料

自動測試與 TDD 實務開發(使用 C#) by 91 哥 Day3

前兩週課程回顧

詳細的課程心得可以參考

上週提到了如何透過 Selenium 與 Unit Test 來進行前後搭配完整測試,透過 Unit Test 來進行最小單元測試,確保「程式照我們預期進行」,透過 E2E Testing 「確保程式可以照使用者期望執行」,透過兩者同時對 Legacy Code 進行完整測試,還有什麼比這個更能放心的去 Refactor Legacy Code 呢?

本週課程重點

本週課程將學習透過 BDD 來描述使用者需求,透過人的話語來描述測試案例,讓 PO 與 RD 間的 GAP 縮小,那什麼是透過人的話與來描述測試案例呢?

Feature: PotterShoppingCart
  In order to 提供最便宜的價格給來買書的爸爸媽媽
  As a 佛心的出版社老闆
  I want to 設計一個哈利波特的購物車
  Scenario: 第一集買了一本,其他都沒買,價格應為100*1=100元
    Given 第一集買了 1 本
    And 第二集買了 0 本
    And 第三集買了 0 本
    And 第四集買了 0 本
    And 第五集買了 0 本
    When 結帳
    Then 價格應為 100 元

看完是否相當的直覺呢,我相信不是工程師也可以相當容易理解情境所要描述的測試案例。透過 BDD 除了可以提昇與 PO 溝通的效率,也可以自動產生 Document 與 Report 相當的方便。

如何透過 PHP 進行 BDD 測試

以下簡單的介紹如何將 feature 轉為可以測試的 PHP 程式碼, PHP 有兩套可以實踐 BDD:

以下會使用 Behat 進行範例解釋。

首先直接在 Scenario 那邊直接使用 [alt + Enter] 並且點選 Create all steps definition 建立 Feature Context ,如下圖。

預設會將 Feature Context 建置在 features/bootstrap 裡面,即會發現他已經針對每個動作建立了相對應的 method ,如下。

<?php
use Behat\Behat\Context\Context;
class FeatureContext implements Context
{
    /**
     * @Given /^第一集買了 (\d+) 本$/
     */
    public function 第一集買了本($arg1)
    {
        throw new \Behat\Behat\Tester\Exception\PendingException();
    }
    /**
     * @Given /^第二集買了 (\d+) 本$/
     */
    public function 第二集買了本($arg1)
    {
        throw new \Behat\Behat\Tester\Exception\PendingException();
    }
    /**
     * @Given /^第三集買了 (\d+) 本$/
     */
    public function 第三集買了本($arg1)
    {
        throw new \Behat\Behat\Tester\Exception\PendingException();
    }
    /**
     * @Given /^第四集買了 (\d+) 本$/
     */
    public function 第四集買了本($arg1)
    {
        throw new \Behat\Behat\Tester\Exception\PendingException();
    }
    /**
     * @Given /^第五集買了 (\d+) 本$/
     */
    public function 第五集買了本($arg1)
    {
        throw new \Behat\Behat\Tester\Exception\PendingException();
    }
    /**
     * @When /^結帳$/
     */
    public function 結帳()
    {
        throw new \Behat\Behat\Tester\Exception\PendingException();
    }
    /**
     * @Then /^價格應為 (\d+) 元$/
     */
    public function 價格應為元($arg1)
    {
        throw new \Behat\Behat\Tester\Exception\PendingException();
    }
}

接下來只需要將相對應 method 的行為修改一下,即可進行 BDD Testing 囉。

<?php
use App\PotterShoppingCart;
use Behat\Behat\Context\Context;
use PHPUnit_Framework_Assert as PHPUnit;
class FeatureContext implements Context
{
    private $potterShoppingCart;
    private $total_price;
    public function __construct()
    {
        $this->potterShoppingCart = new PotterShoppingCart();
    }
    /**
     * @Given /^第一集買了 (\d+) 本$/
     * @param int $number
     */
    public function 第一集買了本(int $number)
    {
        $this->potterShoppingCart->addBook(1, $number);
    }
    /**
     * @Given /^第二集買了 (\d+) 本$/
     * @param int $number
     */
    public function 第二集買了本(int $number)
    {
        $this->potterShoppingCart->addBook(2, $number);
    }
    /**
     * @Given /^第三集買了 (\d+) 本$/
     * @param int $number
     */
    public function 第三集買了本(int $number)
    {
        $this->potterShoppingCart->addBook(3, $number);
    }
    /**
     * @Given /^第四集買了 (\d+) 本$/
     * @param int $number
     */
    public function 第四集買了本(int $number)
    {
        $this->potterShoppingCart->addBook(4, $number);
    }
    /**
     * @Given /^第五集買了 (\d+) 本$/
     * @param int $number
     */
    public function 第五集買了本(int $number)
    {
        $this->potterShoppingCart->addBook(5, $number);
    }
    /**
     * @When /^結帳$/
     */
    public function 結帳()
    {
        $this->total_price = $this->potterShoppingCart->getPrice();
    }
    /**
     * @Then /^價格應為 (\d+) 元$/
     * @param $expected
     */
    public function 價格應為元($expected)
    {
        PHPUnit::assertEquals($expected, $this->total_price);
    }
}

修改完成後執行測試。

一樣會有紅綠燈可以查看,但還沒結束唷,還可以透過 BDD 來產生文件,在這邊我使用了 「BehatHtmlFormatterPlugin」這個套件來產生漂亮的 HTML 文件。

安裝完成之後先於根目錄中增加 behat.yml ,範例如下:

# behat.yml
default:
  formatters:
    html:
      output_path: %paths.base%/build/html/behat
  extensions:
    emuse\BehatHTMLFormatter\BehatHTMLFormatterExtension:
      name: html
      renderer: Twig,Behat2
      file_name: index
      print_args: true
      print_outp: true
      loop_break: true

直接執行下列指令。

$ ./vendor/bin/behat --format html

即可於 build/html/behat/ 資料夾中看到已經 build 好的 html 網頁。

看到這邊,是不是覺得既簡單又好使用呢?

總結

上完課程後對於 TDD 與 BDD 不管是觀念還是實戰演練都有了更深刻的體會,老師上課透過完整的 Lab 題目讓大家有非常非常多的情境可以進行練習,就連我這個沒有在寫 C# 且沒有用過 Visual Studio 的工程師來說,要跟上老師的課程也是蠻 OK 的,由於老師上課分享的內容實在太豐富了,於本 Blog 中僅能擷取一些重點進行分享,扎實的課程與實戰體驗就是在課程上課已學到的,如果大家尚未使用 TDD 進行開發或是已經有在使用但不是很瞭解或不知該如何導入專案中,相當推薦大家可以來上「自動測試與 TDD 實務開發」Joey ( 91 哥 ) 的課程,詳細請 Follow SkillTree,也感謝 91 哥這三天來的指導與分享,真的獲益良多。

自動測試與 TDD 實務開發(使用 C#) by 91 哥 Day2

上週課程回顧

詳細的上週課程心得可以參考「自動測試與 TDD 實務開發(使用 C#) by 91 哥 Day1」。

上週課程提到,什麼是 Unit Test ,好的單元測試需要吻合 F.I.R.S.T 原則,如何針對單一功能撰寫單元測試,了解開發流程與方式,了解業務單位需求撰寫需求文件與單元測試,針對單元程式建構出來的程式架構完成 Production Code 相關邏輯。

有了單元測試,就算需求來了想要調整 Production Code 都不用怕,因為有了單元測試,單元測試會告訴開發者,程式是否還是可以正常的運作(綠燈),如果為紅燈就知道有功能被改壞了,可以「即時」發現問題並且進行修正。

透過 Code Coverage 可以了解我們的單元測試的完整度,是否有遺漏的測試案例。

本週課前提要

上週學習了 Unit Test 但可能還是無法直接套用到正在進行中的專案,因為專案上可能都是滿滿的 Legacy Code ,無法針對 Legacy Code 進行測試,需求不斷的來招架不住該怎麼辦?我想今天的課程就是重點了,透過 E2E Testing 、 Unit Test 與 Refactor 來教你,「如何安安心心 Refactor Legacy Code 還可以完成業務單位新需求」。

該還的技術債還是要還,如果只是在 Legacy Code 上疊床架屋, Code 只會越來越亂, Bug 只會越來越多,只會讓後面維護的工程師越來越不懂這個系統的原貌,趁早治療才是明智之舉,千萬不要放棄治療。

本週課程前的小故事

老闆:「Hash,今天有個客戶跟我說他想要在我們的購物車上面加上可以自動進行折扣的功能,明天可以完成嗎?」

Hash:「痾…. (Hash的內心話:雖說只是加幾行 Code 就可以搞定,但… 會不會改壞其他東西阿)」

老闆:「怎樣?」

Hash(心虛的說):「好…」

本週課程重點

  • TDD
  • End-To-End Testing
  • Refactor

End-To-End Testing

課程中透過 Selenium 來指導學員如何透過他來對網頁進行 E2E Testing , Selenum 除了可以直接針對網站進行測試外還可以匯出 C# 測試原始碼直接無痛整合進行 Visual Studio ,讓 E2E Testing 與 UnitTest 一起來,進而達到完整測試。

上課採雷心得分享: Firefox 的 Selenium 再 Firefox v46.1 之後的版本有 Bug 。

Refactor

終於來到本週最為精采的「如何針對 Legacy Code 進行 Refactor」,結合網頁測試與單元測試來達成我們的目的 Refactor 。

當我們有了 E2E Testing 可以針對特定功能撰寫網頁測試案例,以使用者為出發點操作系統功能,記錄使用者的行為與預期結果。

當我們有了單元測試,針對最小的功能進行測試,預期這些功能方法的行為與其回傳值。

有了他們,修改程式後馬上進行完整 Unit Test 修改程式碼的方法後是否還吻合我們的測試案例預期行為,若為綠燈,則接著進行 E2E Testing 測試是否使用者還可以如預期的操作系統功能,修改程式碼超安心,一點都不擔心會不會改壞程式碼,還有什麼比這個還要更棒的呢?

91 哥補充:重構過程中千萬不可增加新功能,一次只做一件事情,重構完成 -> 綠燈 -> 增加新功能

本週課程後的小故事

同上一樣的故事內容

老闆:「Hash,今天有個客戶跟我說他想要在我們的購物車上面加上可以自動進行折扣的功能,明天可以完成嗎?」

Hash(心理想著):「有了 91 哥教我們的測試方法,我想花個一天把相關 Legacy Code Refactor 一下,半天完成老闆功能,沒問題!!」

Hash(有自信的說):「好老闆,明天下午給你!」

老闆:「太好了,謝謝你的幫忙」

其實一樣的故事內容課前與課後Hash的回答的方式是完完全全不一樣的,就算今天要花時間整理 Legacy Code 而無法如期交出功能,也可以跟老闆提出需要進行程式碼重構進而提升系統穩定度,我想老闆的接受度也是高些的。

本週課程心得

就如同小故事告訴我們的,透過完整的測試流程與方法,可以讓工程師們在修改程式上更為有自信且更為安心,其實只要隨手 Refactor 一隻 Method 與補上幾隻測試程式,就可以達到讓整個專案穩定度提升。

《Clean Code》 文中提到,童子軍原則:「離開營地前,讓營地使用前更加乾淨」,同樣的原則也可以透用在軟體開發上,程式碼在 Commit 前只要可以讓 Code Coverage 提昇些,讓程式碼看起來更整齊乾淨就是進步。

課程中相關學習資源

自動測試與 TDD 實務開發(使用 C#) by 91 哥 Day1

今天第一天上 91 哥的課,也是第一次,看到整間教室坐滿就知道 91 哥的名氣跟課程內容的豐富度一定很高,課程中的學員也有蠻多都是已經上過 91 哥課程的老學員又回來在聽的,隨著時間的增長,課程中的實務案例與經驗分享也更為豐富。

前景提要

  • 在 KKBOX 其實已經有一定的 Unit Test 與 CI 自動化的導入機制,所以其實在上這門課以前,我就已經有不少的測試開發經驗,雖說大部分都還是撰寫 Unit Test ,但對於 TDD 也是有一定的基礎在。
  • 91 哥上課使採用 C# 上課,上課前 91 哥都會提供相當仔細的課程環境建設,如果你本身有在寫 C# 那恭喜你在這邊應該是沒有任何問題的,但如果你是 Mac or 沒有寫過 C# 的開發者那 … 你應該在於建置環境上面需要多花點心力處理,以下提供幾個朋友實際安裝環境所會費的時間參考。
    • Mac + Virtual Box + Visual Studio(Full install) 在 SSD 上面跑約需要安裝 1.5 hr 。
    • Mac + Virtual Box + Visual Studio(上課所需的內容) 在 SD 上面跑約需要安裝 2.5 hr 。
  • 如果是用 C# 上課對於一個非 C# 的開發者會不會有困難呢?
    • 以我的狀況,我是 PHP 的開發者,平常是使用 PHPStorm 進行開發,對於 IDE 並不陌生,但是面對號稱地表最強的 IDE Visual Studio 說真的還是需要花點時間去習慣。
    • 至於 Code 會不會看不懂?我個人是覺得不會,只是 C# 有些語法上面是需要去習慣一下的。
  • 如果不是開發者像是 PM or Manager 去上這門課適合嗎?
    • 因為 91 哥上課會有大量的 workshop 需要實際去寫 code 進行相關測試,設計觀念與寫 Code 的比例大約是 6:4 吧,我是覺得還是會有收穫的,但可能在於寫 Code 進行測試上面可能稍有些辛苦。

課程重點

  1. 不是教你寫測試程式,而是教你開發跟設計
  2. 如何透過測試同時達到測試方法與測試文件
  3. 如何開發出更為穩定更為安心可以早早下班洗洗睡的 Code

有趣的上課方式

  1. 生動活潑的上課方式
    • 上課會採用分組活動來進行討論與分享。
    • 記點獎勵來激勵大家多多回答與發問。
    • 有問必達,可以於上課中隨時提出問題 91 哥都會耐心的解答,或是也可以利用備忘錄或是下課詢問的方式也可以獲得你要的答案 。
  2. 學習地圖與強調學習重點
    • 上課一開始就將 TDD Skill Tree 整個展開給學員們看,非常明瞭三天的學習方向、學習步驟與關連。
    • 本次開始提供課前講義(填空版與答案版),填空版主要為複習使用,可以知道空格的地方都是上課的重點,答案版可以隨時尋找答案。
  3. 實戰演練
    • 透過 Lab 的題目(原始題目、答案與步驟)進行操作,更可以針對不同的情境去撰寫自己的測試方法。
    • 透過老師提供的步驟說明,在自己回家後如果對於 Lab 有不清楚的時候可以翻開步驟一步一步的跟著進行操練。

了解實務上所遇到的問題與其解法

雖說 KKBOX 已經是一個已經有導入自動化測試開發的公司,但還是有需多的專案都是 0 測試的,如果將這些 0 測試的專案開始導入測試也是一個 Big Step 。

在實務上面常常會遇到測試對象與外部服務相依的狀況,應該要將這些外部服務切斷進而達到測試的獨立性。

常常也會遇到測試覺得複雜且不容易,也有可能說明了測試的對象並非為最小的測試單元或真的這個 Method 的業務邏輯相當複雜,進而可能需要進行 Refactor 或是確認需求等。

心得

在上課前總是會覺得,測試真的很麻煩,寫測試會增加我們的開發時間,但上完第一週的課程後,我了解了掌握開發的技巧、方法與順序,了解開發的重點,其實會發現測試一點都不花時間,掌握問題並且解決問題,開發出更有信心且穩定的程式碼是我們該邁向的目標。

期待未來兩週的課程。

MOPCON 2016 心得文

MOPCON 2016 結束了

講句坦白的,今年真的比去年還要有些不順利,不順利的原因是什麼?不是因為工作人員們,而是場地的狀況真的蠻多的(八卦就不多講了),靠著 MOPCON 的大家還是將這個活動圓滿的結束了,只能說這三天的成果真的是用汗水、喉嚨造就出來的。

今年有蠻多議程我也想聽,但因為忙碌而也沒辦法聽了,只好回家上 Youtube 了 T_T

阿吉:感謝你這幾天的幫忙,我在處理一些場地事務無法分身的時候還有你協助帶領著大家完成各個大大小小的事情

報到:Day1 要報到前十分鐘說網路不通,聽到這個魂都跑到美國去了,幸好報到前五分鐘回來了,彷彿我的靈魂繞了地球一圈,票種時間設定的有些問題,造成報到股的大家製造了不少麻煩

餐飲:我想今年的點心應該是比歷年的點心都還來的有份量了,也是大家努力出來的成果。

服務台:今年的告示牌真的是蠻漂亮的,除了亮晶晶之外 xD ,今年沒有聽到標示不清楚的反應,第一天有會眾提出不知道哪裡報到也在第二天出動了大聲公來解決這個問題,也辛苦大家與 「 Chita 姐姐」的幫忙。

攤位:還是很感謝三位的幫忙,雖說第一天聽到寄了 8 箱包裹只來了 1 箱,我的臉都白了一半了,趕緊去 ICCK 確認,結果是….烏龍 xDDD

門機:感謝各方研討會、學校與海青學弟的支持,我們也順利的達成了很多事情

物流:今年達成了在 6 點前將所有物資整理完成並且離場,大家募集的物資也都有順利的物歸原主,也是你們的功勞,但…我還是不敢想像有幾十箱的包裹禮拜二在等著我….

另外感謝各組組長的幫忙與機會,讓我學習到了不少東西

感謝 miki 與 eric Day 0 與 Day 1 的協調,你們的喉嚨應該蠻痛的,第一次遇到研討會樓下是電音趴的 xDD,我想有參加的會眾應該都有感受到 4 層樓的震動了

今年是 MOPCON 的第五年了,第一次接觸公關信箱,第一次協助國外的與會者來參加濁水溪以南的最大研討會,另外是我們踏上了海港巨蛋店,感謝 MOPCON 的大家讓我們又回到了海港還升級到巨蛋店 xDD 雖說沒有吃什麼東西就是了。

很感謝會眾與工作人員們對於 MOPCON 的支持,MOPCON 2016 正式結束

場務組組長 Hash 敬上