程式 ▪ 旅行 ▪ 思考 ▪ 動手

星期一, 8月 01, 2016

[ReactJS] 改變 state 要寫在 action creator 裡還是 reducer 裡?



雖然從兩年前就知道 React 了,但是直到最近這兩個月才真的有機會把它用在 production 上,忙碌的寫 code 人生中也學到了一些有趣的東西。上禮拜有幾個值得記錄下來避免忘記的討論,其中我覺得最重要的是一個是:「改變 state 要寫在 action creator 裡還是 reducer 裡?」,所以在很久沒寫網誌的情況下,還是努力對抗懶惰蟲給寫完了,希望各位先進前輩指導交流。

先提一下我們基本的 stack 是 ReactJS + Redux + redux-saga,所以下面的範例也是以這樣的基礎上敘述,同時避免文章落落長導致結論沒人看,先說我們最後的結論是
reducer 負責 state 的變化,如果有牽扯到 async 的 API 呼叫 (side effects),則是在 redux-saga 這層裡面處理。

星期五, 4月 15, 2016

如何在程式化腳本 (shell script) 內忽略異常錯誤結束 (exit(1))

快快樂樂學 shell scripts
最近在試著改善及整合公司其中一個專案的多國語系 (I18N) 自動化流程 (沒錯,又是熟悉的 I18N 好朋友)。除了根據現有的開發流程進行客製化的設計外,一路從開發、驗證、上線,每一個環節都需要考慮到流暢度與困難點,所幸有一些先前的小經驗,不過最後還是整整花了相當充實的三天半左右才完工。

在撰寫自動化流程腳本時遇到了一個有趣的小問題,解完後我覺得這問題雖然小卻也挺有意思的。於是我隔天就提出來跟公司的同事們一起討論,在產生了一些腦力激盪的小火花後,決定花點時間把問題和解法寫出來,一方面替很久沒寫的網誌灌灌水,另一方面則是希望拋出了這塊小磚後,會有一些不一樣,甚至更好、更有趣的大玉會冒出來一起討論。

問題

有一個 shell script 裡面執行了三個指令:
  1. git add .
  2. git commit -m "blahblahblah"
  3. git push
唯一的條件是:這個 shell script 不允許有任何的異常錯誤發生,因為有異常錯誤發生會中斷這個 shell script,也就是在運行指令時都必須要是 exit(0) 才可以。所以也可以想成 shell script 是長這樣:
function run_cmd(){
git add .
git commit -m "blahblahblah"
git push
}
run_cmd()
ret=$?
if [ $ret -gt 0 ]; then
    echo "Error!"
fi 

所以問題點在哪?

假設這個 script 在執行過 1. git add . 後,repo 裡並沒有任何檔案有被更改,正常來說,在執行 2. git commit -m "blahblahblah" 時 git 就會丟出類似下面這樣的訊息:
On branch master
Your branch is up-to-date with 'migme/master'.
nothing to commit, working directory clean
因為 git 發現沒有檔案可以 commit 後拋出了 exit(1) 異常結束 (可以用 echo $? 查看得知),最後進而導致 script 接到錯誤產生也異常結束。

於是,要怎樣忽略掉 git 所拋出的異常錯誤,讓後續的指令能夠順利執行呢?

最後大概有兩種比較短的解法:
  1. 用 pipe:
    git commit -m "blahblah" | cat
  2. 用 true:
    git commit -m "blahblah" || true

這兩種都可以忽略掉 exit(1) 產生時的異常錯誤,不過這兩種方法所表示的意義有些不同,就讓客倌您自己細細品嚐跟探討了。


星期六, 10月 17, 2015

用 Charles Proxy 編修前端程式 (JavaScript, CSS, Images, etc) 而不用去碰後端程式

年初加入了一個在東南亞頗具知名度,但在台灣卻沒啥人知道的社群網站公司 -- migme。目前擁有逾九千萬使用者、月活躍使用者數 (MAU) 大於兩千四百萬的 migme,後端 (Backend) 程式經過多年的演化後可謂極其複雜,不僅選用的程式語言相當廣泛,裡頭的商業邏輯與需要相容的平台很容易就可以讓一位有經驗的程式設計師感到挫折。(我們持續有在徵才,總部目前設在新加坡,年假起跳 20 天喔,歡迎一起來玩,啾咪 >_^ )

