在 windows 上用 virtualbox 來開發,因為我總是使用 default Vagrantfile ,沒有多久,就遇到了預設的 10G disk space 不夠用的情況。
查了一些資料,發現需要下一堆很複雜的指令,我實在很擔心自己會搞不定。
仔細找了一下,結果有一個 vagrant plugin 可以達成這個功能! vagrant-disksize
Wednesday, June 27, 2018
Tuesday, June 26, 2018
integration test with mysql
重構公司的 legacy code 時,發覺沒有 integration test ,一遇到資料庫相關的程式碼,心裡就覺得很棘手,不知該如何是好?
於是就動手做了一小段 integration test 的準備。
1. 首先是準備資料庫
2. 再來是準備初始資料
3. 將初始資料塞進資料庫
準備資料庫的部分,用 docker 好了。
準備初始資料的部分,想了一下,就用 mysql workbench 。
mysql workbench 要 export 資料,如果是用 csv 格式的話,可以 export 查詢的 result set 。但是如果要 export sql 格式的話,只能是 table 或是 database 。後來,我選擇先用 query 來做出一張新的 table ,再用 mysql workbench 來 export table
將初始資料塞進資料庫的部分,我本來是想說,我開發的程式語言是 nodejs ,我就用 nodejs 來做檔案的讀取,與資料庫的寫入吧? 結果,試了一些專門做資料庫 import 的 library 之後,卻出乎意料之外的…很難用。
重新考慮之後,如果考慮 dependency declaration 和 dependency isolation ,最好還是把測試用 nodejs 來做。不過,既然只是 integration test ,前兩者似乎也可以做一些妥協,那我還是用單純的老方法 mysql client 來做好了。
於是就動手做了一小段 integration test 的準備。
1. 首先是準備資料庫
2. 再來是準備初始資料
3. 將初始資料塞進資料庫
準備資料庫的部分,用 docker 好了。
準備初始資料的部分,想了一下,就用 mysql workbench 。
mysql workbench 要 export 資料,如果是用 csv 格式的話,可以 export 查詢的 result set 。但是如果要 export sql 格式的話,只能是 table 或是 database 。後來,我選擇先用 query 來做出一張新的 table ,再用 mysql workbench 來 export table
將初始資料塞進資料庫的部分,我本來是想說,我開發的程式語言是 nodejs ,我就用 nodejs 來做檔案的讀取,與資料庫的寫入吧? 結果,試了一些專門做資料庫 import 的 library 之後,卻出乎意料之外的…很難用。
重新考慮之後,如果考慮 dependency declaration 和 dependency isolation ,最好還是把測試用 nodejs 來做。不過,既然只是 integration test ,前兩者似乎也可以做一些妥協,那我還是用單純的老方法 mysql client 來做好了。
#!/bin/bash docker run --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql:5.6 # wait docker initialized sleep 30 # import ce.item-report-hourly mysql -h 127.0.0.1 -uroot -ppassword < ./ce_item_report_hourly.sql
Labels:
integration_test,
mysql
Thursday, June 14, 2018
AWS 服務的除錯
現在任職的公司對 backend service 的要求是要設計成 horizontal scalable 的設計,所以其實用了滿多的 AWS 的技術。一個新的 nodejs 服務剛做出來的時候,有時候功能還不完整,也沒有設計複雜的 log 機制,那這樣子的話,該怎麼在生產環境中除錯呢?
AWS 的 Elastic Load Balancer 是有 access logs 的機制的,所以把這個部分設定好,之後就可以把這個 ELB 的 access logs 當做 apache access logs 來除錯了。
AWS 的 Elastic Load Balancer 是有 access logs 的機制的,所以把這個部分設定好,之後就可以把這個 ELB 的 access logs 當做 apache access logs 來除錯了。
Labels:
apache,
aws,
Elastic_Load_Balancer
Friday, May 25, 2018
AWS 使用心得
在 intowow 上班,不知不覺過了 5 個月,本來對 AWS 的理解就是只會用 EC2 來布署虛擬機,玩了 5 個月之後,也或多或少多學了一些東西。
對 AWS 的理解大概是這樣子,本來在非雲端的世界裡,可以用的東西,幾 AWS 的雲端環境,幾乎都會有至少同一個等級,或是更好的解決方案。比方說:
在 intowow 比較新的專案幾乎都會做的 devops 工作,是 continuous integration 和 continuous deploy
continuous integration 用 codebuild 來做
continuous deploy 用 cloudformation 來做
整套 CI/CD 則是用 codepipeline 來做
對 AWS 的理解大概是這樣子,本來在非雲端的世界裡,可以用的東西,幾 AWS 的雲端環境,幾乎都會有至少同一個等級,或是更好的解決方案。比方說:
- 檔案 (file) => S3
- 排程 (cronjob) => cloudwatch schedule event
- 防火牆 (iptables) => security groups
- 路由器 (router) => VPC & subnet
- 自動擴展的服務 => serverless lambda
在 intowow 比較新的專案幾乎都會做的 devops 工作,是 continuous integration 和 continuous deploy
continuous integration 用 codebuild 來做
continuous deploy 用 cloudformation 來做
整套 CI/CD 則是用 codepipeline 來做
Tuesday, March 27, 2018
javascript regular expression 常見的用法
(1) 全部取代「特定字串」
範例: 刪除所有的 a 字元
const s = 'abcdeabcdeabcde';
const r = s.replace(/(?:a)/g, '');
使用 non-capturing group 符號 ?:
(2) 計算「特定字串」的所有出現次數
範例: 計算所有的 a 字元出現次數
const s = 'abcdeabcdeabcde';
const times = (s.match(/a/g) || []).length
(3) 比對所有符合的特定字串
範例: 找出所有的 abcdeabcde
const s = 'abcdeabcdeabcde';
const rr = s.match(/(abcde)\1/g);
範例: 刪除所有的 a 字元
const s = 'abcdeabcdeabcde';
const r = s.replace(/(?:a)/g, '');
使用 non-capturing group 符號 ?:
範例: 計算所有的 a 字元出現次數
const s = 'abcdeabcdeabcde';
const times = (s.match(/a/g) || []).length
(3) 比對所有符合的特定字串
範例: 找出所有的 abcdeabcde
const s = 'abcdeabcdeabcde';
const rr = s.match(/(abcde)\1/g);
使用 capturing group 和 back reference
Labels:
javascript,
regex
Sunday, February 18, 2018
讀 kibit static code analyzer
Clojure 的 kibit static code analyzer 可以掃瞄你寫的程式碼,並且做比對,如果發現有更好的寫法,它就會提供你做為參考。很多初學者容易寫的「冗餘表達法」,都會被 kibit 抓出來。
比方說:
(= 0 x) 就會被 kibit 建議改成 (zero? x)
我一時興起,下載了 kibit 的 source code 來研究之後,腦子裡立刻充滿了一大堆問號。經過歸納之後,我把這些自己問自己的問題,歸納了一下。首要的問題,當然是「kibit 是如何實現的?」
這個問題可以拆解成下列的幾個問題:
(1) 我們寫的程式碼,是如何被 kibit 讀入,以什麼樣的資料型態儲存?
clojure 的 source code 被 kibit 讀入之後,刻意以 unevaluated form 的形式,視為是 list 的 data structure ,而不是字串。之後,就用 tree-seq 將 list expression 拆解成「子樹」,即 sub form 。
(2) kibit 裡的 rules 是怎麼呈現的?
kibit 裡的 rules 可以寫成 vector 的形式。比如: [(= 0 ?x) (zero? ?x)]
其中, ?x 的部分,是可以用來做 binding 的部分。
(3) 用什麼 library 來做「模式比對」?
使用 core.logic 這個 library 來做 unification
就我個人的看法,其實沒有使用 core.logic 大部分的功能,所以如果改寫的話,說不定可以用 core.unify 來替代掉。
這邊一句話簡單介紹一下 core.unify 這個 library 主要的功能: unification
Unification is the process of taking two expressions and substituting all of the variables with matching concrete expressions.
範例:
(unify/unify '(= 0 aa) '(= 0 ?x))
比方說:
(= 0 x) 就會被 kibit 建議改成 (zero? x)
我一時興起,下載了 kibit 的 source code 來研究之後,腦子裡立刻充滿了一大堆問號。經過歸納之後,我把這些自己問自己的問題,歸納了一下。首要的問題,當然是「kibit 是如何實現的?」
這個問題可以拆解成下列的幾個問題:
(1) 我們寫的程式碼,是如何被 kibit 讀入,以什麼樣的資料型態儲存?
clojure 的 source code 被 kibit 讀入之後,刻意以 unevaluated form 的形式,視為是 list 的 data structure ,而不是字串。之後,就用 tree-seq 將 list expression 拆解成「子樹」,即 sub form 。
(2) kibit 裡的 rules 是怎麼呈現的?
kibit 裡的 rules 可以寫成 vector 的形式。比如: [(= 0 ?x) (zero? ?x)]
其中, ?x 的部分,是可以用來做 binding 的部分。
(3) 用什麼 library 來做「模式比對」?
使用 core.logic 這個 library 來做 unification
就我個人的看法,其實沒有使用 core.logic 大部分的功能,所以如果改寫的話,說不定可以用 core.unify 來替代掉。
這邊一句話簡單介紹一下 core.unify 這個 library 主要的功能: unification
Unification is the process of taking two expressions and substituting all of the variables with matching concrete expressions.
範例:
(unify/unify '(= 0 aa) '(= 0 ?x))
;; => {?x aa}
Labels:
clojure,
kibit,
logic_programming
Friday, February 9, 2018
Http API 使用 query string / header 來傳送 json
公司的一隻 http API 的設計是這樣子:
(1) 會接受 http POST
(2) http body 是 xml
(3) 其它的 meta data 是透過 query string 來傳遞。
meta data 的參數有一些是字串、有一些是整數。然而,API 端將這些 query string 解析出來的時候,資料型別的資訊卻早已不復存在,全都變成了字串。這是因為 http query string 並沒有支援資料型別的表示法。
那…是否可以把資料先用 json 來表示,再將 json 塞進其中一個 query string 又或是 http header 呢?如此發送端就可以把資料的型別也一併送到接收端了。
查了 stackoverflow 之後,這些問題也有人討論了,建議的解法如下:
(a) 如果 json 要放入 http header 的話,json 先做 base64 編碼,再放入 http header 。JSON web token 就是使用 base64
(b) 如果 json 要放入 query string 的話,json 先做 URLencode ,再收入 query string 。但是,必須要注意 URL 長度限制的問題。
(1) 會接受 http POST
(2) http body 是 xml
(3) 其它的 meta data 是透過 query string 來傳遞。
meta data 的參數有一些是字串、有一些是整數。然而,API 端將這些 query string 解析出來的時候,資料型別的資訊卻早已不復存在,全都變成了字串。這是因為 http query string 並沒有支援資料型別的表示法。
那…是否可以把資料先用 json 來表示,再將 json 塞進其中一個 query string 又或是 http header 呢?如此發送端就可以把資料的型別也一併送到接收端了。
查了 stackoverflow 之後,這些問題也有人討論了,建議的解法如下:
(a) 如果 json 要放入 http header 的話,json 先做 base64 編碼,再放入 http header 。JSON web token 就是使用 base64
(b) 如果 json 要放入 query string 的話,json 先做 URLencode ,再收入 query string 。但是,必須要注意 URL 長度限制的問題。
Subscribe to:
Posts (Atom)