跳到主要內容

發表文章

目前顯示的是 1月, 2017的文章

Java8 Map, Flatmap Sample

Data Source private static List> teams = new ArrayList<>(); private static List aTeam = new ArrayList<>(); private static List bTeam = new ArrayList<>(); static { aTeam.add("Java"); aTeam.add("C++"); aTeam.add("PHP"); aTeam.add("Scala"); bTeam.add("Go"); bTeam.add("R"); teams.add(aTeam); teams.add(bTeam); } MapDemo @Test public void mapDemo() { System.out.println("=== Demo Lambda Map ==="); List> result1 = teams.stream().map(team -> { System.out.println("Team: " + team); return team; }).collect(Collectors.toList()); System.out.println("Result: " + result1); } === Demo Lambda Map === Team: [Java, C++, PHP, Scala] Team: [Go, R] Result: [[Java, C++, PHP, Scala], [Go, R]] FlatMap Demo @Test public void flatMapDemo() { ...

AWS Kinesis Note

Sample Ec2 Instance(Consumer) | +- Worker + |- Processor <-- shard (shard 的 seqId, partictionId 會被記錄到 DynamoDB) |- Processor <-- shard (shard 的 seqId, partictionId 會被記錄到 DynamoDB) |- Processor <-- shard (shard 的 seqId, partictionId 會被記錄到 DynamoDB) |- Processor <-- shard (shard 的 seqId, partictionId 會被記錄到 DynamoDB) Ec2 Instance(Consumer) | +- Worker + |- Processor <-- shard (shard 的 seqId, partictionId 會被記錄到 DynamoDB) |- Processor <-- shard (shard 的 seqId, partictionId 會被記錄到 DynamoDB) |- Processor <-- shard (shard 的 seqId, partictionId 會被記錄到 DynamoDB) |- Processor <-- shard (shard 的 seqId, partictionId 會被記錄到 DynamoDB) Concept 每一台 Ec2 可視為一個 Consumer,每個 Consumer 會有個 Worker 機制把 shard Stream 分配給 Processor,當 shard 的數量調大的時候,KCL(Kinesis Clinet Libary) 裡面的 IRecordProcessorFactory 就會自動建立對應, shard 的 processor。 當有新的 Consumer 被建立時,AWS 會自動做 loadbalance,去平衡每個 worker 要負責的 shards,這時候 Processor 裡面的 shutdown 會被執行。 切記 Consumer 不應該開的比 shard 的數量還大。

Functional Reactive Programming

1. FP, Functional Programming 不是有 function 的程式語言就叫做 functional programming language 唷? https://ihower.tw/blog/archives/6305 讀完, 還是很難體會 FP。 * FP 精髓 http://www.codedata.com.tw/social-coding/paradigm-shift-to-functional-programming map - 尋訪每個元素,加以處理,並且回傳處理後的元素。 filter - 回傳 布林值,以決定是否處理該元素。 reduce - 尋訪每個元素,依序組合元素,轉換成結果,丟給下個元素運算組合,然後產生最終組合的結果。 * Lazy Call by Need 2. FRP, Functional Reactive Programming http://www.ithome.com.tw/voice/91328 Reactive 的重點在於辨識出資料流,例如可以在欄位C1輸入=B1+5,然後在欄位D1輸入=C1+10, 此時,B1可以視為C1的資料來源,C1又可視為D1的資料來源, 每個欄位可以與其他欄位自由組合,形成資料流延續下去。 Reactive 是其目的,也就是強調必須即時地反應變化,非同步是達到此目的之手段, 為了能讓客戶端訂閱感興趣的資料流,採用了觀察者模式, 為了能讓開發者不落入如何處理(事件)資料的繁雜程式邏輯中, 採用了函數式的典範,隱藏了(事件)資料的迭代、轉換等細節, 從而能讓開發者根據規格進行宣告,以突顯出程式本身的意圖。

RESTClient with Retrofit2 - OKHttp3

Taylor Durrer Line-bot-sdk-java 前一陣子都在研究 line-bot-sdk-java , 看到 Retrofit2 搭配 OKHttp3 , 媽媽就問我為什麼跪著寫程式。 Simsimi Simsimi 聽說背後是百度的 NLP 技術的東西, 啊災... 因為我接完後, 他都回我幹話跟髒話, 我就決定叫他 髒小雞 , 他會根據一些關鍵字或什麼 NLP 之類的 (太難了) 來回我話, 支援多國語言, 對剛接觸 bot 來說, 算是滿方便, 又不用傷腦力去處理 NLP 的好服務, 當然你送的資料有可能都送給百度啦, maybe Spring boot Framework Spring boot framework 算是對新手滿友善的框架?那文件的厚實度, 印出來當枕頭都沒問題。 俗話說, 在哪裡跌倒, 就在哪裡躺下 , 就在哪裡爬起來, Bean 很好用, 但有時候找不到文件就很雞掰。 從 Line-bot-sdk-java 的架構下了解一下 java 的注入, 營養真是滿分啊。 Purpose 包裝完後可以像這樣簡單俐落的使用。 Response simSimiResponse = simSimiService.chat("Hi~").execute(); RESTClient Service Retrofit2 的起手式就是先墊一個 interface ,透過 annonation 就可以很清楚的明暸 Resource, 滿符合 RESTful 的精神的啊, 在閱讀跟維護上也是好棒棒。 詳細的Retrofit2 Doc 請參閱這邊 https://square.github.io/retrofit/ public interface SimSimiService { /** * @param msg * @return ResponseBody {@link ResponseBody} * @see http://developer.simsimi.com/api */ @GET("request.p") Call chat(@Query("text") String msg); ...