Software entities (class, modules, functions, etc.) should be open for extension, but closed for modification. Junior programmers create simple solutions to simple problems. Senior programmers create complex solutions to complex problems. Great programmers find simple solutions to complex problems. 註1:本部落格的範例程式碼在 2015 年以前的文章中,大多是以全型空白做縮排。如需服用,請自行用文字編輯器的取代功能把全型空白取代成半型空白。
- Bertrand Meyer
- Charles Connell
註2:本部落格的內容授權請參閱部落格底部的授權宣告。
2018年11月23日 星期五
2018年11月16日 星期五
Angular Universal 伺服器渲染
目前覺得 [3] 解釋地比較詳細,官方文件 [1] 寫得有點籠統。
如果嘗試從 Java 的角度來理解整個 Angular Universal 相關的東西的話,好像是這麼理解的:
- Angular、Angular Universal 可以看成是 Kotlin 語言;Node.js 可以看成是 Java 語言。
- Angular、Angular Universal 寫出來的檔案好像都是 .ts 檔,也就是 TypeScript。這些檔案必須經過編譯,把他們翻譯成 JavaScript;若以 Java 的領域來理解,就像是 Kotlin 也是個 JVM 語言,但真正要在 JVM 上執行前,需要先透過編譯或者直譯器把 Kotlin 的語法翻譯成 Java 的語法。
- 在查 Angular Universal 時常常會看到 Express 這玩意兒,Express(ExpressJS)對照 Java 的話比較像是 Spring MVC 或者 Jersey 這類 Web 框架。它的程式碼應該是用來告訴 Node.js 要如何解析、處理和回應 HTTP request。
所以整個 Angular Universal 的伺服器渲染,大體上要做的程序會是這樣:
- 以 Node.js 啟動的 Web 伺服器程序負責接收 HTTP Request。
- HTTP Request 會由 Node.js 上執行的 ExpressJS 程式碼來處理。
- ExpressJS 的程式碼去呼叫 Angular Universal 的模組(即 renderModuleFactory()),進行 pre-rendering。
- Angular Universal 回覆渲染後的結果給 ExpressJS,ExpressJS 再回覆給客戶端。
參考資料
2018年11月12日 星期一
2018年11月8日 星期四
org.hibernate.QueryException: could not resolve property: “xxx”
寫 Spring Data JPA 或者 Hibernate 時很重要的一點,就是在定義 Repository 時,對應的欄位要用 Entity 裡的變數名字,而不是實際資料庫裡的資料欄位名字。這也包括了當要使用 Pageable 等物件時,物件裡宣告的欄位也要用 Entity 的變數名字。
參考資料
2018年11月2日 星期五
Billions of Messages a Day - Yelp's Real-time Data Pipeline
- Yelp 即時 Data Pipeline 如何處理每天數十億的訊息量
- 如何將 MySQL Table 內容即時串流到 Kafka
- 串流時如何處理不同資料庫 Scheme
- 利用 PaaSTA 與 Storm 來解決即時串流問題
- 如何使用 Saleforce Connector 整合 Saleforce
- 如何將 Kafka 的資料即時串流到 Redshift
- 將 Yelp 的 Data Pipeline 開源
- 如何提升 Yelp MySQLStreamer 效能 3X 倍
- 如何確保從頭到尾的串流資料無誤 (MySQL -> Redshift)
- 將 Yelp Data Pipeline 結合 ElasticSearch 以利搜尋
2018年10月31日 星期三
(暫存) PostgreSQL 的 immutable tuple
因為看到 Uber 說從 PostgreSQL 轉移到 MySQL 的原因之一是 PostgreSQL 的 immutable tuple 造成了問題,所以先紀錄一下看到的相關資料….。
參考資料
2018年10月28日 星期日
2018年10月23日 星期二
在 Spring Data JPA 中使用 AUTO_INCREMENT
快速紀錄~使用 @Id 和 @GeneratedValue 就可以用自動遞增的 Primary Key 了。不過如果不想要讓 Hibernate 自己產生 ID,而是直接靠資料庫自行產生的話,可以設定 @GeneratedValue 的屬性 strategy = GenerationType.IDENTITY。
參考資料
2018年10月17日 星期三
(暫存) 追蹤智能合約
之前看到人家說 web3.py 有 bug,好像追蹤不到,不過現在看 issue 似乎是在新版解決了的樣子,之後要找個時間來實驗一下。
不過如果連接的是 infura 的話,因為 infura 不支援 filter event,所以好像無法靠 Contract Events 追蹤。
參考資料
編譯 Solidity 智能合約
快速紀錄,因為需要讓 web3.py 使用合約,官方的範例是寫說可以用程式碼直接編譯,不過好像需要環境本身的支援,感覺很麻煩 XD。所以直接在 Windows 裝了 Solidity 的編譯程式 solc,然後執行以下的指令(假設要編譯的智能合約的檔名叫做 contract.sol):
solc --combined-json abi,bin contract.sol > contract.json
以上的指令會建立 abi,並把智能合約的原始碼編譯成 hex 表示的字串,然後寫成一個 JSON 檔。JSON 檔的格式大略會長成這樣:
{
"contracts": {
"./XXX.sol:XXX": {
"abi": "....",
"bin": "...."
},
"./OOO.sol:OOO": {
"abi": "....",
"bin": "...."
}
},
"version": "0.4.25+commit.59dbf8f1.Windows.msvc"
}在這個範例中,是假設要編譯的智能合約包含了超過一個合約,也就是智能合約會引用其他智能合約的狀況。因此編譯出來會有很多個合約一起包在這個 JSON 裡,而每個合約都會有 abi 和 bin 兩個 key,反映我們的指令要求的輸出 abi 和 bin。