Whats is Docker?
Docker is an open-source project that automates the deployment of applications inside software containers. It is promoted by the company Docker, Inc.
Docker provides an additional layer of abstraction and automation of operating-system-level virtualization on Windows and Linux.Docker uses the resource isolation features of the Linux kernel such as cgroups and kernel namespaces, and a union-capable file system such as OverlayFS and others to allow independent "containers" to run within a single Linux instance, avoiding the overhead of starting and maintaining virtual machines.
1. Docker Cheatsheet
https://github.com/wsargent/docker-cheat-sheet
2. Docker Crash Course
https://github.com/oren/docker-crash-course
3. Docker in a Nutshell
https://www.slideshare.net/Flux7Labs/docker-in-a-nutshell-docker-austin-july-meetup
2017年5月25日星期四
2017年5月10日星期三
jQuery 跟 AngularJS 的糾葛
AngularJS 有些人覺得難學理由之一,是因為它跟大多數網站所使用的 jQuery 設計思維差很多。
而且 AngularJS 又有內建 jqLite (jQuery 的精簡版),
造成一開始用 AngularJS 設計網站的時候會被 jQuery 的想法牽著走,然後又覺得被 AngularJS 的框架束縛住。
就會覺得 AngularJS 很複雜。
我對 jQuery 跟 AngularJS 整理出的一些想法
1. jQuery vs AngularJS
jQuery 是操作畫面 DOM 的工具函式庫;AngularJS 是軟體框架。
jQuery 的思維來說,開發一個網站的步驟是
- 拿到設計稿
- 切割畫面成一個一個 components
- jQuery time! 找尋 DOM element, 使用 jQuery 繫結 element 的事件。 (操作 DOM)
- 把全部的 components 的動作寫完 -> 完成網站!!
AngularJS 思維是
- 拿到設計稿
- Angular time! 開始構想架構。(從 application 的思維開始想, 思考此 app 需要什麼事件、 DOM 或 functions)
- 撰寫 JavaScript ,把需要的資源 (model or functions) 準備好。
- 撰寫 HTML template,把對應的資源綁在 DOM 上面. (ng-model, ng-click, etc)
pros: HTML 精簡,不會把邏輯放在 HTML 上
cons: 當網站架構變大時,JavaScript files 最後會很肥,很難維護。
cons: 當網站架構變大時,JavaScript files 最後會很肥,很難維護。
AngularJS:
pros: 依照資源做事,只要分享的資料相同。 HTML 可以簡單的的複製、修改邏輯或維護。
cons: HTML 雜亂,會有大量的邏輯放在 HTML 上。
pros: 依照資源做事,只要分享的資料相同。 HTML 可以簡單的的複製、修改邏輯或維護。
cons: HTML 雜亂,會有大量的邏輯放在 HTML 上。
總之 AngularJS 是從架構這個思維出發。
所以 一開始起步做網頁的時候建立上會比較慢。(因須設計架構)。
可是當未來需要修改 spec 跟維護網站時,會覺得當初的思考架構是值得的。
所以 一開始起步做網頁的時候建立上會比較慢。(因須設計架構)。
可是當未來需要修改 spec 跟維護網站時,會覺得當初的思考架構是值得的。
jQuery 則相反, 非常方便操作 DOM 達到立即需要的效果,可是當要修改 spec 或未來維護的時候就會默默的嘆氣。
綜合以上, 我的建議是
做小型網站時,可以使用 jQuery。(資訊簡單,不會有大量的使用者互動)
製作中大型網站可以使用 AngularJS。(或其他 framework)
做小型網站時,可以使用 jQuery。(資訊簡單,不會有大量的使用者互動)
製作中大型網站可以使用 AngularJS。(或其他 framework)
2. 從 jQuery 到 AngularJS
StackOverFlow 有一篇關於 "如何從 jQuery 思維轉變到 AngularJS 思維” 的文章。
寫的不錯,本來想要幫整理一下精簡本。可是再寫文章的過程中發現已經有中文版了!
寫的不錯,本來想要幫整理一下精簡本。可是再寫文章的過程中發現已經有中文版了!
AngularJS 官網說, 當你先 include jQuery library 後, angular.element 裡的 methods 會自動增加 jQuery element 的 method)。
假如沒有載入,就維持原本的 AngularJS jqLite 提供的 methods. (angular.element 列表)
假如沒有載入,就維持原本的 AngularJS jqLite 提供的 methods. (angular.element 列表)
一年前的我:
為了方便性,還是 include jQuery libary 好了。
這樣甚麼都可以用,反正現在 minify 後的檔案又不大。 (oh yeah)
為了方便性,還是 include jQuery libary 好了。
這樣甚麼都可以用,反正現在 minify 後的檔案又不大。 (oh yeah)
一年後的我:
其實...好像真的用不到 jQuery 的 methods。
需求 AngularJS jqLite 其實都可以做到,只是需要換個角度好好想想。
網路上已經有很多用 AngularJS jqLite 完成的 jQuery methods 應用。
打個比方, 如何用 AngularJS 實做 jQuery.sibilings()
其實...好像真的用不到 jQuery 的 methods。
需求 AngularJS jqLite 其實都可以做到,只是需要換個角度好好想想。
網路上已經有很多用 AngularJS jqLite 完成的 jQuery methods 應用。
打個比方, 如何用 AngularJS 實做 jQuery.sibilings()
所以當發現 "天阿!! 我需要某個 jQuery methods” 時,先冷靜想想或查查資料。
大部分其實都可以使用 AngularJS jqLite 完成需求的。
大部分其實都可以使用 AngularJS jqLite 完成需求的。
這裡就不多說了,大家點選下面看看吧~~3. 須不須要在額外 include jQuery library?
2017年4月3日星期一
2017年1月12日星期四
區塊鏈運作原理大剖析:5大關鍵技術
比特幣區塊鏈的關鍵核心技術,包括用Hashcash演算法來進行工作量證明,且交易過程採用橢圓曲線數位簽章演算法來確保交易安全,並在每筆交易與每個區塊中使用多次Hash函數以及Merkle Tree,同時也使用時間戳來確保區塊序列

