快速閱讀頁遊 Unlight 開源後的原始碼

最近一款有點年紀的頁遊 Unlight 在停止營運後幾年,突然公佈說要開放原始碼跟圖片素材。

這款遊戲嚴格說起來並沒有像我們熟悉的端遊、手遊之類的那樣華麗,但是非常有特色的人物設計跟對戰系統倒是讓很多玩家即使在好幾年後仍然在期待他能復活。

作為一個曾經的玩家,其實也是非常期待的,不過這次的開放原始碼路線大概是復活無望。不過從這幾天公開的資料來看,圖片、音效到客戶端和伺服端都公開的狀況下,還是很有希望被熱血的玩家復活的。

另一方面,既然伺服器是透過 Ruby 撰寫的,身為使用 Ruby 的開發者在遊戲類應用不常見的狀況下,能可以作為學習素材肯定是要看過一遍的。

你大概沒機會遇到的 Bug - 跟 Ruby Committer 聊 Enumerator 跟 Fiber

今年 RubyConf Taiwan 嘗試辦了 After Hack 這個活動,也因此有機會可以跟 Ruby 語言的 Commiter 聊一些有趣的問題。

當天我的預定是把活動這幾天寫的 Gem 認真的補完測試,不過沒想到還剩下一個多小時就做完了,那就順便來思考一下 Tamashii 專案能怎樣去改進,在今年的演講中大家應該都對 Fiber 有一個認識,而這個也許是一個不錯的選項。

所以就馬上去看了一下講者(Samuel)的 Async 這個 Gem 做了些什麼事情,因為剛講完關於 Enumerator 的演講,所以自然地看到了一段引起我興趣的說明。

Due to limitations within Ruby and the nature of this library, it is not possible to use to_enum on methods which invoke asynchronous behavior. We hope to fix this issue in the future.

既然作者本人就在現場,而且 Issue 的內容也看不太出來發生什麼問題,那麼就直接問吧!

RubyConf Taiwan 2019 會後感想、議程概覽

跟前幾年一樣基本上就是工作人員,這幾年參加研討會也都比較沒有在仔細聽了,所以大多是邊顧邊寫點程式。

比較不一樣的大概是今年更累了,從週四下午場佈到 Pre Party 然後兩天的活動、Official Party 最後到今年嘗試的 After Hack 幾乎是四天左右的連續接力,每天早上醒來都要先懷疑自己是否能撐過這一天。

巴哈姆特 Chatbot 之亂:用 Ruby on Rails 接收 Webhook

六月底的時候發現巴哈姆特似乎想為他們推出的 Messaging APP (哈哈姆特)舉辦一個聊天機器人的比賽,看到之後想說還算蠻有趣的,所以我就跟朋友很隨意的組成一個團隊來開發。

跟大多數我們熟悉串接 Chatbot 的機制是類似的,我們可以用 Webhook 的方式接收一個來自使用者發送的訊息,然後再透過程式處理後回傳訊息給使用者。

用 CloudFlare Workers 製作簡單的 Uptime Status 頁面

最近跟朋友弄了一個透過 Chatbot 做出手遊效果的專案,沒出什麼意外的話大概能在九月看到一個雛形。不過既然是手遊類型的遊戲,更新資料跟維護其實就會遇到一些困難點。

如果是線上遊戲或者手遊,大多數只要在公告後把玩家切斷連線然後升級過程中避免玩家連上就好。不過因為是 Chatbot 所以除非能做到不停機升級,不然是很困難的。
如此一來,讓玩家知道遊戲(機器人)正在更新,處於無法使用的狀態,就是一個重要的關鍵。

Ruby 中 Constant 和 Class 的關係

下班前龍哥說在 Mailing List 看到了一段 Code 很有趣。

1
2
3
4
5
6
7
8
9
10
a = Class.new

p a #=> #<Class:0x0000558d34f68b48>
p a.name #=> nil

B = a
p a.name #=> 'B'

C = a
p C.name #=> 'B'

裡面 C = a 到底發生了什麼事情,是很值得討論的,因為有了線索是 rb_const_set 可以找到原因,所以就利用下班時間來讀看看這段。

關於前面的用法可以參考之前寫過的自由的 Ruby 類別來了解原因。

關於 Rails 中的 Form Object / Presenter 這些物件該怎麼用(一)

前陣子在 Review 新專案中同事的程式碼時,發現同事對像是 Service Object / Form Object 這類物件不太有概念。不過這個新專案因為是接手其他公司的專案,所以有不少地方要微調。至少那個值得吐槽的「因為 Controller 程式碼太長不知道放哪裡,就都丟去 Service Object 好了!」的神奇用法,完全沒有幫助改善程式碼。

也因為這個機會,我用了一點時間跟專案的同事分享了一下我對這些物件的看法。畢竟當出我也是搞不太懂,不過隨著了解物件導向和 Ruby 的語言特性,從這些角度切入後,就比較能理解該怎麼使用。

利用 Ruby 的 Lambda 做條件判斷

週末在思考一些 Ruby 特性可以應用的小技巧時,想到龍哥大概跟我講了三次以上的一個特性。

1
2
3
4
5
fn = ->(other) { other == 1 }
fn == 1
# => false
fn === 1
# => true

剛好最近工作的專案上有個問題,似乎挺適合用這個技巧。

如何在沒有任何設定下產生 Rails 的 Docker Image

前陣子看到 Throughbot 這間在 Ruby 圈 算是蠻有名的公司做了一個叫做 Suspenders 的 Gem 主要是對 Rails 擴充,簡單說就是基於原本的 rails new 做了一個替代品,而這個替代品會自動幫你先做好一些原本要手動做的事情。

像是安裝好常用的 Gem、套版之類的,想了一下覺得五倍其實也很需要,不少新專案也都是從我這邊經手初始化的,有一個這樣的工具會省下不少時間。

所以 Bankai (卍解) 這個 Gem 就樣做出來了,裡面基本上就是設置好在五倍大多數時候用的標配 Ex. GitLab CI 設定、RSpec 等等

但是又發現好像不太夠用,有些時候有 Docker 會方便很多,但是 Bankai 現在做不到!

我在 Ruby 埋了一個陷阱 - Signal 的應用

在 Ruby 之中,其實隱藏了很多非常實用的標準函式庫,而 Signal 就是其中一個。

我們在寫 Ruby 大多數時候都是 Ruby on Rails 框架的應用,但是你們有想過當我們在一些 Gem 運行的時候,使用 Ctrl + C 為什麼不會出現錯誤嗎?

例如我們常常用到的 irbpry 為什麼按下 Ctrl + C 的時候不是直接中斷,卻還能繼續運作?