2017年7月26日 星期三
Null object pattern
在需要 check object 是否存在的時候使用 null object pattern,如果 object 不存在就用 null object,null object 提供跟原本 object 很像的 API 接口,並預設這些 API 的行為,讓程式可以安心的使用這些 API
https://www.tutorialspoint.com/design_pattern/null_object_pattern.htm
Ruby:
https://gist.github.com/davidbella/6918455
開發第一個智能合約 - 環境準備
首先安裝框架
http://truffleframework.com/docs/getting_started/client
測試環境
https://github.com/ethereumjs/testrpc
package:
https://www.ethpm.com/registry
Ruby exceptions 進階
backtrace
error.backtrace
可以看出是在哪裡報錯
如果 rescue 後再 raise 還可以看出是上一個 error 是什麼
def fail_and_reraise
raise NoMethodError
rescue
raise RuntimeError
end
begin
fail_and_reraise
rescue => e
puts "#{ e } caused by #{ e.cause }"
end”
Excerpt From: Starr Horne. “Mastering Ruby Exceptions.” iBooks.
TracePoint
可以做成 log 系統的好東西,自動 catch 每個 error 並記錄
http://ruby-doc.org/core-2.2.0/TracePoint.html
error.backtrace
可以看出是在哪裡報錯
如果 rescue 後再 raise 還可以看出是上一個 error 是什麼
def fail_and_reraise
raise NoMethodError
rescue
raise RuntimeError
end
begin
fail_and_reraise
rescue => e
puts "#{ e } caused by #{ e.cause }"
end”
Excerpt From: Starr Horne. “Mastering Ruby Exceptions.” iBooks.
TracePoint
可以做成 log 系統的好東西,自動 catch 每個 error 並記錄
http://ruby-doc.org/core-2.2.0/TracePoint.html
Ruby 可以在 class 內定義 exception method,這樣就可以 raise 這個 class
不囉唆,上 code
Raising Non-Exceptions
If we provide an exception method, any object can be raised as an exception.
Imagine you have a class called HTMLSafeString which contains a string of text. You might want to make it possible to pass one of these “safe” strings to raise just like a normal string. To do this we simply add an exception method that creates a new RuntimeError.
class HTMLSafeString
def initialize(value)
@value = value
end
def exception
RuntimeError.new(@value)
end
end
raise HTMLSafeString.new("helloworld")”
Excerpt From: Starr Horne. “Mastering Ruby Exceptions.” iBooks.
Form object pattern
優點:
1. 把讓 controller 和 view 的邏輯拆開,讓 form object 負責,符合 single responsibility principle
2. 如果 include active_record 可以享用 validations, errors 和符合 convention 等優點
http://culttt.com/2015/11/04/using-form-objects-in-ruby-on-rails/
https://webuild.envato.com/blog/creating-form-objects-with-activemodel-and-virtus/
https://robots.thoughtbot.com/activemodel-form-objects
標籤:
Design Pattern,
ROR
2017年7月25日 星期二
[網路原理重修系列][3] Socket, Process
應用層運行的程序叫做 process,每個 process 經過 socket 和傳輸層溝通,socket 其實就是提供給應用層跟傳輸層溝通的 API
如果 IP 是地址,port 就像房間號,主流的幾個 port 已經在操作系統中預先定義了例如 80 是 web application, 25 是 smtp email 用的
如果 IP 是地址,port 就像房間號,主流的幾個 port 已經在操作系統中預先定義了例如 80 是 web application, 25 是 smtp email 用的
2017年7月22日 星期六
在 rails 內避免數字因為 race condition 而有誤
例如我有個 Account model 內有 balance column,可以這樣做:
```ruby
def increment_balance(amount)
self.class.connection.execute "update accounts set balance = balance + #{amount} where id = #{id}"
add_to_transaction # so after_commit will be triggered
self
end
```
這樣就算我有兩個 account instance 同時存入也沒關係,因為他增加的值是從 database 的值去加的,如果是用
```ruby
account.update(amount: new_amount)
```
這種作法的話就會變成直接 update 成新的值,就可能會有 race condition 的問題
B+ tree (B plus tree)
前一篇學習了 什麼是 B- balance tree,立馬再來補習一下 B+
其實 B+ tree 就是 B- 的升級版
主要的差別在於「子節點有母節點的資訊」,並且「出現在子節點中的母節點元素都是子節點中最大的元素」,不囉唆,看圖:
我們看第三層的所有子節點可以發現,每個子節點最右邊(也就是最大)的元素都是母節點的元素
如此一來就變成一個依照順序排序的子節點
優點:
1. 可以減少 IO 次數,因為子節點有所有的 data,母節點只有索引而已
2. 在做範圍查詢的時候,B- 如果查詢的範圍橫跨節點的兩邊就必須要先走左邊再走右邊去查資料,但 B+ 可以在最底層的子節點往右邊直接找就行了(因為子節點有所有的 data)
3. 更矮胖
4. 所有查詢都要查到子節點,代表查詢的速度比較一致,不會有些快有些慢(穩定性高)(相對的也可以說成是「一樣快」或是「一樣慢」)
圖片以及資訊來源:
http://mp.weixin.qq.com/s/cK_GIhCuGoUwJpDpoaETxw
其實 B+ tree 就是 B- 的升級版
主要的差別在於「子節點有母節點的資訊」,並且「出現在子節點中的母節點元素都是子節點中最大的元素」,不囉唆,看圖:
我們看第三層的所有子節點可以發現,每個子節點最右邊(也就是最大)的元素都是母節點的元素
如此一來就變成一個依照順序排序的子節點
優點:
1. 可以減少 IO 次數,因為子節點有所有的 data,母節點只有索引而已
2. 在做範圍查詢的時候,B- 如果查詢的範圍橫跨節點的兩邊就必須要先走左邊再走右邊去查資料,但 B+ 可以在最底層的子節點往右邊直接找就行了(因為子節點有所有的 data)
3. 更矮胖
4. 所有查詢都要查到子節點,代表查詢的速度比較一致,不會有些快有些慢(穩定性高)(相對的也可以說成是「一樣快」或是「一樣慢」)
圖片以及資訊來源:
http://mp.weixin.qq.com/s/cK_GIhCuGoUwJpDpoaETxw
標籤:
Algorithm,
Computer Basic,
Database
什麼是 btree (balance tree) (b-)
常常看到 postgresql 的 index 都是用 btree 的方式 index,但一直沒時間去研究什麼是 btree,最近發現一個不錯的維信號用漫畫的方式解釋各種演算法相關的東西,剛好看到 b- b+ 的介紹,該是時候學習一下了~
所謂的 b- 其實唸作 balance tree 或是 b tree,是跟二元樹有點相關的東西,但最大的差別在於他每個節點最多可以包容兩個值,這樣做的原因是如果我們用二元樹來下 index,雖然時間複雜度很低,但是由於每個節點都寫入在硬碟的不同位置,一旦運氣不好我們要找的節點剛好是在樹的最底端,那硬碟就要從最上面的節點一路讀取到最下面的節點,雖然時間複雜度低但是硬碟讀取的效率差,為了讓硬碟讀取的次數變少於是有了 b- 的結構。
b- 讓一個節點可以容納兩個數值,如此一來下面就可以有三個節點,並且可以在節點內定位省了一次到不同硬碟空間的時間。
所謂的 b- 其實唸作 balance tree 或是 b tree,是跟二元樹有點相關的東西,但最大的差別在於他每個節點最多可以包容兩個值,這樣做的原因是如果我們用二元樹來下 index,雖然時間複雜度很低,但是由於每個節點都寫入在硬碟的不同位置,一旦運氣不好我們要找的節點剛好是在樹的最底端,那硬碟就要從最上面的節點一路讀取到最下面的節點,雖然時間複雜度低但是硬碟讀取的效率差,為了讓硬碟讀取的次數變少於是有了 b- 的結構。
b- 讓一個節點可以容納兩個數值,如此一來下面就可以有三個節點,並且可以在節點內定位省了一次到不同硬碟空間的時間。
另外新增刪減節點的時候也是比較耗時的,為了確保最有效率地運作,新增刪減節點是有機會去更動到母節點的
總之 postgres 是預設使用 btree,瞭解一下更清楚自己平時在做什麼事XD
另外也寫了一篇 關於 B+ tree的介紹
圖片和資訊來源:
標籤:
Algorithm,
Computer Basic,
Database
2017年7月17日 星期一
Node js 的 stack
今天問了 Max https://github.com/maxyihsunchou 在 Node 開發環境現在建議做什麼設置,收穫良多
1. mongodb 的 wrapper https://github.com/Automattic/mongoose
2. Mac app: LaunchRocket 自動開 db
3. require files 的整理方法參考 https://github.com/maxyihsunchou/askPresenter
4. 自動重啟 node server 的工具 https://github.com/remy/nodemon
5. mongodb 的 GUI https://robomongo.org/
6. require config file https://github.com/maxyihsunchou/askPresenter/blob/f98e0d02f7aa4342d14631bd290fc686a45ea2d3/config/default.js
7. 新的 web framework Koa (取代 express) https://github.com/koajs/koa
https://github.com/maxyihsunchou/askPresenter/blob/f98e0d02f7aa4342d14631bd290fc686a45ea2d3/services/index.js
module.exports = {
fnName: require("file")
}
1. mongodb 的 wrapper https://github.com/Automattic/mongoose
2. Mac app: LaunchRocket 自動開 db
3. require files 的整理方法參考 https://github.com/maxyihsunchou/askPresenter
4. 自動重啟 node server 的工具 https://github.com/remy/nodemon
5. mongodb 的 GUI https://robomongo.org/
6. require config file https://github.com/maxyihsunchou/askPresenter/blob/f98e0d02f7aa4342d14631bd290fc686a45ea2d3/config/default.js
7. 新的 web framework Koa (取代 express) https://github.com/koajs/koa
https://github.com/maxyihsunchou/askPresenter/blob/f98e0d02f7aa4342d14631bd290fc686a45ea2d3/services/index.js
module.exports = {
fnName: require("file")
}
2017年7月16日 星期日
[網路原理重修系列][2] - OSI 模型 - 網路分層
第一層︰實體層(Physical Layer)
網卡之類的
第二層︰資料連結層(Data Link Layer)
傳送資料的層級,資料帶有 MAC address,由這層決定怎麼處理發送這些資料
第三層︰網路層(Network Layer)
讓資料在網路上傳遞的層級,路由器就是這層,這一層中最主要的通訊協定是網際網路協定(Internet Protocol,IP)
第四層︰傳輸層(Transport Layer)
傳輸控制協定(Transmission Control Protocol,TCP)是我們常接觸具有傳輸層功能的協定,負責將更上層的資料做分發、錯誤處理等工作,ex: 切割上層的資料轉發給網路層
第五層︰會議層(Session Layer)
(這部分還沒有很確定,先 copy paste)
這個層級負責建立網路連線,等到資料傳輸結束時,再將連線中斷,運作過程有點像召集多人開會(建立連線),然後彼此之間意見交換(資料傳輸),完成後,宣布散會(中斷連線)。
有很多應用服務運作在會議層上,我們常接觸到的是NetBIOS names,這是一種用來識別電腦使用NetBIOS資源的依據。我們使用Windows系統時,開啟網路上的芳鄰,或是用到「檔案及列印分享」時,通常會看到群組及電腦名稱,這些就是NetBIOS names定義的。
第六層︰展示層(Presentation Layer)
負責資料轉檔,例如將ASCII編碼轉成應用層可以使用的資料,或是處理圖片及其他多媒體檔案,如JPGE圖片檔或MIDI音效檔。除了轉檔,有時候當資料透過網路傳輸時,需要將內容予以加密或解密,而這個工作就是在展示層中處理。
第七層︰應用層(Application Layer)
Http, POP3, FTP....等等的協定都是這一層
http://ithelp.ithome.com.tw/articles/10000021