比特幣區塊鏈的關鍵核心技術,包括採用Hashcash演算法來進行工作量證明,讓區塊鏈中的各節點有機會參與驗證,達到公正性,且交易過程採用橢圓曲線數位簽章演算法來確保交易安全,並在每筆交易與每個區塊中使用多次Hash函數以及Merkle Tree,不只是為了節省儲存空間,更重要的是藉由將前一個區塊的Hash值加入新區塊中,讓每個區塊環環相扣,也因此做到所謂的可追蹤且不可竄改的特性,同時也使用時間戳來確保區塊序列,以下便依序解釋這些關鍵技術。

比特幣區塊鏈的關鍵核心技術,包括採用Hashcash演算法來進行工作量證明,讓區塊鏈中的各節點有機會參與驗證,達到公正性,且交易過程採用橢圓曲線數位簽章演算法來確保交易安全,並在每筆交易與每個區塊中使用多次Hash函數以及Merkle Tree,不只是為了節省儲存空間,更重要的是藉由將前一個區塊的Hash值加入新區塊中,讓每個區塊環環相扣,也因此做到所謂的可追蹤且不可竄改的特性,同時也使用時間戳來確保區塊序列,以下便依序解釋這些關鍵技術。
關鍵技術 1
採用工作量證明達到去中心化及公正性
採用工作量證明達到去中心化及公正性
首先,最關鍵的便其工作量證明機制(Proof of Work,POW),這是一個可以讓每個參與的節點可共同參與交易驗證的方式,來實現一個能多方共同維護的單一系統,並共享同一份記錄交易的帳本,以形成一個基於零信任基礎,卻能實現去中心化的P2P網路系統。
工作量證明是讓任一運算節點,花費時間和運算資源來計算出一組數學公式的結果,且要完成一次有效的工作量證明,需經過一連串地嘗試與失敗。不過,一旦這個數值被算出來後,其他參與節點也可用相關的數學公式,便能很容易去驗證這個值是否有效。
比特幣區塊鏈採用Hashcash演算法(雜湊現金演算法)作為工作量證明,讓各節點經由POW計算來產生每一個有效的新區塊,再經由其他節點驗證並接受。
進行POW計算的過程也被稱作挖礦,很多人用解一道數學題、或是解一個數獨來形容,不過,怎樣才是真的算出一個有效的新區塊,這些節點到底在算什麼?
由於每個區塊中Block Header會包含許多固定的值,其中只有Nonce值為一隨機值,因此每個節點進行POW計算時要算的就是,藉由不斷替換這個Nonce值,來讓這個區塊的Block Header Hash值,小於一個被設定好的難度目標值(Difficulty Target),至於為什麼要小於這個目標值,則是因為這個難度值意味著每個區塊在理論上應該要被產生完成。
這裡提到的難度值(Difficulty)是指,節點要運算出低於困難度目標值的Hash值,平均需花多久時間,也就是平均要完成一次POW的時間。而比特幣區塊鏈目前設定為,大約每10分鐘會有節點成功算出新的區塊,不過這10分鐘只是基於理論值,實際每個新區塊產生的時間,有可能只需要17秒(第407062個區塊的實際產生時間),也有可能需要20分鐘以上(第407068個區塊的實際產生時間)。
Difficulty可動態調整,目前每產生2016個區塊會調整一次難度,以每10分鐘產生一區塊估算,大約是每兩周會調整一次Difficulty。 由於POW具有一定的難度,因此無法預期哪個運算節點可以最快算出新區塊,藉此來確保交易驗證的公正性。
關鍵技術 2
每筆交易採橢圓曲線數位簽章演算法加密
每筆交易採橢圓曲線數位簽章演算法加密
比特幣區塊鏈便採用橢圓曲線數位簽章演算法(ECDSA),與另一種RSA演算法,都屬於公開金鑰加密演算法(Public Key Cryptography),公開金鑰加密技術在1970年代被發明,也稱為雙金鑰密碼安全系統,每個使用者會擁有公開金鑰(Public Key)與私密金鑰(Private Key)這兩把鑰匙,公開金鑰可讓其他人知道,而私密金鑰則只有本人知道。當A要傳送一筆訊息或交易給B時,需使用B的公開金鑰來將這份交易加密,而這這個加密過的訊息或交易,只有使用B的私密金鑰才能解開。
在比特幣區塊鏈中,比特幣區塊鏈便採用橢圓曲線數位簽章演算法,每一個比特幣區塊鏈中的節點使用者,會同時擁有這兩把金鑰,以及一次性使用的比特幣位址(Address),公開金鑰可讓區塊鏈網絡中的其他人知道,而私密金鑰則須自行保管,可用來接收貨幣、進行電子簽章或是發送貨幣,而Address就像電子郵件一樣可用來當作存取比特幣的地址,使用者可重複取得新的Address,且可以在離線狀態下產生,不過,每個Address只能使用一次。
在比特幣區塊鏈中,每一枚電子貨幣被視為一串數位簽章,使用者要進行比特幣交易時,必須將前一筆交易以及收款方的公開金鑰經由Hash產生數位簽章,加到電子貨幣那串數位簽章的後方。
RSA加密演算法是一種非對稱的加密演算法,利用兩個質數作為加密與解密用的兩把鑰匙,金鑰長度約在40個位元到1024位元。不過比特幣所採用的ECDSA能算出更短的金鑰長度,也就是能夠使用相對較少的資源,做到與RSA相同的安全性。在ECDSA演算法中,由私密金鑰算出公開金鑰很容易,但要從公開金鑰推回私密金鑰卻很困難。
關鍵技術 3
Hashcash演算法及多種Hash函數確保資料不被竄改
Hashcash演算法及多種Hash函數確保資料不被竄改
前面提到比特幣區塊鏈採用Hashcash演算法來進行工作量證明,Hashcash可將任意長度的資料經由Hash函數轉換為一組固定長度的代碼,原理是基於一種密碼學上的單向雜湊函數 (One Way Hash Function),這種函數很容易被驗證,但是卻很難破解,還回推出原本的值。先前Hashcash演算法也被用來做阻擋垃圾郵件的機制。
常使用的單向雜湊函數包括MD5、SHA-1、SHA-256、SHA-384及SHA-512等,MD5的Hash值長度為128位元,雖然廣為使用,但因長度不夠較容易破解,SHA-1的Hash值長度有160位元,雖比MD5好但仍然不夠安全,因此美國國家安全局(NSA)又提出多種更複雜的SHA-2演算法,包括224、256、384、512位元長度的Hash值算法。
Hashcash最早在1997年由Adam Back提出,並於2002 正式發表一篇描述雜湊現金系統的論文。比特幣區塊鏈採用Hashcash來建立一套幾乎無法被竄改的電子現金系統,每個區塊的Block Header都會被Hash成一串很難被回推的代碼後,放進下一個區塊中,來確保區塊的正確性。
關鍵技術 4
經由Merkle Tree將大量訊息縮短成一個Hash值
經由Merkle Tree將大量訊息縮短成一個Hash值
在比特幣區塊鏈中,每筆交易產生後,都已經被Hash成一段代碼才廣播給各節點,不過這樣做還不夠,因為在各節點的區塊中,可能包含數百筆到數千筆的交易,因此,為節省儲存空間並減少資源耗費,比特幣區塊鏈的設計原理採用Merkle Tree機制,讓這些數百到數千筆的交易Hash值,經由兩兩一組形成一個新Hash值的方式,不斷重複進行,直到最後產生一組最終的Hash值,也就是Merkle Tree Root,這個最終的Hash值便會被記錄到Block Header中,只有32 Bytes的大小。Merkle Tree機制可大幅減少資料傳輸量與運算資源消耗,驗證時,只需驗證這個Merkle Tree的Root值即可。
關鍵技術 5
用時間戳伺服器(Timestamp Server)確保區塊序列
用時間戳伺服器(Timestamp Server)確保區塊序列
比特幣採用時間戳伺服器機制(Timestamp Server),將每個區塊Hash後加上一個時間戳(Timestamp)並發布出去,這個時間戳用來證明資料在特定時間的有效性,每一個時間戳章會與前一個戳章一起進行Hash,這個Hash值會在與下一個時間戳章進行Hash,因此而形成一個用來確保區塊序列的鏈條。
訂閱:
留言 (Atom)