@Credit: DevBattles 不知不覺中我們可能養了一隻很大的怪獸
儘管我們已經用了 Vagrant (嗯,請不要問為什麼沒用 Docker,因為 Vagrant 是在 Docker 之前最紅的),努力整合所有的服務 (services) 到 Vagrant 的映像檔 (Image) 裡,試著減低捱過新手村的門檻,但是偶爾還是會因為像是某個 Library 版本不相容,或系統版本沒更新等等一些雜七雜八的事情,躲藏在暗處的小惡魔就會偷偷出來咬一口,這一口通常可大可小,一旦出現,可就會讓前端 (Frontend) 工程師或新加入的同事,耗掉一個下午或一整天時間來除這些可能跟前端完全沒關係的蟲了。

也就因為這樣,使我們依舊把成功執行開發環境視為一種成就,也是證明自己從超新手進階到新手的第一個獎盃。

那麼,該怎麼解決前端工程師的痛呢?

星期六, 9月 12, 2015

[開箱] Panasonic RULO MC-RS1 使用心得與評價

準備開箱,型號是 MC-RS1-W
上個月因為全家的心血來潮,在日本料理店慶祝完老爸的生日後,突然買了機票,決定一個禮拜後飛往日本東京家庭旅遊,先不說那時候才五個月大的小傢伙的護照問題,在連證件照都還沒拍、飯店都還沒著落就訂了機票這種衝動的事情,實在有種大學時代突然就夜衝的熟悉感。

回到正題,由於這次去東京花了一筆不小的金額購買了一台小媳婦掃地機器人(折合台幣約兩萬三千元左右),在使用一個多月後,決定來分享一下使用心得,以便讓不知道該型號(Panasonic RULO MC-RS1)優缺點的朋友有個參考依據。

註:由於購買時沒有比價又趕時間,在秋葉原 Yodobashi 買到的價錢比之後亂逛 價格.com 查到的含稅價格貴了大約一萬五千元日幣左右,所以如果沒有未稅的話,大約被貴了兩萬元日幣,之後我應該不會再到 Yodobashi 買電器了......

星期四, 2月 05, 2015

[MySQL] information_schema 中 USER_PRIVILEGES 沒有 'root'@'localhost'

正常情況的 USER_PRIVILEGES 表格 (table)
因為自己的電腦裡面有兩個 mysqld, 為了看起來漂亮, 也可以用 alfred 快速開啟想要測試的東西, 我決定留下 MAMP 包的 MySQL, 但是可能因為之前亂更新或是做了什麼蠢事, 我的 USER_PRIVILEGES 裡面 竟然只剩下 ''@'localhost' 這樣奇怪的帳號, 於是我想做什麼事情都會被系統說權限不足。

星期日, 9月 21, 2014

[PyCon JP] 2014 日本 PyCon 研討會隨記

Sushi 幫我拍的演講照片

這次原本投稿兩個題目, 一個是 Mezzanine 的 i18n 機制和流程, 另一個則是條條好爛路的開發心路歷程, 最後沒想到條條好爛路的開發心路歷程被接受採用了, 於是突然間就要在超級忙碌的結婚、買房行程中臨時加入了一個到日本演講的小副本。

因為結婚忙碌的關係, 直到要出發的那一個禮拜我才把機票跟住宿都給搞定, 選擇搭廉價航空跟膠囊旅館, 說實在的以現在快三十歲的年紀來說有些辛苦, 不過因為結婚跟買房的開銷壓力讓我不得不儘量選便宜的就好。

星期六, 8月 23, 2014

談談 robots.txt 的 Disallow 和 Allow 順序

昨天晚上在臉書上看到一篇熱門轉貼:


儘管原文有附一篇文章來佐證自己的看法, 但是基於自己對 robots.txt 的好奇及工程師喜歡驗證事情的吃飽太閒心態, 我做了個短短幾分鐘的驗證, 並記錄相關查詢資料如下。

首先我必須揭露的是我對此次台北市市長候選人連勝文完全沒好感, 這篇文章單純只是探究 robots.txt 被誤導的特性。

星期四, 6月 05, 2014