網卡之類的
第二層︰資料連結層(Data Link Layer)
傳送資料的層級,資料帶有 MAC address,由這層決定怎麼處理發送這些資料
第三層︰網路層(Network Layer)
讓資料在網路上傳遞的層級,路由器就是這層,這一層中最主要的通訊協定是網際網路協定(Internet Protocol,IP)
第四層︰傳輸層(Transport Layer)
傳輸控制協定(Transmission Control Protocol,TCP)是我們常接觸具有傳輸層功能的協定,負責將更上層的資料做分發、錯誤處理等工作,ex: 切割上層的資料轉發給網路層
第五層︰會議層(Session Layer)
(這部分還沒有很確定,先 copy paste)
這個層級負責建立網路連線,等到資料傳輸結束時,再將連線中斷,運作過程有點像召集多人開會(建立連線),然後彼此之間意見交換(資料傳輸),完成後,宣布散會(中斷連線)。
有很多應用服務運作在會議層上,我們常接觸到的是NetBIOS names,這是一種用來識別電腦使用NetBIOS資源的依據。我們使用Windows系統時,開啟網路上的芳鄰,或是用到「檔案及列印分享」時,通常會看到群組及電腦名稱,這些就是NetBIOS names定義的。
第六層︰展示層(Presentation Layer)
負責資料轉檔,例如將ASCII編碼轉成應用層可以使用的資料,或是處理圖片及其他多媒體檔案,如JPGE圖片檔或MIDI音效檔。除了轉檔,有時候當資料透過網路傳輸時,需要將內容予以加密或解密,而這個工作就是在展示層中處理。
第七層︰應用層(Application Layer)
Http, POP3, FTP....等等的協定都是這一層
http://ithelp.ithome.com.tw/articles/10000021

