Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

Kanazawa.rb meetup #70 に参加しました #kzrb

kzrb.doorkeeper.jp

Meetup #70 - Kanazawarb

気付けば第70回とキリのいい回数を重ねてきてますね。今回はITビジネスプラザ武蔵のサロンスペースCRITで開催されました。

プログラミングElixir 16章

前回は14章を読んでいたんですが、家で15章を読んだのでこの日は16章の「OTP: サーバ」を進めました。

  • GenServer ビヘイビアを使ってサーバを作る
  • 必要な関数が定義されているので、必要であれば関数をoverride(?)すれば良い
    • handle_call とか handle_cast とか
  • iex からこのサーバーに値を渡して、サーバーの状態を更新することができた
    • GenServer にはstateという概念があるっぽい
  • receive などを自分で記述しなくて良いので楽

プログラミングElixir

プログラミングElixir

Ruby 2.6.0-preview2 について

先日RubyKaigiがあって参加はできなかったもののTwitterのタイムラインを見ていたところ2.6.0のpreview2がリリースされたと話題になっていたので、ほんの少し見てみてendless rangeについて気になってまとめたものを発表しました。以下発表で使った資料です(markdownで作ってVSCodeのプレビューで見せる簡易なものにした)


https://www.ruby-lang.org/ja/news/2018/05/31/ruby-2-6-0-preview2-released/

2.6.0ではJITコンパイラの導入を含むいくつかの新機能がある。その中で endless range が気になったので触ってみた。

(1..10) # finite range
(1..) # endless range

実行環境

2.6.0-preview2 をインストールする。

$ brew upgrade ruby-build
$ rbenv install 2.6.0-preview2
$ cd hoge
$ rbenv local 2.6.0-preview2

use case 1

arr = ["a", "b", "c", "d"]
# => ["a", "b", "c", "d"]
arr[1..]
# => ["b", "c", "d"]
# 配列の特定のインデックスから最後の要素までを取得する新しいやり方
# VS
arr[1..-1]

use case 2

(1..).each {|index| ...} # infinite loop from index 1

# VS
n = 1; loop { ...; n += 1}
1.upto(Float::INFINITY) {|n| ... }
1.step {|n| ...}

use case 3

["a", "b", "c", "d"].zip(1..)
# => [["a", 1], ["b", 2], ["c", 3], ["d", 4]]
["a", "b", "c", "d"].zip(0..)
# => [["a", 0], ["b", 1], ["c", 2], ["d", 3]]

and more

(1..).class
# => Range

(1..).size
# => nil
# 期待される値については https://bugs.ruby-lang.org/issues/14699 で議論されている模様

(1..).take(10)
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

(1..).step(2).take(10)
# => [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

(1..).map {|n| n * n }.take(10) # compute infinitely...

# Enumerator::Lazy と組み合わせると遅延評価できる
(1..).lazy.map {|n| n * n }.take(10).force # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
(1..).lazy.select {|n| n % 3 == 0 }.take(10).force
# => [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
(1..).lazy.select {|n| n % 3 == 0 }.select {|n| n > 100 }.take(10).force
# => [102, 105, 108, 111, 114, 117, 120, 123, 126, 129]

最後の方は遅延評価の話になってしまったけど、Enumerator::Lazyモジュールの存在を知らなかったので勉強になりました。(発表ではEnumerableと紹介してしまったのでここで訂正します)

docs.ruby-lang.org

その他

  • 今どきのCLI HTTPクライアントHTTPieのご紹介があった。
    • 標準でJSONを整形して表示してくれるのはありがたい

httpie.org

  • AWS summit / Civic Tech Forumの参加報告
    • Civic techによって解決してる事例は結構あるけど、その情報があまりない(検索しづらい?)のでカタログ的なサイトがあればいいのではという話
  • Promiseおよびasync/awaitのハマりポイント
    • どこで非同期処理を待つ(await)のか、同期処理との共存あたりの話だった
    • 以前Promiseのmapやシーケンス化についてcoというライブラリを使ってたけど、async/awaitが出てきてもう役割は終えたのかな
    • It is a stepping stone towards the async/await proposal.

github.com

懇親会

www.hotpepper.jp

こちらの中華料理屋で飲み食べ放題だった。中華料理の食べ放題って凄い。そういえば横浜中華街でも食べ放題コースあった気がするので中華料理屋業界では一般的なのかな?

食べるのに夢中になってしまい写真はこれだけ...w 店内でワールドカップ中継が流れてたので話に集中できませんでした。餃子は美味しかったけど黒酢があればもっと良かったなあ。