2014 外語導遊/領隊 (英語) 筆試口試考試心得

專業科目分數很不漂亮的成績單
去年 (2013) 看到新聞說導遊/領隊要考試了, 當時沒多想什麼就報名下去, 單純只是想順便驗證自己對於所生活的台灣了解多少, 想說導遊/領隊的考試的及格標準是平均 60 分, 雖然很久沒考試, 或許可以靠不是很好的英文加一點分矇看看吧。先說結論, 最後我順利拿到外語導遊, 至於外語領隊則是平均差了 0.8 及格, 以一個筆試完全沒準備的人來說, 我覺得我算是蠻幸運的。(雖然我還是很懊惱為什麼在寫領隊的考卷時太悠哉而沒寫完十幾題, 只要多對個兩三題選擇題就可以兩張都到手了啊)

相較於筆試的完全沒準備, 外語導遊的口試我倒是利用假日扎扎實實的準備了兩三天(剛好靠這個口試免了教召, 多吸了五天的自由空氣), 有時候在騎車、搭捷運時就會自言自語的開始小聲練習起來, 考試前幾天又因為發生了不幸的江子翠捷運事件, 在搭乘捷運的練習途中我常常很怕我被當成怪人給抓了起來......

(註:筆試心得網路上很多, 因為我也沒啥心得, 我的心得只有原來國家考試會有一些莫名其妙的考題出現, 所以這篇文章主要在記錄口試的部分, 不過考完後我知道筆試前要多看觀光局網站, 聽說很多東西是從裡面考的, 法規也要讀, 不能像我一樣考出來就是送給他們或玩猜猜樂, 不過我本來原意就是要來測自己實力的, 看了感覺又好像作弊......)

星期六, 5月 17, 2014

PyCon APAC 2014 Day 1 in Taipei

當個小粉絲跟 Mezzanine 的作者 Stephen McDonald 合照, 先跟他小小抱怨了沒有 i18n 的痛苦, 他說那是現在排名第一名的 Missing Feature, 他回去就會把 pull requests 好好的 merge 回去了
五月似乎是所有的事情都擠在一起發生, 由於去年 PyCon 舉辦的時間剛好跑去澎湖花火節而錯過了, 所以儘管被一堆事卡著, 還是決定參加湊熱鬧。

今天(5/17)有些蠻有趣的心得, 希望對資訊或數學有興趣的人可以花點時間看一下, 沒有太高深的東西(太高深的我也不會), 僅僅是點到為止的介紹。

Keynote


首先從今天的 Keynote 開始, 主講者是來自 DataPad 的 Wes McKinney, 他同時是 Pandas 和 Python for Data Analysis 的作者。他的講題主要的方向可能是從他自身經驗(BI, 商業邏輯) 來導出 Python 在資料科學的趨勢、重要性及實用性。

接著提到在資料科學中的 ETL (Extract, Transform, Load) 不是件容易的事, 很多人認為, 在資料科學中往往最困難的不是在資料分析, 而是在資料的導入與取得上面。對此, 他也引用了 Big Data Borat 在 Twitter 上說的話來提供這觀點的共鳴(註:真的!):

星期五, 4月 25, 2014

[Mezzanine] 利用 Django 的 Middleware 機制進行多國語系 (I18N) 處理 (使用 JavaScript 的解決方案)

Mezzanine i18n Best Practice (對我們而言最佳的解決方案)
由於 Mezzanine 對多國語系的處理感覺還在起步階段, 而原作者 Stephen McDonald 在一則類似問題中所提出的替代方案 (approch) 為在後台新增多個站台, 並將各國語言分別指向各個站台, 這樣的意思是說, 倘若今天一篇文章需要 16 種的語言翻譯, 就必須要分別上稿至 16 個網站, 按照管理系統的設計, 就是要切換 16 次到不同網站, 然後再分別新增文章......我想如果我們這樣搞的話, 這樣的解決方案可能會被罵死, 因此, 我們決定對這個部分進行一些客製化。

目標:
使用者進入網站時, 判斷最合適語言, 利用 JavaScript (AngularJS) 函數將所需要翻譯的文字進行替換

Popular Posts

Blog Archive

自2013/3重設後總瀏覽量