[網路原理重修系列][1] - 重要的名詞定義
ISP (Internet service provider):
網路供應商,可以想成是提供線路的人,有高質國家層級、公司層級,也有 Local 層級的
Communication link
Packet switch 分組交換器
http://acai-hsieh.blogspot.hk/2013/07/circuit-switching-vs-packet-switching.html
就我目前的理解是 packet switch 是一種封包交換方式,其他還有 Circult Switched 和 Message switching 等等
TCP/IP (Transmission Control Protocol / Internet Protocol)
Router 路由器
Wikipedia: 提供路由與轉送兩種重要機制,可以決定封包從來源端到目的端所經過的路由路徑(host到host之間的傳輸路徑),這個過程稱為路由;將路由器輸入端的封包移送至適當的路由器輸出端(在路由器內部進行),這稱為轉送。
Distributed Application
之前好像介紹過,只要應用程式是在不同的電腦間溝通就算 distributed application, 所以基本上所有的 web application 都是,因為瀏覽器和 server 是不同的電腦
API (Application Programming Interface)
給程式使用的接口
Protocol
有點像規格定義書
網路上的各種標準化規範都由一個稱作 IETF 的網路工程任務組定義,他們會發布 RFC 文檔作為規範的參考文檔,基本上就是網路界的立法院
網路供應商,可以想成是提供線路的人,有高質國家層級、公司層級,也有 Local 層級的
Communication link
Packet switch 分組交換器
http://acai-hsieh.blogspot.hk/2013/07/circuit-switching-vs-packet-switching.html
就我目前的理解是 packet switch 是一種封包交換方式,其他還有 Circult Switched 和 Message switching 等等
packet switch 其實就是 router
TCP/IP (Transmission Control Protocol / Internet Protocol)
Router 路由器
Wikipedia: 提供路由與轉送兩種重要機制,可以決定封包從來源端到目的端所經過的路由路徑(host到host之間的傳輸路徑),這個過程稱為路由;將路由器輸入端的封包移送至適當的路由器輸出端(在路由器內部進行),這稱為轉送。
白話文就是交通警察指揮交通的意思
Distributed Application
之前好像介紹過,只要應用程式是在不同的電腦間溝通就算 distributed application, 所以基本上所有的 web application 都是,因為瀏覽器和 server 是不同的電腦
API (Application Programming Interface)
給程式使用的接口
Protocol
有點像規格定義書
網路上的各種標準化規範都由一個稱作 IETF 的網路工程任務組定義,他們會發布 RFC 文檔作為規範的參考文檔,基本上就是網路界的立法院
2017年7月15日 星期六
使用工具檢查有沒有有問題的 gem
很不錯的文章,應該要來試試看
https://philna.sh/blog/2017/07/12/two-tests-you-should-run-against-your-ruby-project-now/
https://philna.sh/blog/2017/07/12/two-tests-you-should-run-against-your-ruby-project-now/
Rails 5.2 似乎要自帶上傳功能囉 (ActiveStorage)
http://afreshcup.com/home/2017/7/6/introduction-to-active-storage.html
https://github.com/rails/activestorage
什麼是 Token 幣
在 etherium 上發行 token 幣,在交易所交易 token 幣,token 幣基本上就是買未來幣的發票(ICO 在做的就是這件事),所以 token 幣主要是對照該幣(ico 機構)的市場價值
例:EOS 就是發行於 ETH 上的 token,或說是智能合約,讓你可以用 ETH 買 EOS
http://btsabc.org/article-972-1.html
https://www.ptt.cc/bbs/DigiCurrency/M.1498097273.A.69D.html
https://kknews.cc/tech/xm4xzx8.html
https://theethereum.wiki/w/index.php/ERC20_Token_Standard
Proxy server & Reverse proxy server
Proxy server 代理伺服器
http://linux.vbird.org/linux_server/0420squid.php
就是代理人的概念,把封包打到代理伺服器,讓代理伺服器去跟網路上的其他伺服器拿資料
資訊流動的方向是
自己的電腦 -> 代理伺服器 -> 網路上的伺服器 -> 代理伺服器 -> 自己的電腦
Reverse Proxy server 反向代理伺服器
就是上述流程反過來,把自己想像成是別人想造訪的 server 就會比較好理解
別人的電腦 -> 反向代理伺服器 -> 自己的電腦(其實就是伺服器) -> 反向代理伺服器 -> 別人的電腦
http://blog.csdn.net/afeionepiece/article/details/45170941
http://www.arthurtoday.com/2010/01/reverse-proxy-server.html
http://www.iigrowing.cn/proxy-server-ji-reverse-proxy-server-de-guan-xi.html
Rails 的 schema.rb file 的用處
https://stackoverflow.com/questions/9884429/rails-what-does-schema-rb-do
簡單來說:
1. production 環境 schema.rb 正不正確都沒差,但錯誤很容易會造成其他 developers 的困擾,而且送 commit 會被逼著改到 schema.rb 的 file
2. test 環境會爆,因為 rake db:test:prepare 的時候會 run rake db:schema:dump
http://www.tutorialspoint.com/ruby-on-rails/rails-and-rake.htm
簡單來說:
1. production 環境 schema.rb 正不正確都沒差,但錯誤很容易會造成其他 developers 的困擾,而且送 commit 會被逼著改到 schema.rb 的 file
2. test 環境會爆,因為 rake db:test:prepare 的時候會 run rake db:schema:dump
http://www.tutorialspoint.com/ruby-on-rails/rails-and-rake.htm
2017年7月7日 星期五
智能合約 Escrow
Escrow 這個詞是從美國房地產來的,意思是公正的第三方幫忙抵押貸款,確保交易可以正確進行
現在運用在虛擬貨幣交易上是一樣的道理,因為雙方交易時會有誰先付錢的問題,所以可以使用智能合約當做第三方中立機構(escrow)來增加可信度。
智能合約做的事情就是簡單的確認雙方都匯款後才把錢交換轉到雙方的戶頭
網路上的一個實作:
https://github.com/dymnz/Escrow/blob/master/escrow.sol
大概是這個概念
至於什麼是智能合約,改天再打吧
Google Authenticator 的實作原理
簡單來說就是使用密鑰+時間的加密方式,加密細節可以參考下方網站
https://www.zhihu.com/question/20462696
http://www.csdn.net/article/2014-09-23/2821808-Google-Authenticator
使用上來說就是網站先幫使用者產生隨機密鑰,使用者用 Google Authenticator 輸入密鑰後用現在的時間算出一個加密過後的一串很長的 16 進位數,利用這個 16 進位數來雙重認證。
Google Authenticator 本身多做的兩件事情是
1. 使用 30 秒為一個區間加密
2. 將加密出來的 16 進位數再算成六位數的十進位數字讓使用者比較容易輸入
也就是說如果網站開發者要實作 google authenticator 的二階段認證的話就必須
1. 將六位數字換算回 16 進位數字
2. 根據 30 秒為一個區間解密使用者輸入的數字,而不是使用當下時間點
ruby 上的實作:
https://github.com/mdp/rotp
訂閱:
文章 (Atom)


