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 以利搜尋