2020年9月13日星期日

好用的Bootstrap Theme Collections

 Bootstrap是目前最常用的Framework 之一, 介面雖不錯但用久了都想換換口味. 

Bootswatch (https://bootswatch.com) 提供了不少好看的Theme, 安裝也容易, 只要直接換掉原本的Bootstrap css就行了

2017年5月25日星期四

Docker上手指南

 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月10日星期三

jQuery 跟 AngularJS 的糾葛

AngularJS 有些人覺得難學理由之一,是因為它跟大多數網站所使用的 jQuery 設計思維差很多。
而且 AngularJS 又有內建 jqLite (jQuery 的精簡版),
造成一開始用 AngularJS 設計網站的時候會被 jQuery 的想法牽著走,然後又覺得被 AngularJS 的框架束縛住。
就會覺得 AngularJS 很複雜。

我對 jQuery 跟 AngularJS 整理出的一些想法
1. jQuery vs AngularJS
jQuery 是操作畫面 DOM 的工具函式庫;AngularJS 是軟體框架。
jQuery 的思維來說,開發一個網站的步驟是
  1. 拿到設計稿
  2. 切割畫面成一個一個 components
  3. jQuery time! 找尋 DOM element, 使用 jQuery 繫結 element 的事件。 (操作 DOM)
  4. 把全部的 components 的動作寫完 -> 完成網站!!
AngularJS 思維是
  1. 拿到設計稿
  2. Angular time! 開始構想架構。(從 application 的思維開始想, 思考此 app 需要什麼事件、 DOM 或 functions)
  3. 撰寫 JavaScript ,把需要的資源 (model or functions) 準備好。
  4. 撰寫 HTML template,把對應的資源綁在 DOM 上面. (ng-model, ng-click, etc)
讓畫面上的邏輯都找到對應的資料 -> 完成網站!!jQuery:
pros: HTML 精簡,不會把邏輯放在 HTML 上
cons: 當網站架構變大時,JavaScript files 最後會很肥,很難維護。
AngularJS:
pros: 依照資源做事,只要分享的資料相同。 HTML 可以簡單的的複製、修改邏輯或維護。
cons: HTML 雜亂,會有大量的邏輯放在 HTML 上。
總之 AngularJS 是從架構這個思維出發。
所以 一開始起步做網頁的時候建立上會比較慢。(因須設計架構)。
可是當未來需要修改 spec 跟維護網站時,會覺得當初的思考架構是值得的。
jQuery 則相反, 非常方便操作 DOM 達到立即需要的效果,可是當要修改 spec 或未來維護的時候就會默默的嘆氣。
綜合以上, 我的建議是
做小型網站時,可以使用 jQuery。(資訊簡單,不會有大量的使用者互動)
製作中大型網站可以使用 AngularJS。(或其他 framework)
2. 從 jQuery 到 AngularJS
StackOverFlow 有一篇關於 "如何從 jQuery 思維轉變到 AngularJS 思維” 的文章。
寫的不錯,本來想要幫整理一下精簡本。可是再寫文章的過程中發現已經有中文版了!
AngularJS 官網說, 當你先 include jQuery library 後, angular.element 裡的 methods 會自動增加 jQuery element 的 method)。
假如沒有載入,就維持原本的 AngularJS jqLite 提供的 methods. (angular.element 列表)
一年前的我:
為了方便性,還是 include jQuery libary 好了。
這樣甚麼都可以用,反正現在 minify 後的檔案又不大。 (oh yeah)
一年後的我:
其實...好像真的用不到 jQuery 的 methods。
需求 AngularJS jqLite 其實都可以做到,只是需要換個角度好好想想。
網路上已經有很多用 AngularJS jqLite 完成的 jQuery methods 應用。
打個比方, 如何用 AngularJS 實做 jQuery.sibilings()
所以當發現 "天阿!! 我需要某個 jQuery methods” 時,先冷靜想想或查查資料。
大部分其實都可以使用 AngularJS jqLite 完成需求的。

這裡就不多說了,大家點選下面看看吧~~3. 須不須要在額外 include jQuery library?

2017年1月12日星期四

區塊鏈運作原理大剖析:5大關鍵技術

比特幣區塊鏈的關鍵核心技術,包括用Hashcash演算法來進行工作量證明,且交易過程採用橢圓曲線數位簽章演算法來確保交易安全,並在每筆交易與每個區塊中使用多次Hash函數以及Merkle Tree,同時也使用時間戳來確保區塊序列

比特幣區塊鏈的關鍵核心技術,包括採用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演算法來進行工作量證明,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值
在比特幣區塊鏈中,每筆交易產生後,都已經被Hash成一段代碼才廣播給各節點,不過這樣做還不夠,因為在各節點的區塊中,可能包含數百筆到數千筆的交易,因此,為節省儲存空間並減少資源耗費,比特幣區塊鏈的設計原理採用Merkle Tree機制,讓這些數百到數千筆的交易Hash值,經由兩兩一組形成一個新Hash值的方式,不斷重複進行,直到最後產生一組最終的Hash值,也就是Merkle Tree Root,這個最終的Hash值便會被記錄到Block Header中,只有32 Bytes的大小。Merkle Tree機制可大幅減少資料傳輸量與運算資源消耗,驗證時,只需驗證這個Merkle Tree的Root值即可。
關鍵技術 5
用時間戳伺服器(Timestamp Server)確保區塊序列

比特幣採用時間戳伺服器機制(Timestamp Server),將每個區塊Hash後加上一個時間戳(Timestamp)並發布出去,這個時間戳用來證明資料在特定時間的有效性,每一個時間戳章會與前一個戳章一起進行Hash,這個Hash值會在與下一個時間戳章進行Hash,因此而形成一個用來確保區塊序列的鏈條。

2012年5月17日星期四

display: none與visibility: hidden的分別

display: none - 隱藏後不佔空間
visibility: hidden  隱藏後依然佔空間