[Scala] 一次打十二個--透過 Future 和 For-Comprehensive 解決 Callback 地獄

話說這幾年用 Non-Blocking 的典範來寫程式很夯(例如 NodeJS 上幾乎都是 Non-Blocking),不過用 Non-Blocking 寫程式的時候,有時候程式碼會因為 Callback 的關係變得很雜亂,需要花一些時間來整理和維護,俗稱 Callback 地獄,後來大家也發展了不少的技巧來避免和減清這個問題。

不過這個問題在 Scala 上其實不太嚴重,主要因為 Scala 從函式編程引入的 Monad 的觀念和他的 for 迴圈的語法實在是太強大了……透過 Scala 標準函式庫內建 Future 類別和 for 迴圈,我們可以很輕鬆地把本來是 Blocking 的操作變成 Non-Blocking 操作,並且解決掉這類的 Callback 地獄問題。

口說為憑,我們直接來看一個例子好了。

話說台北市的開放資料網站上提供了行人垃圾筒的物件,但是卻是十二個行政區都是獨立的網址。如果今天我們想要取得台北市內所有的行人垃圾筒的資料並整合成一個單獨的 ...

[碎唸] 如果讓我再來一次,我會選 PostgreSQL。

這幾年都一直混在噗浪上,超級久沒寫部落格了,好不容易有個比較長的想法,就來灌個水一下。

話說去年夏秋交際的時候換了新工作,到了現在這間小公司來寫程式,詳細的就不提了。總而言之,現在這個工作要處理的資料量比在中研院的時候還多,大概每天會有一百萬筆的新資料,每一筆都必須處理最後成為線上分析用的報表。

因為是整個打掉重練的系統,所以一開始主管打算用這幾年很夯的 NodeJS 和 MongoDB 來做。

不過後來因為遇到一些 NodeJS 效能上的問題,發現同樣邏輯的程式碼(單純地從 RabbitMQ 撈資料經過運算後存到 MongoDB 裡),在 Scala 上就算以單執行緒的方式執行,兩者的效能也差了快十倍,在 Scala 可以處理到每秒六七百筆的時候,NodeJS 只能處理到每秒六七十筆,根本不可能處理每天一百多萬筆的資料。

後來測試的結果,似乎和 NodeJS 的 Callback 效能有關,每加一層 Callback 速度就會明顯下降,但實際原因不明。但很不幸的我們的程式必須使用 Callback 的方式讓他是循序執行的,必須保證執行的順序 ...

[Android] MaidroidPlurk 女僕噗浪 v0.1.2 釋出

簡介

MaidroidPlurk 是一款以可愛為主的 Android 噗浪軟體,由可愛的女僕小鈴幫您服務!支援 Android 3.0 以上裝置。

安裝

您可以到 Play 上店上下載安裝最新版的 MaidroidPlurk 來使用。

螢幕截圖

Screenshot
Screenshot
Screenshot
Screenshot

有的功能

  • 讀自己的河道
  • 看別人的河道
  • 看別人的個人資料(申請好友,加入粉絲)
  • 發噗 / 回噗
  • 消音 / 喜愛 / 轉噗
  • 切換各種不同的噗
  • 使用自訂表情符號
  • 全部標為已讀
  • 下拉更新
  • 選擇上傳圖片時支援相簿內的 Flickr / Picasa / Dropbox 相片
  • 在其他 APP 中直接分享至 MaidroidPlurk

沒有的功能

  • 修改個人檔案
  • 新增自訂表情符號

程式碼

您可以在 GitHub 上找到 MaidroidPlurk ...

[Scala] KeepRetry……爛掉了就一直重開

話說上個月換了工作,這次的工作主要是寫 Node.JS 的。說實話我之前對 Node.JS 是只有聽說過這東西,但因為我本身就偏好靜態型別的程式語言以及向來對 JavaScript 沒啥好感,加上相當喜歡而且用 Scala 也用的很順手了,所以對 Node.JS 並沒有特別研究,甚至在接這個工作之前連 Node.JS 的 HelloWorld 都沒寫過,只隱約知道一些它的特性和設計典範而已。

而只寫了這一個半月的 Node.JS,當然還是領悟不到什麼高深的技巧的,甚至還遇到了效能上的瓶頸而一知查不出原因,只好先和主管商良用不知道為什麼跑起來楞是快了十倍的 Scala 版本先擋著。

不過另一方面,這一個月也發現 Node.JS 下有一些常見的做法是我以前從未想過的,其中一個就是關於網頁程式和 HTTP Server 之間的關係。在以前由於都是寫些 PHP / JSP 之類的東西,所以在我的印象裡,HTTP Server ...

[Semantic UI] 自訂的 Form Validation

因為覺得 SemanticUI 的一些設計理念滿有趣的,所以最近在搞的新玩具中的 CSS Framework 我放棄了 Bootstrap,改成用 SemanticUI 這套來做。

在 SemanticUI 當中內建了表單的驗證功能,可以在使用者送出表單前先以 JavaScript 來驗證一些基本的條件,一方面既可以減輕 Server 端的負擔,另一方面也可以讓使用者有比較好的體驗,畢竟可以不用和 Server 溝通,反應速度上會比較快。

SemanticUI 的表單驗證功能用起來很簡單,程式碼看起來也很直覺,並且也內建了許多的驗證邏輯,在使用的時候只要寫像下面這樣的 JavaScript 宣告就可以了:

var validations = {
  "title": {
    "identifier": "title",
    "rules": [{
      "type": "empty",
      "prompt": "請輸入標題"
    }]
  }
}

$('#form').form(validations)

不過有一個小問題是他內建的驗講邏輯不一定符合我們的需求,例如他的 empty 驗證邏輯,就真的只是檢查 ...